Programing

iOS 앱의 첫 실행 감지

lottogame 2020. 12. 28. 07:40
반응형

iOS 앱의 첫 실행 감지


이 질문에 이미 답변이 있습니다.

Swift에서 첫 번째 발사를 감지하는 방법을 찾으려고합니다.


일반적으로 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")
}

난 항상이게 필요해서 카테고리에 넣어

일반적인 사용법 :

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에서 앱은 일반적으로 종료되지 않습니다. 앱은 백그라운드, 포 그라운드, 상태 저장이 플래시 메모리에 저장되지만 사용자가 강제 종료하거나 (드물게) 사용자가 휴대 전화를 다시 시작하는 경우에만 다시 시작됩니다. 따라서 변수에 저장하면 잠재적으로 오랫동안 붙어있을 수 있습니다. 모든 튜토리얼 화면 및 기타 표시가 끝나면 수동으로 재설정하십시오.

스위프트 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
    }
}

나는 약간의 사용자 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
    }
}

스위프트 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

extension UserDefaults {

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

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

UserDefaultsStore :

struct UserDefaultsStore {
    @UserDefaultWrapper("has_launch_before", defaultValue: false)
    static var hasLaunchBefore: Bool
}

용법:

UserDefaultsStore.hasLaunchBefore = false

NSUserDefaults 사용하십시오 . 값으로 BOOL 키를 등록합니다 false. 시작시 키를 읽으십시오. 인 경우로 false설정 true하고 환영을 표시합니다. 다음 출시는 true이며 문제가 해결 된 환영을 표시하지 않습니다.


n13의 게시물을 편집했습니다. 이 코드는 나에게 더 깨끗해 보입니다. 클래스 또는 인스턴스 함수로 호출 할 수 있습니다.

또한 애플 문서에 따르면 앱이 닫히지 않는 한 주기적으로 호출되기 때문에 동기화 ()를 호출해서는 안됩니다. 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
  }
}

UserDefaults를 사용하여 앱이 열린 시간을 저장할 수 있습니다.

먼저:

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
}

each time the App is open, you should add the property currentTimesOfOpenApp, so modify this property in the function func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool

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

in addition, when the app is closed, you should save the currentTimesOfOpenApp, that is important!

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

Second:

if you want to show the times, you can get this value form UserDefaults to display it on the Label.

ViewController.swift

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

the App is open every time, the currentTimesOfOpenApp will be increase. if you delete the App, this value will be reset as 1.


In case of Swift In applicationdidFinishLaunchingWithOptions in AppDelegate Add:

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

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

And Use this wherever you want to.

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

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

ReferenceURL : https://stackoverflow.com/questions/27208103/detect-first-launch-of-ios-app

반응형