2008-11-21 81 views

回答

80

差不多就是马克和克里斯说,虽然我更喜欢更改值当应用程序退出时,以防需要了解该应用程序的多个区域。 在代码:

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

卸载应用程序时,与应用程序关联的默认数据库中的条目是否已被刷新? – xyzzycoder 2009-12-29 22:15:32

+1

@xyzzycoder:是 – 2010-01-29 13:02:57

2

您可以在用户的​​默认设置中设置一个布尔值来做到这一点。当您拨打registerDefaults:时将该键设置为false,然后将其设置为true,在您显示初始帮助屏幕或您需要执行的任何操作后,将其更改为true。

如果您在应用程序关闭后始终保存一个持久数据文件,检查它是否存在是另一种方式。

2

保存它作为一个user preference,如had_first_launch,设置为在启动时属实,这将只能是第一次假...

29

我通常使用的应用程序的版本号,而不是在用户默认值firstLaunch值布尔值。这样,您可以区分第一次启动新安装和第一次启动升级。可能会在未来的版本有用...

59

我意识到这个问题是相当古老的,但我用它来想出一个方法检测第一次启动后“全新安装”(第一次启动后升级/降级),并认为我会在未来的观众分享代码,以防万一它有帮助。

// 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"]; 
} 
else 
{ 
    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]; 
2

如果您希望在代码的其他位置检测到它的第一次启动,它将无法正常工作。由于多任务处理,“applicationWillTerminate”在iOS 4.0中无法使用。 此链接提供了一个很好的解决方案: http://mobiledevblog.metalcompass.com/?p=43

4

这是一个非常简单快捷,但我发现,NSUserDefault键值对的总是空的第一次运行一个应用程序,所以

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

,并把这个代码在应用程序启动时显示的视图控制器的awakeFromNib中。我不知道其他答案是否适用于您的问题,但这是我解决问题的方式。

相关问题