Best way to check if an iPhone app is running for the first time

后端 未结 7 1200
萌比男神i
萌比男神i 2020-11-28 22:19

I want to check if my iPhone app is running for the first time. I can create a file in the documents folder and check that file to see if this is the first time the app is r

相关标签:
7条回答
  • 2020-11-28 22:46

    Ok what confuses the hell out of me about User Defaults.

    WHERE are they stored?

    • you dont care it varies per iOS/Mac.
    • you just getVALUE by KEY
    • setVALUE by KEY + synchronize
    • iOS/Mac does the rest.

    This is the common use case: Checking for the existence of a value e.g firstRun. The first time it will NOT EXIST so usually followed by setting the value. 2nd Run - on next loop it does exist and other use case/else stmt is triggered

    ---- .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;
        //=============
    

    //NOTE IMPORTANT IF YOURE ROOTVIEWCONTROLLER checks appDelegate.firstRun then make sure you do the check above BEFORE setting self.window.rootViewController here

    self.window.rootViewController = self.navController;
    
    
        [self.window makeKeyAndVisible];
        return YES;
    }
    

    ---- USING THE FLAG

    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");
    }
    

    The examples above confused me a bit as they show how to check for it the first time but then mention how to 'check for it later' in the same comment. The problem is when we find it doesnt exist we immediately create it and synchronize. So checking for it late actually mean when you RESTART THE APP not in same run as first run.

    0 讨论(0)
提交回复
热议问题