检测iOS应用程序何时首次启动?

65

如何检测iOS应用程序首次启动?

7个回答

85

基本上和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")

在这种情况下,增加一个同步调用是一种良好的做法,可以立即保存数据。实际上,在实践中并不是必需的(至少在当前版本的操作系统中)。文档中有一个名为AppPrefs的示例。[[NSUserDefaults standardUserDefaults] synchronize]; - user213573
1
当应用程序被卸载时,与该应用程序相关的默认数据库条目是否被清除? - xyzzycoder
13
现在有了后台处理功能,当用户退出应用程序时通常不会调用-applicationWillTerminate:方法。相反,会调用-applicationWillResignActive方法。因此,在这两种方法中都应该设置firstLaunch变量。 - memmons
1
这样会不会创建一个循环,每次启动应用程序时都将firstLaunch设置为YES,从而使每次都是第一次启动? - TomLisankie
9
不行。-registerDefaults: 只有在它们的键不存在时才设置指定的值。 - Noah Witherspoon

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

1
我从未考虑过检测升级和降级。+1。 - fearmint
2
这真是一个很好的方式来跟踪版本。 - Ansari
这是一篇相当古老的帖子,但非常有用。我希望苹果公司能提供更好的方法来检测这些情况。 - Kiran S
如果您将此代码放入现有应用程序的v2.0中并将其发布到应用商店,然后用户从v1.0升级到v2.0,则它将表现为新安装。原因是v1.0没有这个代码,因此它将没有“prevStartupVersions”键。解决方法是发布一个什么都不做但安装此键的v1.1版本,然后发布带有上述代码的v2.0版本。 - Scott Allen
@ScottAllen 您是正确的,您的解决方案很简洁。当我处理这个问题时,我需要响应新版本的第一次安装。因此,它可以在已经安装或未安装的情况下工作,在这方面,它是否已经安装并不重要。但是,可能存在需要同时知道版本和是否为新安装的情况。 - rogermushroom
显示剩余3条评论

29

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


4

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

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

把这段代码放在视图控制器的awakeFromNib方法中,该方法会在应用程序启动时出现。我不知道其他答案是否适用于您的问题,但这是我解决它的方式。


2

如果您想在代码的其他地方检测应用程序是否首次启动,则此方法将无法正常工作。由于多任务处理,自iOS 4.0起,“applicationWillTerminate”将无效。

以下链接提供了一个很好的解决方案:http://mobiledevblog.metalcompass.com/?p=43


2

您可以在用户默认设置中设置布尔值来实现此操作。在调用registerDefaults:时将键设置为false,然后在显示初始帮助屏幕或其他需要完成的任务之后将其更改为true。

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


2
将其保存为用户偏好设置,例如had_first_launch,在启动时设置为true,它只会在第一次时为false...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接