我试图在Swift中找到一种方法来检测第一次发射。
答案 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
}
一些重要的考虑因素:
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的答案只需在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
}
}()