Detecta el primer lanzamiento de la aplicación iOS

Estoy intentando encontrar una manera en Swift para detectar el primer lanzamiento.

Normalmente escribirías un valor en NSUserDefaults para indicar que una aplicación se ha iniciado antes.

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

ACTUALIZACIÓN – Swift 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") } 

Yo siempre necesito esto, así que lo puse en una categoría

Uso:

 let isFirstLaunch = UserDefaults.isFirstLaunch() 

Swift 3

Coloque lo siguiente en 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 } } 

Swift 2

Coloque lo siguiente en NSUserDefaults + isFirstLaunch.swift

 extension NSUserDefaults { // check for is first launch - only true on first invocation after app install, false on all further invocations static func isFirstLaunch() -> Bool { let firstLaunchFlag = "FirstLaunchFlag" let isFirstLaunch = NSUserDefaults.standardUserDefaults().stringForKey(firstLaunchFlag) == nil if (isFirstLaunch) { NSUserDefaults.standardUserDefaults().setObject("false", forKey: firstLaunchFlag) NSUserDefaults.standardUserDefaults().synchronize() } return isFirstLaunch } } 

Refiné una respuesta de bit user n13 para

  • Si el método siempre devuelve verdadero durante todo el primer lanzamiento
  • ser una extensión para UIApplication

Simplemente utilícelo donde desee como UIApplication.isFirstLaunch() y asegúrese de alcanzarlo al less una vez durante la primera ejecución .

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

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

Utilice NSUserDefaults . Registre una key BOOL con un valor de false . Lea la key en el momento del lanzamiento; Si es false , establézcalo en true y muestre la bienvenida. Próximo lanzamiento, será true , no mostrarás la bienvenida, problema resuelto.

Hice una edición de la publicación de n13. Este código me parece más limpio. Puede llamar como una class o una function de instancia.

Además, de acuerdo con Apple Docs, no debería llamar a synchronize () ya que se llama periódicamente, a less que la aplicación esté a punto de cerrarse. Lo llamé en AppDelegate en applicationDidEnterBackground (). https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSUserDefaults_Class/#//apple_ref/occ/instm/NSUserDefaults/synchronize

  if NSUserDefaults().isFirstLaunchForUser("me") { print("First launch") } else { print("Not first launch") } if NSUserDefaults.isFirstLaunch() { print("First launch") } else { print("Not first launch") } extension NSUserDefaults { static func isFirstLaunch() -> Bool { let firstLaunchFlag = "FirstLaunchFlag" if !standardUserDefaults().boolForKey(firstLaunchFlag) { standardUserDefaults().setBool(true, forKey: firstLaunchFlag) // standardUserDefaults().synchronize() return true } return false } // For multi user login func isFirstLaunchForUser(user: String) -> Bool { if !boolForKey(user) { setBool(true, forKey: user) // synchronize() return true } return false } } 

puede usar UserDefaults para almacenar las veces que la aplicación se abrió

Primero:

AppDelegate.swift

 let userDefaults = UserDefaults.standard var currentTimesOfOpenApp:Int = 0 func saveTimesOfOpenApp() -> Void { userDefaults.set(currentTimesOfOpenApp, forKey: "timesOfOpenApp") } func getCurrentTimesOfOpenApp() -> Int { return userDefaults.integer(forKey: "timesOfOpenApp") + 1 } 

cada vez que la aplicación está abierta, debe agregar la propiedad currentTimesOfOpenApp , por lo tanto, modifique esta propiedad en la function func application (_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool

 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { self.currentTimesOfOpenApp = getCurrentTimesOfOpenApp() return true } 

Además, cuando la aplicación está cerrada, debes save la aplicación actual TimesOfOpenApp, ¡eso es importante!

 func applicationWillTerminate(_ application: UIApplication) { saveTimesOfOpenApp() self.saveContext() } 

Segundo:

si desea mostrar las horas, puede get este formulario de valor UserDefaults para mostrarlo en la label.

ViewController.swift

 let delegate = UIApplication.shanetworking.delegate as! AppDelegate let times = delegate.currentTimesOfOpenApp timesToOpenAppLabel.text = "\(times)" 

la aplicación está abierta cada vez, se incrementará la actual TimesOfOpenApp. Si elimina la aplicación, este valor se restablecerá como 1.

Swift 3

 extension UserDefaults { var hasLaunchBefore: Bool { get { return self.bool(forKey: #function) } set { self.set(newValue, forKey: #function) } } } 

En caso de Swift en applicationdidFinishLaunchingWithOptions en AppDelegate Add:

  if NSUserDefaults.standardUserDefaults().boolForKey("isFirstLaunch") { NSUserDefaults.standardUserDefaults().setBool(true, forKey: "isFirstLaunch") NSUserDefaults.standardUserDefaults().synchronize() } 

Y usa esto donde quieras.

 let isFirstLaunch = NSUserDefaults.standardUserDefaults().valueForKey("isFirstLaunch") as? Bool if isFirstLaunch { //It's the initial launch of application. } else { // not initial launch } 
 lazy var applicationLaunchedOnce: Bool = { let launchedOnce = NSUserDefaults.standardUserDefaults().boolForKey(UserDefaultsService.ApplicationLaunchedOnce) if launchedOnce { return launchedOnce } else { NSUserDefaults.standardUserDefaults().setBool(true, forKey: UserDefaultsService.ApplicationLaunchedOnce) NSUserDefaults.standardUserDefaults().synchronize() return false } }()