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

问题描述:

我想检查我的iPhone应用程序是否第一次运行。我可以在文档文件夹中创建一个文件并检查该文件,看看这是否是第一次运行该应用程序,但我想知道是否有更好的方法来执行此操作。检查iPhone应用程序是否第一次运行的最佳方法

我喜欢使用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... 
} 
+2

在哪里测试?在应用程序确实完成发射方法?? – prajakta 2010-12-17 12:32:55

+0

你会把它放在'applicationDidFinishLaunchingWithOptions'吗? – 2013-10-11 12:12:06

+0

如果它备份到云端,它还能工作吗? – 2014-09-21 00:55:56

在您的应用程序委托注册了一个默认值:您要检查它

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

不应该在if..stmt中将FirstLaunch设置为NO,因此它不会在下一个应用程序迭代中运行? – 2012-03-20 11:16:31

+0

@brian.clear,只有当你不需要确认用户看到你想要显示的内容,没有初始化来执行/确认等等。例如,在我的情况下,第一次运行时,我想用户确认他们看到教程或选择跳过它,而不是点击打开,然后锁定他们的手机,最终我的应用程序被推出内存。可能听起来并不常见,但我在无数次排队等候下载新应用程序时做过很多次,第一次启动应用程序,然后立即锁定我的电话,这是我的转机。那么,取决于用例。合理? – thephatp 2014-06-29 19:40:00

使用NSUserDefaults。如果sharedDefault有一个适用于您的应用程序的键,则它会在之前运行。当然,您必须让应用程序在第一次运行应用程序时创建至少一个默认条目。

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

它们存储在哪里?

  • 你不在乎它根据iOS/Mac变化。
  • 你只是KEY
  • SETVALUE的GetValue由KEY +同步
  • 的iOS/Mac上没有休息。

这是常见用例: 检查是否存在值,例如firstRun。 第一次不会存在,因此通常会设置值。 第2轮 - 在下一循环它确实存在,和其他使用案例/其他语句被触发

---- .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然后确保你做次上述E检查之前,这里设置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"); 
} 

上面的例子弄得我有点为他们展示如何检查它的第一次但随后提到如何在同一评论中“稍后检查”。 问题是,当我们发现它不存在,我们立即创建并同步。 因此,检查延迟实际上意味着当您重新启动应用程序与第一次运行不同步时。

+0

什么是从iPhone模拟器清除存储的正确方法(这些“默认值”)? – 2013-10-30 01:35:39

+0

唯一的解决方案为我工作,谢谢! – 2014-04-21 13:10:57

+0

默认情况下,boolForKey将返回false,字符串将为零等。 如果要初始化用户默认值,只需使用registerDefaults,并使用您想要使用的键和值。如果你想初始化一个日期,可以使用[NSDate distantFuture] – shim 2014-05-06 23:53:05

您可以使用下面的静态方法实现它。我认为这样比其他解决方案更好,因为您可以多次调用此方法。享受:(记住,它不是线程安全的保留)

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

斯威夫特:

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

另一个秘诀:

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