65

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

4

7 回答 7

84

几乎是 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"];

斯威夫特 5.0

// -applicationDidFinishLaunching:
UserDefaults.standard.register(defaults: ["firstLaunch":true])
// to check it:
UserDefaults.standard.bool(forKey: "firstLaunch")
// -applicationWillTerminate:
UserDefaults.standard.set(false, forKey: "firstLaunch")
于 2008-11-21T13:59:46.787 回答
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];
于 2010-07-21T14:32:24.570 回答
29

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

于 2008-11-22T11:12:59.103 回答
4

这是一个非常简单的快捷方式,但我发现 NSUserDefault 键值对在您第一次运行应用程序时始终为 NULL,所以

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

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

于 2012-05-05T08:08:44.770 回答
2

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

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

于 2008-11-21T13:55:37.903 回答
2

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

于 2008-11-21T13:56:03.550 回答
2

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

于 2011-06-04T15:27:01.123 回答