如何检测iOS应用程序首次启动?
基本上和Marc和Chris说的一样,不过我更喜欢在应用程序退出时更改值,以防有多个应用程序区域需要知道它。
Objective-C
// -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"];
Swift 5.0
// -applicationDidFinishLaunching:
UserDefaults.standard.register(defaults: ["firstLaunch":true])
// to check it:
UserDefaults.standard.bool(forKey: "firstLaunch")
// -applicationWillTerminate:
UserDefaults.standard.set(false, forKey: "firstLaunch")
我知道这个问题相当老了,但我用它来想出了一种检测“全新安装”后第一次启动(而不是升级/降级后的第一次启动)的方法,并且想在这里分享代码,以便未来查看者在有用的情况下。
// 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];
我通常在用户默认设置中使用应用程序版本号而不是布尔值作为firstLaunch值。这样,您可以区分新安装的第一次启动和升级的第一次启动。在未来的版本中可能会有用...
这是一个非常简单的快捷方式,但我发现第一次运行应用程序时,NSUserDefault键值对总是为空。
// Check to see if its the first time
if ([[NSUserDefaults standardUserDefaults] valueForKey:@"firstTime"] == NULL) {
[[NSUserDefaults standardUserDefaults] setValue:@"Not" forKey:@"firstTime"];
}
把这段代码放在视图控制器的awakeFromNib方法中,该方法会在应用程序启动时出现。我不知道其他答案是否适用于您的问题,但这是我解决它的方式。
如果您想在代码的其他地方检测应用程序是否首次启动,则此方法将无法正常工作。由于多任务处理,自iOS 4.0起,“applicationWillTerminate”将无效。
以下链接提供了一个很好的解决方案:http://mobiledevblog.metalcompass.com/?p=43
您可以在用户默认设置中设置布尔值来实现此操作。在调用registerDefaults:
时将键设置为false,然后在显示初始帮助屏幕或其他需要完成的任务之后将其更改为true。
如果您有一个始终在应用程序关闭后保存的持久数据文件,则检查其是否存在是另一种方法。
[[NSUserDefaults standardUserDefaults] synchronize];
- user213573-applicationWillTerminate:
方法。相反,会调用-applicationWillResignActive
方法。因此,在这两种方法中都应该设置firstLaunch
变量。 - memmons-registerDefaults:
只有在它们的键不存在时才设置指定的值。 - Noah Witherspoon