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