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

问题描述 投票:0回答:9

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

ios swift launch
9个回答
38
投票

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


16
投票

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

9
投票

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

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


3
投票

斯威夫特:

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

2
投票

我经常发现

userDefault
由于一些 bug 苹果 data protection 在我的应用程序中的政策,所以我改变了我的策略来检测以下首次启动

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

2
投票

斯威夫特 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
}

1
投票

Objective-C 版本的Jon Shier 的回答

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

1
投票

Jonas Deichelmann 的回答进行轻微的语义修改,澄清一些事情:

    函数名称“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 } }
    
    

0
投票
当您需要在

NOT 第一次会议时做某事(例如,显示汇率应用程序):

@UserDefault(key: UDKey.isFirstSession, defaultValue: true) static var isFirstSession: Bool func applicationWillTerminate(_ application: UIApplication) { // When app is terminated, next sessions are not first anymore UserDefaults.isFirstSession = false }

什么是@UserDefault:

@propertyWrapper struct UserDefault<Value> { let key: String let defaultValue: Value var container: UserDefaults = .standard var wrappedValue: Value { get { return container.object(forKey: key) as? Value ?? defaultValue } set { container.set(newValue, forKey: key) } } }

UDKey是什么:

enum UDKey { static let isFirstSession = "isFirstSession" }
    
© www.soinside.com 2019 - 2024. All rights reserved.