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

如何在iOS中检测首次启动的应用程序?,ios,swift,launch,Ios,Swift,Launch,我想在用户第一次打开我的应用程序时显示欢迎屏幕。有什么方法可以检查Swift中应用程序的首次启动?由于卸载应用程序时会删除应用程序的NSUserDefaults,因此您可以尝试在应用程序启动时测试是否存在特定值 如果该值存在,则表示应用程序已安装。如果没有,这是第一次启动应用程序,您可以设置该值。在Swift 2及以下版本中尝试此操作 Swift 4及以上 您可以在任何地方使用此选项来验证用户是否第一次看到此视图 func isAppAlreadyLaunchedOnce() -> Boo

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

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

如果该值存在,则表示应用程序已安装。如果没有,这是第一次启动应用程序,您可以设置该值。

在Swift 2及以下版本中尝试此操作 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
SWIFT:

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

目标-C版本:


我经常发现由于我的应用程序中的一些for Apples策略,
userDefault
无法访问,所以我改变了策略,用下面的命令检测首次启动

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

答案在语义上稍作修改,澄清了几点:

  • 函数名“EstablishUserDefaultShaveBeenVerified”提供了一个建议,即用户默认值不仅要被检查,还可能被写入
  • 前面提到的键“IsAppalReadyLancedonce”描述了函数本身无法控制的东西;只有当函数在正确的时间被其他代码调用时,该键才会正确描述启动状态,而其他代码又无法控制该函数。相反,使用“userDefaultsHaveBeenVerified”键可以清楚地表明该函数验证的唯一内容是它本身以前已经运行过
  • print语句表明,此函数仅验证自上次安装以来是否已运行,而不是验证是否在此设备上运行过

    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
          }
     }
    

    • Swift 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
      }
      

      该函数的原始版本可能会在返回false时返回true,反之亦然;我不确定;在XCode 9 Beta版(适用于Swift 4)中使用它时,编辑器提出了更新的名称和逻辑建议,导致出现这种情况。感谢@AlexHall指出,将更新func,使其能够正常工作。不要使用
      -[NSUserDefaults synchronize]
      。来自“此方法是不必要的,不应使用。”如果您在应用程序中的多个位置请求此方法,则对于第二次和后续请求,它将返回TRUE,尽管它实际上可能是第一次运行。最好使用启动计数器。启动计数器的方法是什么?我猜@VyacheslavBakinkskiy的意思是使用Int而不是保存布尔值,这样你就知道应用程序实际启动了多少次了。@Jonas Deichelmann是的,thx
      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
            }
       }
      
      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
      }