programing

iPhone에서 처음 앱 실행을 감지하는 방법

easyjava 2023. 6. 3. 08:52
반응형

iPhone에서 처음 앱 실행을 감지하는 방법

처음 시작할 때 어떻게 감지할 수 있습니까?

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
  // if very first launch than perform actionA
  // else perform actionB
}

방법?

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    if (![[NSUserDefaults standardUserDefaults] boolForKey:@"HasLaunchedOnce"])
    {
        [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"HasLaunchedOnce"];
        [[NSUserDefaults standardUserDefaults] synchronize];
    }
    return YES;
}

Swift 3, 4에서 다음을 시도합니다.

func isAppAlreadyLaunchedOnce()->Bool{
        let defaults = UserDefaults.standard
        
        if defaults.bool(forKey: "isAppAlreadyLaunchedOnce"){
            print("App already launched : \(isAppAlreadyLaunchedOnce)")
            return true
        }else{
            defaults.set(true, forKey: "isAppAlreadyLaunchedOnce")
            print("App launched first time")
            return false
        }
    }

스위프트 2에서 이것을 시도해 보세요.

func isAppAlreadyLaunchedOnce()->Bool{
    let defaults = NSUserDefaults.standardUserDefaults()
    
    if defaults.boolForKey("isAppAlreadyLaunchedOnce"){
        print("App already launched : \(isAppAlreadyLaunchedOnce)")
        return true
    }else{
        defaults.setBool(true, forKey: "isAppAlreadyLaunchedOnce")
        print("App launched first time")
        return false
    }
}

업데이트:- OBJ-C의 경우,

+ (BOOL)isAppAlreadyLaunchedOnce {
    if ([[NSUserDefaults standardUserDefaults] boolForKey:@"isAppAlreadyLaunchedOnce"])
    {
        return true;
    }
    else
    {
        [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"isAppAlreadyLaunchedOnce"];
        [[NSUserDefaults standardUserDefaults] synchronize];
        return false;
    }
}

OBJ-C에 대한 참조: https://stackoverflow.com/a/9964400/3411787

바로 이 목적을 위해 작은 도서관을 썼습니다.이 옵션을 사용하면 처음 시작하는 것인지 아니면 이 버전만 시작하는 것인지, 사용자가 설치한 이전 버전을 알 수 있습니다.그것은 아파치 2 라이선스 하에 코코팟으로 github에서 이용할 수 있습니다: GBVersionTracking.

그이불러요걸냥▁this불로 요.application:didFinishLaunching:withOptions:

[GBVersionTracking track];

그리고 첫 출시인지 확인하려면 어디서든 전화하십시오.

[GBVersionTracking isFirstLaunchEver];

마찬가지로:

[GBVersionTracking isFirstLaunchForVersion];

[GBVersionTracking currentVersion];
[GBVersionTracking previousVersion];
[GBVersionTracking versionHistory];

스위프트 3.0용 - 스위프트 5

확장자를 추가

    extension UIApplication {
        class func isFirstLaunch() -> Bool {
            if !UserDefaults.standard.bool(forKey: "hasBeenLaunchedBeforeFlag") {
                UserDefaults.standard.set(true, forKey: "hasBeenLaunchedBeforeFlag")
                UserDefaults.standard.synchronize()
                return true
            }
            return false
        }
    }

그렇다면 당신의 코드로.

UIApplication.isFirstLaunch()

Xcode 7과 Swift 2.0의 또 다른 아이디어는 확장 기능을 사용하는 것입니다.

extension NSUserDefaults {
    func isFirstLaunch() -> Bool {
        if !NSUserDefaults.standardUserDefaults().boolForKey("HasAtLeastLaunchedOnce") {
            NSUserDefaults.standardUserDefaults().setBool(true, forKey: "HasAtLeastLaunchedOnce")
            NSUserDefaults.standardUserDefaults().synchronize()
            return true
        }
        return false
    }
}

이제 앱의 어디에나 쓸 수 있습니다.

if NSUserDefaults.standardUserDefaults().isFirstLaunch() {
    // do something on first launch
}

저는 개인적으로 다음과 같은 UIA 애플리케이션 확장을 선호합니다.

extension UIApplication {
    class func isFirstLaunch() -> Bool {
        if !NSUserDefaults.standardUserDefaults().boolForKey("HasAtLeastLaunchedOnce") {
            NSUserDefaults.standardUserDefaults().setBool(true, forKey: "HasAtLeastLaunchedOnce")
            NSUserDefaults.standardUserDefaults().synchronize()
            return true
        }
        return false
    }
}

함수 호출이 더 설명적이기 때문입니다.

if UIApplication.isFirstLaunch() {
    // do something on first launch
}

아래의 정적 방법으로 구현할 수 있습니다.

+ (BOOL)isFirstTime{
    static BOOL flag=NO;
    static BOOL result;

    if(!flag){
        if ([[NSUserDefaults standardUserDefaults] boolForKey:@"hasLaunchedOnce"]){
            result=NO;
        }else{
            [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"hasLaunchedOnce"];
            [[NSUserDefaults standardUserDefaults] synchronize];
            result=YES;
        }

        flag=YES;
    }
    return result;
}

시작할 때 저장한 다음 해당 항목이 있는지 확인해야 합니다.그렇지 않다면, 그것은 처음입니다."Something"은 파일, 데이터베이스 항목, 사용자 기본값의 설정일 수 있습니다.

이 작업은 매우 간단하며 6줄의 코드만 있으면 됩니다.

응용프로그램 시작 환경설정 또는 응용프로그램이 처음 실행되었는지 여부를 테스트해야 하는 다른 곳에 이 코드를 추가하는 것이 유용합니다.

//These next six lines of code are the only ones required! The rest is just running      code when it's the first time.
//Declare an integer and a default.
NSUserDefaults *theDefaults;
int  launchCount;
//Set up the properties for the integer and default.
theDefaults = [NSUserDefaults standardUserDefaults];
launchCount = [theDefaults integerForKey:@"hasRun"] + 1;
[theDefaults setInteger:launchCount forKey:@"hasRun"];
[theDefaults synchronize];

//Log the amount of times the application has been run
NSLog(@"This application has been run %d amount of times", launchCount);

//Test if application is the first time running
if(launchCount == 1) {
    //Run your first launch code (Bring user to info/setup screen, etc.)
    NSLog(@"This is the first time this application has been run";
}

//Test if it has been run before
if(launchCount >= 2) {
    //Run new code if they have opened the app before (Bring user to home screen etc.
    NSLog(@"This application has been run before);
}

추신: 기본 설정에 bool을 사용하지 마십시오. 정수만 사용하십시오.정의되지 않은 경우 기본값은 0입니다.

고또리그.[theDefaults synchronize];라인이 필요하지는 않지만 수백 개의 장치에서 앱을 수백 번 실행할 때 결과가 항상 신뢰할 수 있는 것은 아니며, 게다가 더 나은 방법을 사용하는 것이 좋습니다.

NSUserDefaults에 bool 키 저장처음이 아니게 되면 앱을 삭제하거나 다시 설치할 때까지 yes로 변경하고 그렇게 유지합니다.

빠르고 쉬운 기능

- (BOOL) isFirstTimeOpening {
    NSUserDefaults *theDefaults = [NSUserDefaults standardUserDefaults];
    if([theDefaults integerForKey:@"hasRun"] == 0) {
        [theDefaults setInteger:1 forKey:@"hasRun"];
        [theDefaults synchronize];
        return true;
    }
    return false;
}

Xcode 7의 Swift 2.0용.AppDelegate.swift 파일에서 다음을 수행합니다.

import UIKit

@UIApplicationMain

class AppDelegate: UIResponder, UIApplicationDelegate {

var window: UIWindow?

func application(application: UIApplication, willFinishLaunchingWithOptions launchOptions: [NSObject : AnyObject]?) -> Bool
{
    return true
}


func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool
{
    didFinishLaunchingOnce()
    return true
}

func didFinishLaunchingOnce() -> Bool
{
    let defaults = NSUserDefaults.standardUserDefaults()

    if let hasBeenLauncherBefore = defaults.stringForKey("hasAppBeenLaunchedBefore")
    {
        //print(" N-th time app launched ")
        return true
    }
    else
    {
        //print(" First time app launched ")
        defaults.setBool(true, forKey: "hasAppBeenLaunchedBefore")
        return false
    }
}

}

신속하게 앱 대리인 위와 같은 범위 밖에서 매우 쉽게 수행할 수 있는 글로벌 상수를 사용할 것을 제안합니다.따라서 앱이 종료되지 않는 한 올바른 값으로 설정됩니다.앱이 백그라운드로 이동하는 경우에도 동일한 값을 반환합니다.앱이 완전히 다시 시작된 경우에만 값이 변경됩니다.

let isFirstLaunch: Bool = {
    if !UserDefaults.standard.bool(forKey: "hasBeenLaunchedBeforeFlag") {
        UserDefaults.standard.set(true, forKey: "hasBeenLaunchedBeforeFlag")
        UserDefaults.standard.synchronize()
        return true
    }
    return false
}()

하지만 솔직히 앱이 백그라운드로 한 번쯤 전송되었다는 사실을 추적하는 것이 좋습니다.이러한 경우에는 UIApplication에서 확장을 사용하고 applicationDidEnterBackground 메서드에서 다음과 같이 플래그를 설정하는 것을 선호합니다.

extension UIApplication {
    private static let isFirstLaunchKey = "isFirstLaunchKey"
    static var isFirstLaunch: Bool {
        return !UserDefaults.standard.bool(forKey: isFirstLaunchKey)
    }
    static func didEnterBackground() {
        if isFirstLaunch {
            UserDefaults.standard.set(true, forKey: isFirstLaunchKey)
            UserDefaults.standard.synchronize()
        }
    }
}

앱 대리인 또는 장면 대리인에게

func sceneDidEnterBackground(_ scene: UIScene) {
        UIApplication.didEnterBackground()
    }

XCode 12, Swift 5에 대해 업데이트됨

 extension UIApplication {
      func isFirstLaunch() -> Bool {
        if !UserDefaults.standard.bool(forKey: "HasLaunched") {
          UserDefaults.standard.set(true, forKey: "HasLaunched")
          UserDefaults.standard.synchronize()
          return true
      }
      return false
    }
}

그럼 당신은 그것을 다음과(와)

UIApplication.isFirstLaunch()

재빠른

struct Pref {
    static let keyFirstRun = "PrefFirstRun"
    static var isFirstRun: Bool {
        get {
            return UserDefaults.standard.bool(forKey: keyFirstRun)
        }
        set {
            UserDefaults.standard.set(newValue, forKey: keyFirstRun)
        }
    }
}

앱 실행 시 기본값 등록:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

        let prefs: [String:Any] = [
            Pref.keyFirstRun: true
            ...
        ]

        UserDefaults.standard.register(defaults: prefs)

앱 종료 시 값 지우기:

func applicationWillTerminate(_ application: UIApplication) {
        Pref.isFirstRun = false

체크 값:

 if Pref.isFirstRun {
    ... do whatever 

스위프트 5 iOS 13.

저는 크리스 프렘겐의 빠르고 쉬운 것을 좋아합니다.그래서 업데이트를 했습니다.

func isFirstTimeOpening() -> Bool {
  let defaults = UserDefaults.standard

  if(defaults.integer(forKey: "hasRun") == 0) {
      defaults.set(1, forKey: "hasRun")
      return true
  }
  return false

}

NSUser 기본값 + 매크로

가장 좋은 접근 방식은 다음을 사용하는 것입니다.NSUserDefaults그리고 저장 a.BOOL변수.위에서 언급한 바와 같이, 다음 코드로 충분합니다.

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setObject:[NSNumber numberWithBool:true] forKey:@"~applicationHasLaunchedBefore"];
[userDefaults synchronize];

또한 아래와 같이 매크로를 생성하여 첫 실행 여부를 쉽게 확인할 수 있습니다.

#define kApplicationHasLaunchedBefore [[NSUserDefaults standardUserDefaults] objectForKey:@"~applicationHasLaunchedBefore"]

그럼 그렇게 사용하세요.

if (kApplicationHasLaunchedBefore) {
    //App has previously launched
} else {
    //App has not previously launched
}

다음은 swift 5.0에서 작동하는 답변입니다.@ZaidPathan의 답변에 비해 개선된 점은 숨겨진 계약이 없다는 것입니다.전화하지 않으면setFirstAppLaunch()전화하기 바로 전에 한 번isFirstAppLaunch()어설션 오류가 발생합니다(디버깅 모드에서만).

fileprivate struct _firstAppLaunchStaticData {
    static var alreadyCalled = false
    static var isFirstAppLaunch = true
    static let appAlreadyLaunchedString = "__private__appAlreadyLaunchedOnce"
}

func setFirstAppLaunch() {
    assert(_firstAppLaunchStaticData.alreadyCalled == false, "[Error] You called setFirstAppLaunch more than once")
    _firstAppLaunchStaticData.alreadyCalled = true
    let defaults = UserDefaults.standard

    if defaults.string(forKey: _firstAppLaunchStaticData.appAlreadyLaunchedString) != nil {
        _firstAppLaunchStaticData.isFirstAppLaunch = false
    }
    defaults.set(true, forKey: _firstAppLaunchStaticData.appAlreadyLaunchedString)
}

func isFirstAppLaunch() -> Bool {
    assert(_firstAppLaunchStaticData.alreadyCalled == true, "[Error] Function setFirstAppLaunch wasn't called")
    return _firstAppLaunchStaticData.isFirstAppLaunch
}

그럼 함수를 호출하면 됩니다.setFirstAppLaunch()당신의 지원을 시작할 때 그리고.isFirstAppLaunch()언제든지 앱이 호출되었는지 확인할 수 있습니다.

언급URL : https://stackoverflow.com/questions/9964371/how-to-detect-first-time-app-launch-on-an-iphone

반응형