【问题标题】:Detect when an iOS app is launched for the first time? [closed]检测首次启动 iOS 应用程序的时间? [关闭]
【发布时间】:2010-09-23 10:57:31
【问题描述】:

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

【问题讨论】:

    标签: ios cocoa-touch launching-application


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      另存为user preference,例如had_first_launch,启动时设置为true,只有第一次为false...

      【讨论】:

        【解决方案3】:

        与 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];
        • 卸载应用程序时是否刷新了默认数据库中与应用程序关联的条目?
        • 现在可以使用后台,当用户退出应用程序时通常不会调用-applicationWillTerminate:。而是调用-applicationWillResignActive。所以 firstLaunch 应该在这两个方法中设置。
        • 这不会创建一个循环,每次启动应用程序时都会将 firstLaunch 设置为 YES,每次首次启动时都会设置?
        • 不。 -registerDefaults: 仅在其键不存在时设置指定的值。
        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          我意识到这个问题已经很老了,但我用它提出了 one 方法来检测“全新安装”后的第一次启动(与升级/降级后的第一次启动相比)并认为我会在这里为未来的观众分享代码以防万一。

          // 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。
          • 它确实是跟踪版本的好方法。
          • 但是如果应用程序的第一个版本已经在应用商店中,这不起作用,是吗?
          • @swalkner 不明白为什么
          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

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

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-11-19
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多