检测首次推出的iOS应用

Jul*_*ard 56 ios swift

我试图在Swift中找到一种方法来检测第一次发射.

Jon*_*ier 144

通常,您会向NSUserDefaults写一个值,以指示之前已启动的应用程序.

let launchedBefore = NSUserDefaults.standardUserDefaults().boolForKey("launchedBefore")
if launchedBefore  {
    print("Not first launch.")
}
else {
    print("First launch, setting NSUserDefault.")
    NSUserDefaults.standardUserDefaults().setBool(true, forKey: "launchedBefore")
}
Run Code Online (Sandbox Code Playgroud)

更新 - 斯威夫特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")
}
Run Code Online (Sandbox Code Playgroud)

  • 它运行得很好,因为我已经测试过了.`boolForKey`不返回可选项,但如果该值不存在则返回false. (11认同)
  • 这不会像你写的那样起作用.`firstLaunch`是一个可选项.你不是在努力解决这个问题.此外,它将为零,因为您没有注册值. (2认同)

n13*_*n13 35

我总是需要这个,所以我把它放在一个类别中

一般用法:

let isFirstLaunch = UserDefaults.isFirstLaunch()
Run Code Online (Sandbox Code Playgroud)

AppDelegate中的用法

// use this if you need to refer to it later
var optionallyStoreTheFirstLaunchFlag = false

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        optionallyStoreTheFirstLaunchFlag = UserDefaults.isFirstLaunch()
   // .. do whatever else

    return true
}
Run Code Online (Sandbox Code Playgroud)

一些重要的考虑:

  • 此标志仅在第一次调用时设置.如果您想在不同的屏幕中多次了解第一次启动,请根据"optionalStoreTheFirstLaunchFlag"示例设置您稍后可以参考的变量.
  • 在iOS中,应用程序通常永远不会关闭.应用程序背景,前置,状态保存到闪存,但只有当用户强制关闭(罕见)或用户重新启动手机时,才会重新启动应用程序.因此,如果将其存储在变量中,它可能会长时间存在.完成所有教程屏幕和诸如此类的操作后,手动重置它.

斯威夫特4

将以下内容放在UserDefaults + isFirstLaunch.swift中

extension UserDefaults {
    // check for is first launch - only true on first invocation after app install, false on all further invocations
    // Note: Store this value in AppDelegate if you have multiple places where you are checking for this flag
    static func isFirstLaunch() -> Bool {
        let hasBeenLaunchedBeforeFlag = "hasBeenLaunchedBeforeFlag"
        let isFirstLaunch = !UserDefaults.standard.bool(forKey: hasBeenLaunchedBeforeFlag)
        if (isFirstLaunch) {
            UserDefaults.standard.set(true, forKey: hasBeenLaunchedBeforeFlag)
            UserDefaults.standard.synchronize()
        }
        return isFirstLaunch
    }
}
Run Code Online (Sandbox Code Playgroud)


jal*_*one 7

我提炼了一点用户n13的答案

  • 让方法在第一次启动时始终返回true
  • 是UIApplication的扩展

只需在任何地方使用它,UIApplication.isFirstLaunch()确保在首次执行期间至少达到一次.

斯威夫特3

import UIKit

private var firstLaunch : Bool = false

extension UIApplication {

    static func isFirstLaunch() -> Bool {
        let firstLaunchFlag = "isFirstLaunchFlag"
        let isFirstLaunch = UserDefaults.standard.string(forKey: firstLaunchFlag) == nil
        if (isFirstLaunch) {
            firstLaunch = isFirstLaunch
            UserDefaults.standard.set("false", forKey: firstLaunchFlag)
            UserDefaults.standard.synchronize()
        }
        return firstLaunch || isFirstLaunch
    }
}
Run Code Online (Sandbox Code Playgroud)

斯威夫特2

import UIKit

private var firstLaunch : Bool = false

extension UIApplication {

    static func isFirstLaunch() -> Bool {
        let firstLaunchFlag = "isFirstLaunchFlag"
        let isFirstLaunch = NSUserDefaults.standardUserDefaults().stringForKey(firstLaunchFlag) == nil
        if (isFirstLaunch) {
            firstLaunch = isFirstLaunch
            NSUserDefaults.standardUserDefaults().setObject("false", forKey: firstLaunchFlag)
            NSUserDefaults.standardUserDefaults().synchronize()
        }
        return firstLaunch || isFirstLaunch
    }
}
Run Code Online (Sandbox Code Playgroud)


Rom*_*man 7

迅捷3

extension UserDefaults {

     var hasLaunchBefore: Bool {
           get {
             return self.bool(forKey: #function)
           }
           set {
             self.set(newValue, forKey: #function)
           }
     }
}
Run Code Online (Sandbox Code Playgroud)

Swift 5(属性包装器)

UserDefaultWrapper:

@propertyWrapper
struct UserDefaultWrapper<T> {
    let key: String
    let defaultValue: T

    init(_ key: String, defaultValue: T) {
        self.key = key
        self.defaultValue = defaultValue
    }

    var wrappedValue: T {
        get {
            return UserDefaults.standard.object(forKey: key) as? T ?? defaultValue
        }
        set {
            UserDefaults.standard.set(newValue, forKey: key)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

UserDefaultsStore:

struct UserDefaultsStore {
    @UserDefaultWrapper("has_launch_before", defaultValue: false)
    static var hasLaunchBefore: Bool
}
Run Code Online (Sandbox Code Playgroud)

用法:

UserDefaultsStore.hasLaunchBefore = false
Run Code Online (Sandbox Code Playgroud)


mat*_*att 5

使用NSUserDefaults。注册一个值为 的 BOOL 键false。在启动时读取密钥;如果是false,请将其设置为true并表示欢迎。下次启动时,您将true不再表示欢迎,问题已解决。