Detect when an iOS app is launched for the first time?

How do I detect when an iOS app is launched for the first time?


Pretty much what Marc and Chris said, though I prefer to change the value when the app quits in case there're multiple areas of the application that need to know about it. In code:

// -applicationDidFinishLaunching:
[[NSUserDefaults standardUserDefaults] registerDefaults:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES],@"firstLaunch",nil]];
// to check it:
[[NSUserDefaults standardUserDefaults] boolForKey:@"firstLaunch"];
// -applicationWillTerminate:
[[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"firstLaunch"];

I realize this question is quite old, but I used it to come up with one method of detecting the first startup after a "fresh install" (vs. first startup after an upgrade/downgrade) and thought I'd share the code here for future viewers in case it's helpful.

// Get current version ("Bundle Version") from the default Info.plist file
NSString *currentVersion = (NSString*)[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"];
NSArray *prevStartupVersions = [[NSUserDefaults standardUserDefaults] arrayForKey:@"prevStartupVersions"];
if (prevStartupVersions == nil) 
    // Starting up for first time with NO pre-existing installs (e.g., fresh 
    // install of some version)
    [self firstStartAfterFreshInstall];
    [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObject:currentVersion] forKey:@"prevStartupVersions"];
    if (![prevStartupVersions containsObject:currentVersion]) 
        // Starting up for first time with this version of the app. This
        // means a different version of the app was alread installed once 
        // and started.
        [self firstStartAfterUpgradeDowngrade];
        NSMutableArray *updatedPrevStartVersions = [NSMutableArray arrayWithArray:prevStartupVersions];
        [updatedPrevStartVersions addObject:currentVersion];
        [[NSUserDefaults standardUserDefaults] setObject:updatedPrevStartVersions forKey:@"prevStartupVersions"];

// Save changes to disk
[[NSUserDefaults standardUserDefaults] synchronize];

I normally use the app version number instead of a boolean for the firstLaunch value in user defaults. That way, you can distinguish between the first launch of a new install and the first launch of an upgrade. May be useful in future versions...

This is a really simple shortcut but I found that NSUserDefault key value pairs are always NULL the first time you run an app so

// Check to see if its the first time
if ([[NSUserDefaults standardUserDefaults] valueForKey:@"firstTime"] == NULL) {
   [[NSUserDefaults standardUserDefaults] setValue:@"Not" forKey:@"firstTime"];

and place this code in the awakeFromNib of the view controller that appears when your application launches. I don't know if any of the other answers work for your problem, but this is the way I solved it.

You can set a boolean value in the user defaults to do this. Set the key to false when you call registerDefaults:, and then set it to true change it to true after you've shown your initial help screen or whatever you need to do.

If you have a persistent data file that's always saved after the app closes, checking to see if it exists would be another way.

Save it as a user preference, eg had_first_launch, set to true on startup, it will only be false on the first time...

This will not work properly if you want to detect during other places of the code if its first launch. The "applicationWillTerminate" will not work from iOS 4.0 due to multitasking. this link provides a good solution:

Need Your Help

Convenient way to see what's new in remote repositories?

git git-remote git-status

In Git, I'd like to be able to see, at a glance, whether my repository and working directory are out of date. I often make the mistake of just running "git status" - but that doesn't do any remote

Array filter vs. Core Data pull performance

ios objective-c uitableview core-data uisegmentedcontrol

I'm wondering about the performance differences between two different methods of data filtering. Here's what I'm working with: