检测首次推出的iOS应用

时间:2014-11-29 23:02:44

标签: ios swift

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

9 个答案:

答案 0 :(得分:130)

通常,您会向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")
}

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

答案 1 :(得分:33)

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

一般用法:

let isFirstLaunch = UserDefaults.isFirstLaunch()

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
}

一些重要的考虑因素:

  • 此标志仅在第一次调用时设置。如果你想知道 关于在不同屏幕上多次首次发布, 设置一个你以后可以参考的变量,按照 ' optionallyStoreTheFirstLaunchFlag'例。
  • 在iOS中,应用通常永远不会关闭。应用程序背景,前景, 状态保存到闪存,但它们只有在重新启动时才重新启动 用户强制关闭(罕见)或用户重启手机。 因此,如果将其存储在变量中,它可能会存在 需很长时间。完成所有操作后,请手动重置 教程屏幕和诸如此类的东西。

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

答案 2 :(得分:7)

为了

,我提炼了一点用户n13的答案
  • 让方法在整个首次启动期间始终返回true
  • 是UIApplication的扩展

只需在UIApplication.isFirstLaunch()使用它,确保在首次执行时至少使用一次

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

答案 3 :(得分:4)

使用NSUserDefaults。注册值为false的BOOL键。在发布时读取密钥;如果是false,请将其设置为true并显示欢迎信息。下次发布时,它将是true,您不会显示欢迎,问题已解决。

答案 4 :(得分:4)

Swift 3

extension UserDefaults {

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

答案 5 :(得分:1)

我编辑了n13的帖子。这段代码对我来说似乎更清晰。您可以作为类或实例函数调用。

另外,根据apple docs你不应该调用synchronize(),因为它会定期调用,除非应用程序即将关闭。我在applicationDidEnterBackground()中的AppDelegate中调用它。 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
  }
}

答案 6 :(得分:1)

您可以使用UserDefaults存储App已打开的时间

<强>首先

<强> AppDelegate.swift

void funct(void *wide){
wider shape=(wider)wide;
// print same as before
}

每次应用程序打开时,都应添加属性 currentTimesOfOpenApp ,因此在函数 func应用程序中修改此属性(_ application:UIApplication,didFinishLaunchingWithOptions launchOptions:[UIApplicationLaunchOptionsKey:Any] ?) - &gt;布尔

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
}

此外,当应用关闭时,您应该保存currentTimesOfOpenApp,这很重要!

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

<强>第二

如果要显示时间,可以从UserDefaults获取此值以在标签上显示。

<强> ViewController.swift

func applicationWillTerminate(_ application: UIApplication) {
        saveTimesOfOpenApp()
        self.saveContext()
    }
每次打开App时,currentTimesOfOpenApp都会增加。如果删除应用程序,此值将重置为1。

答案 7 :(得分:0)

如果是Swift In Appdlegate中的applicationDidFinishLaunchingWithOptions添加:

 if NSUserDefaults.standardUserDefaults().boolForKey("isFirstLaunch") {

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

并在任何地方使用它。

let isFirstLaunch = NSUserDefaults.standardUserDefaults().valueForKey("isFirstLaunch") as? Bool
    if isFirstLaunch {
    //It's the initial launch of application.
    }
    else {
    // not initial launch
    }

答案 8 :(得分:-3)

let 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
        }
    }()