Detecta el primer lanzamiento de la aplicación iOS

Estoy tratando de encontrar una forma en Swift para detectar el primer lanzamiento.

Por lo general, escribiría un valor en NSUserDefaults para indicar que una aplicación se inició anteriormente.

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

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

Uso general:

 let isFirstLaunch = UserDefaults.isFirstLaunch() 

Uso dentro de su 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 } 

Algunas consideraciones importantes:

  • Esta bandera solo se establece en la primera invocación. Si desea saber sobre el primer lanzamiento varias veces en diferentes pantallas, establezca una variable a la que luego pueda hacer referencia, según el ejemplo ‘optionallyStoreTheFirstLaunchFlag’.
  • En iOS, las aplicaciones generalmente nunca se cierran. Las aplicaciones están en segundo plano, en primer plano, guardadas en estado en memoria flash, pero solo se reinician si el usuario las apaga por la fuerza (raro) o si el usuario reinicia su teléfono. Entonces, si lo almacena en una variable, podría quedarse por mucho tiempo. Restablecer manualmente una vez que haya terminado mostrando todas las pantallas tutoriales y otras cosas.

Swift 4

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

He refinado un poco el usuario n13 respuesta con el fin de

  • hacer que el método siempre sea verdadero durante todo el primer lanzamiento
  • ser una extensión de UIApplication

Simplemente UIApplication.isFirstLaunch() donde quieras como UIApplication.isFirstLaunch() y asegúrate de alcanzarlo al menos 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 } } 

Use NSUserDefaults . Registre una clave BOOL con un valor de false . Lee la clave en el momento del lanzamiento; si es false , configúralo en true y muestra la bienvenida. El próximo lanzamiento, será true , no mostrarás la bienvenida, problema resuelto.

Swift 3

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

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

Además, de acuerdo con los documentos de apple, no debe llamar a synchronize () ya que se llama periódicamente, a menos que la aplicación esté a punto de cerrarse. Lo llamo 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 los tiempos que la aplicación ha abierto

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 se abre la aplicación, debe agregar la propiedad currentTimesOfOpenApp , por lo tanto, modifique esta propiedad en la función 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, debe guardar la CurrentTimesOfOpenApp, ¡eso es importante!

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

Segundo:

si desea mostrar los horarios, puede obtener este valor de UserDefaults para mostrarlo en la etiqueta.

ViewController.swift

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

la aplicación está abierta todo el tiempo, la CurrentTimesOfOpenApp boostá. si elimina la aplicación, este valor se restablecerá como 1.

En el caso de Swift In applicationdidFinishLaunchingWithOptions en AppDelegate Add:

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

Y úsala 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 } }()