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

时间:2009-11-02 22:37:14

标签: iphone iphone-sdk-3.0

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

7 个答案:

答案 0 :(得分:69)

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

答案 1 :(得分:8)

好吧,让我感到困惑的是用户默认值。

它们存放在哪里?

  • 你不在乎它因iOS / Mac而异。
  • 你只需按KEY
  • 获取
  • 通过KEY + synchronize的setVALUE
  • iOS / Mac完成剩下的工作。

这是常见用例: 检查是否存在值,例如firstRun。 第一次它不会存在,所以通常接着设置值。 第二轮 - 在下一个循环中它确实存在并且触发了其他用例/ else 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");
}

上面的例子让我感到困惑,因为他们第一次展示了如何检查它,但后来又提到了如何在同一评论中“检查它”。 问题是,当我们发现它不存在时,我们立即创建并同步。 因此,检查它的时间实际上意味着当您重新启动APP而不是与首次运行相同的运行时。

答案 2 :(得分:5)

在您的app appate中注册一个默认值:

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

答案 3 :(得分:4)

您可以使用下面的静态方法实现它。我认为它更好,因为你可以随意调用这个方法,与其他解决方案不同。享受:(请记住它不是线程安全的)

+ (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 :(得分:2)

您可以使用自定义类别方法isFirstLaunch with UIViewController + FirstLaunch。

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

答案 5 :(得分:1)

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

答案 6 :(得分:0)

夫特:

crmParam

另一个提示:

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