【问题标题】:How to detect Apps first launch in iOS?如何检测应用程序在 iOS 中首次启动?
【发布时间】:2014-11-09 16:19:26
【问题描述】:

我想在用户第一次打开我的应用程序时显示一个欢迎屏幕。有什么方法可以在 Swift 中检查应用的首次启动?

【问题讨论】:

    标签: ios swift launch


    【解决方案1】:

    Swift 4 及更高版本

    您可以在任何地方使用它来验证用户是否是第一次看到此视图。

    func isAppAlreadyLaunchedOnce() -> Bool {
        let defaults = UserDefaults.standard
        if let _ = defaults.string(forKey: "isAppAlreadyLaunchedOnce") {
            print("App already launched")
            return true
        } else {
            defaults.set(true, forKey: "isAppAlreadyLaunchedOnce")
            print("App launched first time")
            return false
        }
    }
    

    注意:用户重新安装应用并首次启动后,此方法将返回false

    【讨论】:

    • 如果您在应用程序中的多个位置请求它,那么它将为第二个和后续请求返回 TRUE,尽管它实际上可能是第一次运行。最好使用启动计数器。
    • 什么是启动计数器方法?
    • 我猜@VyacheslavBakinkskiy 的意思是使用 Int 而不是保存布尔值,所以你知道应用程序实际启动了多少次。
    【解决方案2】:

    在 Swift 2 及以下版本中试试这个

    func isAppAlreadyLaunchedOnce()->Bool{
        let defaults = NSUserDefaults.standardUserDefaults()
    
        if let isAppAlreadyLaunchedOnce = defaults.stringForKey("isAppAlreadyLaunchedOnce"){
            println("App already launched")
            return true
        }else{
            defaults.setBool(true, forKey: "isAppAlreadyLaunchedOnce")
            println("App launched first time")
            return false
        }
    }
    

    【讨论】:

    • 这个函数的原始版本可能在它应该返回false时返回true,反之亦然;我不知道;在 XCode 9 Beta(对于 Swift 4)中使用它,编辑器提出了更新的名称和逻辑建议,导致了这种情况。
    • 感谢@AlexHall 指出,将更新 func 使其正常工作。
    【解决方案3】:

    由于卸载应用时会删除应用的 NSUserDefaults,因此您可以尝试在应用启动时测试某个值是否存在。

    如果该值存在,则该应用已安装。如果不是,这是应用程序第一次启动,您需要设置该值。

    【讨论】:

      【解决方案4】:

      斯威夫特:

      let launchedBefore = UserDefaults.standard.bool(forKey: "launchedBefore")
      if launchedBefore  {
          print("Not first launch.")
      } else {
          print("First launch, setting UserDefault.")
          UserDefaults.standard.set(true, forKey: "launchedBefore")
      }
      

      目标 - C:

      if ([[NSUserDefaults standardUserDefaults] boolForKey:@"isAppAlreadyLaunchedOnce"])
      {
          return true;
      }
      else
      {
          [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"isAppAlreadyLaunchedOnce"];
          [[NSUserDefaults standardUserDefaults] synchronize];
          return false;
      }
      

      【讨论】:

      • 不要使用-[NSUserDefaults synchronize]。来自Apple's documentation“这个方法是不必要的,不应该使用。”
      【解决方案5】:

      我经常发现userDefault 无法访问,因为我的应用程序中有一些bugs for Apples data protection 政策,所以我改变了我的策略以检测以下首次启动

      if ( fileExists( dummyFilePath ) == NO ) {
          createFileAt( dummyFilePath )
          // This is first launch
      }
      

      【讨论】:

        【解决方案6】:

        斯威夫特 5

        let launchedBefore = UserDefaults.standard.bool(forKey: "launchedBefore") 
           
        if launchedBefore {
        // Code if has launched before
        } else {
        UserDefaults.standard.set(true, forKey: "launchedBefore")
        // Code if not has launched before
        }
        

        【讨论】:

          【解决方案7】:

          Objective-C 版本的Jon Shier's answer

          BOOL isAppLaunched = [[NSUserDefaults standardUserDefaults] boolForKey:@"launchedBefore"];
          if (isAppLaunched) {
              NSLog(@"Not first launch.");
          }
          else {
              NSLog(@"First launch, setting NSUserDefault.");
              [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"launchedBefore"];
          }
          

          【讨论】:

            【解决方案8】:

            Jonas Deichelmann's的回答稍作语义修改,澄清几点:

            • 函数名称“establishUserDefaultsHaveBeenVerifed”提供了一个建议,即 userDefaults 不仅被检查,而且还可以被写入。
            • 之前建议的键“isAppAlreadyLaunchedOnce”描述了函数本身无法控制的内容;只有在其他代码在正确的时间调用该函数时,该键才会正确描述启动状态,而这又是函数本身无法控制的。使用“userDefaultsHaveBeenVerified”键可以清楚地表明该函数唯一验证的是它本身之前已经运行过。
            • 打印语句清楚地表明,此功能仅验证自上次安装以来它是否已运行,而不是它是否曾在此设备上运行过。

              func establishUserDefaultsHaveBeenVerifed()->Bool{
                   let defaults = UserDefaults.standard
                   if let _ = defaults.string(forKey: "userDefaultsHaveBeenVerified"){
                       print("user defaults were already verified")
                       return true
                    }else{
                       defaults.set(true, forKey: "userDefaultsHaveBeenVerified")
                       print("verified user defaults for first time since app was installed")
                       return false
                    }
               }
              

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2010-09-23
              • 1970-01-01
              • 2020-07-25
              • 2013-11-19
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多