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

az31mfrm  于 2023-02-26  发布在  iOS
关注(0)|答案(9)|浏览(197)

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

idv4meu8

idv4meu81#

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

z6psavjg

z6psavjg2#

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

bkhjykvo3#

由于卸载应用程序时会清除应用程序的NSUserDefaults,因此您可以尝试在应用程序启动时测试是否存在某个值。
如果该值存在,则表示已安装应用。如果不存在,则表示这是第一次启动应用,您可以设置该值。

n9vozmp4

n9vozmp44#

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

juzqafwq5#

我经常发现userDefault无法访问,原因是我的应用中存在一些bugs for Apple data protection策略,因此我更改了策略,使用以下内容检测首次启动

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

pobjuy326#

雨燕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
}
yyyllmsg

yyyllmsg7#

Objective-CJon 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"];
}
u4vypkhs

u4vypkhs8#

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

  • 函数名“establishUserDefaultsHaveBeenVerifed”提供了一个建议,即用户默认值不仅被检查,而且还可以被写入。
  • 前面建议的键“isAppAlreadyLaunchedOnce”描述了函数本身无法控制的内容;只有当函数在正确的时间被其他代码调用时,这个键才能正确地描述启动状态,而这又是函数本身无法控制的。相反,使用“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
      }
 }
ldioqlga

ldioqlga9#

当您需要在首次会话时执行某项操作时(例如,显示费率应用程序):

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

什么是@用户默认值:

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

相关问题