web-dev-qa-db-ja.com

iPhoneアプリが初めて実行されているかどうかを確認するための最良の方法

IPhoneアプリが初めて実行されているかどうかを確認したい。ドキュメントフォルダーにファイルを作成し、そのファイルをチェックして、アプリが初めて実行されるかどうかを確認できますが、これを行うためのより良い方法があるかどうかを知りたいと思いました。

32
iosdevnyc

NSUserDefaultsを使用して、最初の実行の指示を保存するのが好きです。

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];  
if (![defaults objectForKey:@"firstRun"])
  [defaults setObject:[NSDate date] forKey:@"firstRun"];

[[NSUserDefaults standardUserDefaults] synchronize];

その後、後でテストできます...

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];        
if([defaults objectForKey:@"firstRun"])           
{
  // do something or not...
}
69
paulthenerd

わかりました。ユーザーのデフォルトについて私を混乱させるものは何ですか。

それらはどこに保存されますか?

  • iOS/Macごとに異なることを気にしないでください。
  • kEYでVALUEを取得するだけです
  • kEYによるsetVALUE +同期
  • iOS/Macが残りを行います。

これは一般的な使用例です。firstRunなどの値の存在を確認します。初めて存在しないので、通常は値を設定します。 2回目の実行-次のループでそれが存在し、他のユースケース/その他のstmtがトリガーされます

---- .h

@interface MyAppDelegate : UIResponder <UIApplicationDelegate>

//flag to denote if this is first time the app is run
@property(nonatomic) BOOL firstRun;

------ .m

@implementation MyAppDelegate

@synthesize firstRun = _firstRun;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

    //============== 
    //Check to see if this is first time app is run by checking flag we set in the defaults

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];  

    if (![defaults objectForKey:@"firstRun"]){
        //flag doesnt exist then this IS the first run
        self.firstRun = TRUE;
        //store the flag so it exists the next time the app starts
        [defaults setObject:[NSDate date] forKey:@"firstRun"];
    }else{
        //flag does exist so this ISNT the first run
        self.firstRun = FALSE; 
    }        
    //call synchronize to save default - where its saved is managed by iOS - varies by device and iOS/Mac
    [[NSUserDefaults standardUserDefaults] synchronize];
    //TO TEST: delete the app on the device/simulator
    //run it - should be the first run
    //close it - make sure you kill it and its not just in the background else didFinishLaunchingWithOptions wont be called
    //just applicationDidBecomeActive
    //2nd run it should  self.firstRun = FALSE;
    //=============

// ROOTVIEWCONTROLLERがappDelegate.firstRunをチェックする場合は重要です。次に、ここでself.window.rootViewControllerを設定する前に、上記のチェックを必ず実行してください。

self.window.rootViewController = self.navController;


    [self.window makeKeyAndVisible];
    return YES;
}

----フラグの使用

MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];

if (appDelegate.firstRun){
    NSLog(@"IS FIRST RUN - Do something: e.g. set up password");

}else {
     NSLog(@"FPMyMusicScreenViewController: IS NOT FIRST RUN - Prompt for password");
}

上記の例は、最初にチェックする方法を示しているので少し混乱しましたが、同じコメントで「後でチェックする」方法について言及しています。問題は、それが存在しないことがわかった場合、すぐに作成して同期することです。したがって、遅くチェックするということは、実際には、最初の実行と同じ実行ではなく、アプリを再起動することを意味します。

8
brian.clear

アプリデリゲートにデフォルト値を登録します。

NSDictionary *defaultsDict = 
[[NSDictionary alloc] initWithObjectsAndKeys:[NSNumber numberWithBool:YES], @"FirstLaunch", nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:defaultsDict];
[defaultsDict release];

次に、それを確認したい場所:

NSUserDefaults *sharedDefaults = [NSUserDefaults standardUserDefaults];
if ([sharedDefaults boolForKey:@"FirstLaunch"]) {
  //Do the stuff you want to do on first launch
  [sharedDefaults setBool:NO forKey:@"FirstLaunch"];
  [sharedDefaults synchronize];
}
5
Louis Gerbarg

以下のstaticメソッドで実装できます。他のソリューションとは異なり、このメソッドは何度でも呼び出すことができるので、より良いと思います。楽しむ:(スレッドセーフではないことに注意してください)

+ (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;
}
4
Mati Bot

UIViewController + FirstLaunchでカスタムカテゴリメソッドisFirstLaunchを使用できます。

- (BOOL)isFirstLaunch
{
    if ([[NSUserDefaults standardUserDefaults] boolForKey:@"kFirstLaunch"]) {
        return YES;
    }
    else {
        [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"kFirstLaunch"];
        [[NSUserDefaults standardUserDefaults] synchronize];
        return NO;
    }
}

そして、コントローラーで使用する必要がある場合

BOOL launched = [self isFirstLaunch];

if (launched) {
//if launched
}
else {
//if not launched
}
2
superarthur.io

NSUserDefaultsを使用します。 sharedDefaultにアプリのキーがある場合、その前に実行されます。もちろん、アプリを最初に実行するときに、アプリに少なくとも1つのデフォルトエントリを作成させる必要があります。

1
TechZen

迅速:

var isFirstLaunch: Bool {
    get {
        if (NSUserDefaults.standardUserDefaults().objectForKey("firstLaunchDate") == nil) {
            NSUserDefaults.standardUserDefaults().setObject(NSDate(), forKey: "firstLaunchDate")
            NSUserDefaults.standardUserDefaults().synchronize()
            return true
        }
        return false
    }
}

別のヒント:

NSUserDefaultsを使用している場合、アプリが削除されると、これらの設定は消去されます。何らかの理由でこれらの設定を引き続き使用する必要がある場合は、キーチェーンに保存できます。

0
Beau Nouvelle