最好的方法来检查一个iPhone应用程序是否第一次运行

我想检查我的iPhone应用程序是否第一次运行。 我可以在文档文件夹中创build一个文件,并检查该文件,看看这是否是第一次运行应用程序,但我想知道是否有更好的方法来做到这一点。

我喜欢使用NSUserDefaults来存储第一次运行的指示。

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

稍后您可以testing它…

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

好吧,什么混淆了我的关于用户默认。

他们在哪里储存?

  • 你不在乎它每iOS / Mac变化。
  • 您只需通过KEY获取VALUE
  • 通过KEY设置VALUE +同步
  • 其余的是iOS / Mac。

这是常见的用例:检查值的存在,例如firstRun。 第一次它不会出现,所以通常在设置值之后。 第二次运行 – 下一个循环它确实存在,其他用例/其他用例被触发

– – 。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; //============= 

//注意如果YOURE 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: eg set up password"); }else { NSLog(@"FPMyMusicScreenViewController: IS NOT FIRST RUN - Prompt for password"); } 

上面的例子让我有点困惑,因为他们展示了如何首次检查它,然后提到如何在相同的评论中检查它。 问题是,当我们发现它不存在,我们立即创build并同步。 所以,迟到检查实际上意味着当您重新启动应用程序不在第一次运行相同的运行。

在您的应用程序委托中注册一个默认值:

 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]; } 

你可以用下面的静态方法来实现它。 我认为这是更好的,因为你可以多次调用这个方法,不像其他的解决scheme。 享受:(请记住,它不是线程安全的)

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

您可以使用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 } 

使用NSUserDefaults。 如果sharedDefault有一个你的应用程序的键,它运行之前。 当然,你必须让应用程序在第一次运行应用程序时创build至less一个默认条目。

迅速:

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

另一个提示:

当使用NSUserDefaults,这些设置将被删除,如果应用程序被删除。 如果由于某些原因您需要这些设置仍然存在,您可以将它们存储在钥匙串中。