iPhoneでアプリの初回起動を検出する方法


回答:


386
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    if (![[NSUserDefaults standardUserDefaults] boolForKey:@"HasLaunchedOnce"])
    {
        [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"HasLaunchedOnce"];
        [[NSUserDefaults standardUserDefaults] synchronize];
    }
    return YES;
}

メソッドがブール値を返さないため、エラーが発生します。return 0を使用すると、失敗したエラーを強制終了します。
mrEmpty 2013年

@mrEmpty 1. ??? 戻りますBOOL。2.次に、コードにエラーがあります... 0を返すとこのクラッシュが発生する場合、何かがひどく間違っています-他の場所で。

@ H2CO3- NSUserDefaults一般的な場所ではありませんか?別のアプリケーションが使用しているのと同じ「キー」を使用している場合はどうなりますか?
Ziv Levy

6
@ZivLevyいいえ、ユーザーのデフォルトは、サンドボックスごと(=アプリケーションごと)にプロパティリストに保存されます。

2
これまでに送信したことのない新しいアプリでのみ機能します。
Elad

36

スウィフト3、図4は、この方法を試してください。

func isAppAlreadyLaunchedOnce()->Bool{
        let defaults = UserDefaults.standard

        if let isAppAlreadyLaunchedOnce = defaults.string(forKey: "isAppAlreadyLaunchedOnce"){
            print("App already launched : \(isAppAlreadyLaunchedOnce)")
            return true
        }else{
            defaults.set(true, forKey: "isAppAlreadyLaunchedOnce")
            print("App launched first time")
            return false
        }
    }

スウィフト2、これを試してみてください

func isAppAlreadyLaunchedOnce()->Bool{
    let defaults = NSUserDefaults.standardUserDefaults()

    if let isAppAlreadyLaunchedOnce = defaults.stringForKey("isAppAlreadyLaunchedOnce"){
        print("App already launched : \(isAppAlreadyLaunchedOnce)")
        return true
    }else{
        defaults.setBool(true, forKey: "isAppAlreadyLaunchedOnce")
        print("App launched first time")
        return false
    }
}

UPDATE: -のためにOBJ-C私はこれを使用して、

+ (BOOL)isAppAlreadyLaunchedOnce {
    if ([[NSUserDefaults standardUserDefaults] boolForKey:@"isAppAlreadyLaunchedOnce"])
    {
        return true;
    }
    else
    {
        [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"isAppAlreadyLaunchedOnce"];
        [[NSUserDefaults standardUserDefaults] synchronize];
        return false;
    }
}

OBJ-Cの参照:https : //stackoverflow.com/a/9964400/3411787


32

私はこの目的のために小さなライブラリを書きました。これにより、今回が初めてのリリースなのか、このバージョンだけのリリースなのか、ユーザーがインストールした過去のバージョンなのかがわかります。githubでApache 2ライセンスの下にcocoapodとして利用できます:GBVersionTracking

あなたはこれを呼び出すだけです application:didFinishLaunching:withOptions:

[GBVersionTracking track];

そして、これが最初の起動かどうかを確認するには、これをどこかに呼び出します。

[GBVersionTracking isFirstLaunchEver];

そして同様に:

[GBVersionTracking isFirstLaunchForVersion];

[GBVersionTracking currentVersion];
[GBVersionTracking previousVersion];
[GBVersionTracking versionHistory];

1
これはほぼ完璧です!GBToolboxの依存関係とpodspecがなければ素晴らしいでしょう。
StianHøiland2013年

4
@StianHøilandGBToolboxの依存関係はなくなり、ライブラリにはpodspec(CocoaPods仕様リポジトリに公開)が付属しています。
lms 2014年

9

Swift 3.0-Swift 5

拡張子を追加

    extension UIApplication {
        class func isFirstLaunch() -> Bool {
            if !UserDefaults.standard.bool(forKey: "hasBeenLaunchedBeforeFlag") {
                UserDefaults.standard.set(true, forKey: "hasBeenLaunchedBeforeFlag")
                UserDefaults.standard.synchronize()
                return true
            }
            return false
        }
    }

あなたのコードで

UIApplication.isFirstLaunch()

8

Xcode 7とSwift 2.0のもう1つのアイデアは、拡張機能を使用することです

extension NSUserDefaults {
    func isFirstLaunch() -> Bool {
        if !NSUserDefaults.standardUserDefaults().boolForKey("HasAtLeastLaunchedOnce") {
            NSUserDefaults.standardUserDefaults().setBool(true, forKey: "HasAtLeastLaunchedOnce")
            NSUserDefaults.standardUserDefaults().synchronize()
            return true
        }
        return false
    }
}

アプリのどこにでも書けるようになりました

if NSUserDefaults.standardUserDefaults().isFirstLaunch() {
    // do something on first launch
}

私は個人的には次のようなUIApplicationの拡張を好みます:

extension UIApplication {
    class func isFirstLaunch() -> Bool {
        if !NSUserDefaults.standardUserDefaults().boolForKey("HasAtLeastLaunchedOnce") {
            NSUserDefaults.standardUserDefaults().setBool(true, forKey: "HasAtLeastLaunchedOnce")
            NSUserDefaults.standardUserDefaults().synchronize()
            return true
        }
        return false
    }
}

関数呼び出しがより説明的であるため:

if UIApplication.isFirstLaunch() {
    // do something on first launch
}

8

以下の静的メソッドを使用して実装できます。

+ (BOOL)isFirstTime{
    static BOOL flag=NO;
    static BOOL result;

    if(!flag){
        if ([[NSUserDefaults standardUserDefaults] boolForKey:@"hasLaunchedOnce"]){
            result=NO;
        }else{
            [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"hasLaunchedOnce"];
            [[NSUserDefaults standardUserDefaults] synchronize];
            result=YES;
        }

        flag=YES;
    }
    return result;
}

このメソッドをスレッドセーフにするには、このメソッドをロックする必要があることに注意してください。
マティボット2013年

9
私は知っていますが、この方法はそうではありません。2スレッドは、フラグがNOの場合、if(!flag){に到達できます。それらはifブロック内に入ります。それらの1つは内部のelseに到達してNSUserDefaultsを設定し、2つ目は「hasLaunchOnce」を渡し(最初のスレッドがそれを宣言したため)、結果をNOに設定します。つまり、間違った値を取得する可能性があります。
マティボット2013年

5

起動時に何かを保存し、それが存在するかどうかを確認する必要があります。そうでなければ、それは初めてです。「何か」は、ファイル、データベースエントリ、ユーザーデフォルトの設定などです。


4

これを行うのは非常に簡単で、必要なコードは6行だけです。

このコードをアプリケーションの起動設定など、アプリケーションが初めて実行されたかどうかをテストする必要がある場所に追加すると便利です。

//These next six lines of code are the only ones required! The rest is just running      code when it's the first time.
//Declare an integer and a default.
NSUserDefaults *theDefaults;
int  launchCount;
//Set up the properties for the integer and default.
theDefaults = [NSUserDefaults standardUserDefaults];
launchCount = [theDefaults integerForKey:@"hasRun"] + 1;
[theDefaults setInteger:launchCount forKey:@"hasRun"];
[theDefaults synchronize];

//Log the amount of times the application has been run
NSLog(@"This application has been run %d amount of times", launchCount);

//Test if application is the first time running
if(launchCount == 1) {
    //Run your first launch code (Bring user to info/setup screen, etc.)
    NSLog(@"This is the first time this application has been run";
}

//Test if it has been run before
if(launchCount >= 2) {
    //Run new code if they have opened the app before (Bring user to home screen etc.
    NSLog(@"This application has been run before);
}

PS 設定でブール値を使用しないでください整数に固執するだけです。未定義の場合、デフォルトでゼロになります。

また、[theDefaults synchronize];ラインは必須ではありませんが、アプリが数百のデバイスにわたって数百回実行された場合、結果が常に信頼できるとは限らないことに加えて、より良い方法であることがわかりました。


あなたの例は機能しますが、OPが要求するのは、それが最初の開始かどうかだけです。これにはboolで十分です。ユーザーがアプリを開いた回数を知りたい場合、このコードは意味があります。
ティロ2013

3

ブールキーをNSUserDefaultsに初めて保存すると、それがnoになり、yesに変更して、アプリを削除または再インストールするまで、最初と同じように保持します。


3

素早く簡単な機能

- (BOOL) isFirstTimeOpening {
    NSUserDefaults *theDefaults = [NSUserDefaults standardUserDefaults];
    if([theDefaults integerForKey:@"hasRun"] == 0) {
        [theDefaults setInteger:1 forKey:@"hasRun"];
        [theDefaults synchronize];
        return true;
    }
    return false;
}

3

Xcode 7のSwift 2.0の場合。AppDelegate.swiftファイルで:

import UIKit

@UIApplicationMain

class AppDelegate: UIResponder, UIApplicationDelegate {

var window: UIWindow?

func application(application: UIApplication, willFinishLaunchingWithOptions launchOptions: [NSObject : AnyObject]?) -> Bool
{
    return true
}


func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool
{
    didFinishLaunchingOnce()
    return true
}

func didFinishLaunchingOnce() -> Bool
{
    let defaults = NSUserDefaults.standardUserDefaults()

    if let hasBeenLauncherBefore = defaults.stringForKey("hasAppBeenLaunchedBefore")
    {
        //print(" N-th time app launched ")
        return true
    }
    else
    {
        //print(" First time app launched ")
        defaults.setBool(true, forKey: "hasAppBeenLaunchedBefore")
        return false
    }
}

}

2

迅速

struct Pref {
    static let keyFirstRun = "PrefFirstRun"
    static var isFirstRun: Bool {
        get {
            return UserDefaults.standard.bool(forKey: keyFirstRun)
        }
        set {
            UserDefaults.standard.set(newValue, forKey: keyFirstRun)
        }
    }
}

アプリの起動時にデフォルト値を登録します。

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

        let prefs: [String:Any] = [
            Pref.keyFirstRun: true
            ...
        ]

        UserDefaults.standard.register(defaults: prefs)

アプリ終了時の明確な価値:

func applicationWillTerminate(_ application: UIApplication) {
        Pref.isFirstRun = false

チェック値:

 if Pref.isFirstRun {
    ... do whatever 

2

迅速に、私はAppデリゲートの上などのスコープの外で非常に簡単に実行できるグローバル定数を使用することをお勧めします。したがって、アプリが終了されない限り、正しい値に設定されます。アプリがバックグラウンドに移行した場合でも、同じ値を返します。この値は、アプリが完全に再起動された場合にのみ変更されます。

let isFirstLaunch: Bool = {
    if !UserDefaults.standard.bool(forKey: "hasBeenLaunchedBeforeFlag") {
        UserDefaults.standard.set(true, forKey: "hasBeenLaunchedBeforeFlag")
        UserDefaults.standard.synchronize()
        return true
    }
    return false
}()

しかし正直なところ、アプリが少なくとも1回はバックグラウンドに送信されているという事実を追跡することをお勧めします。そのような場合は、UIApplicationで拡張機能を使用し、applicationDidEnterBackgroundメソッドで次のようにフラグを設定することを好みます。

extension UIApplication {
    private static let isFirstLaunchKey = "isFirstLaunchKey"
    static var isFirstLaunch: Bool {
        return !UserDefaults.standard.bool(forKey: isFirstLaunchKey)
    }
    static func didEnterBackground() {
        if isFirstLaunch {
            UserDefaults.standard.set(true, forKey: isFirstLaunchKey)
            UserDefaults.standard.synchronize()
        }
    }
}

そして、あなたのアプリデリゲートまたはシーンデリゲートで

func sceneDidEnterBackground(_ scene: UIScene) {
        UIApplication.didEnterBackground()
    }


2

XCode 11Swift 5用に更新

extension UIApplication {
  func isFirstLaunch() -> Bool {
    if !UserDefaults.standard.bool(forKey: "HasLaunched") {
      UserDefaults.standard.set(true, forKey: "HasLaunched")
      UserDefaults.standard.synchronize()
      return true
  }
  return false
}

次に、あなたはそれを

UIApplication.isFirstLaunch()

0

NSUserDefaults +マクロ

最善の方法はNSUserDefaultsBOOL変数を使用して保存することです。上記のように、次のコードは問題なく動作します。

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setObject:[NSNumber numberWithBool:true] forKey:@"~applicationHasLaunchedBefore"];
[userDefaults synchronize];

以下のようにマクロを作成して、最初の起動かどうかを簡単に確認することもできます

#define kApplicationHasLaunchedBefore [[NSUserDefaults standardUserDefaults] objectForKey:@"~applicationHasLaunchedBefore"]

次にそのまま使用します

if (kApplicationHasLaunchedBefore) {
    //App has previously launched
} else {
    //App has not previously launched
}

0

これはSwift 5.0で動作する答えです。@Zaid Pathanの回答と比較した改善点は、隠された契約がないことです。呼び出す前setFirstAppLaunch()1回だけ呼び出さないとisFirstAppLaunch()、アサーションエラーが発生します(デバッグモードのみ)。

fileprivate struct _firstAppLaunchStaticData {
    static var alreadyCalled = false
    static var isFirstAppLaunch = true
    static let appAlreadyLaunchedString = "__private__appAlreadyLaunchedOnce"
}

func setFirstAppLaunch() {
    assert(_firstAppLaunchStaticData.alreadyCalled == false, "[Error] You called setFirstAppLaunch more than once")
    _firstAppLaunchStaticData.alreadyCalled = true
    let defaults = UserDefaults.standard

    if defaults.string(forKey: _firstAppLaunchStaticData.appAlreadyLaunchedString) != nil {
        _firstAppLaunchStaticData.isFirstAppLaunch = false
    }
    defaults.set(true, forKey: _firstAppLaunchStaticData.appAlreadyLaunchedString)
}

func isFirstAppLaunch() -> Bool {
    assert(_firstAppLaunchStaticData.alreadyCalled == true, "[Error] Function setFirstAppLaunch wasn't called")
    return _firstAppLaunchStaticData.isFirstAppLaunch
}

次にsetFirstAppLaunch()、アプリケーションの開始時と、アプリケーションisFirstAppLaunch()が呼び出されたかどうかを確認したいときに、関数を呼び出す必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.