iPhone에서 최초 앱 실행을 감지하는 방법


답변:


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

메서드가 부울 값을 반환하지 않기 때문에 오류가 발생합니다. return 0을 사용하면; 오류를 죽이는 것은 실패합니다.
mrEmpty

@mrEmpty 1. ??? 를 반환합니다 BOOL. 2. 그렇다면 오류는 코드에 있습니다. 0을 반환하면이 충돌이 발생하면 다른 곳에서 뭔가 잘못되었습니다.

@ H2CO3- NSUserDefaults일반적인 장소가 아닙니까? 다른 응용 프로그램에서 사용중인 것과 동일한 "키"를 사용하면 어떻게됩니까?
Ziv Levy

6
@ZivLevy 아니요, 사용자 기본값은 샌드 박스 별 (= 애플리케이션 별) 속성 목록에 저장됩니다.

2
이전에 제출하지 않은 새로운 앱에 대해서만 작동합니다.
Elad

36

에서 스위프트 3, 4는 이 시도 :

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

        if let isAppAlreadyLaunchedOnce = defaults.string(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 let isAppAlreadyLaunchedOnce = defaults.stringForKey("isAppAlreadyLaunchedOnce"){
        print("App already launched : \(isAppAlreadyLaunchedOnce)")
        return true
    }else{
        defaults.setBool(true, forKey: "isAppAlreadyLaunchedOnce")
        print("App launched first time")
        return false
    }
}

UPDATE : - 들어 OBJ-C I이를 사용,

+ (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


32

이 목적을 위해 작은 라이브러리를 작성했습니다. 최초 출시인지 아니면이 버전인지, 사용자가 설치 한 이전 버전인지 알려줍니다. github에서 Apache 2 라이센스에 따라 cocoapod로 제공됩니다 : GBVersionTracking

당신은 단지 이것을 호출 application:didFinishLaunching:withOptions:

[GBVersionTracking track];

그리고 이것이 첫 번째 발사인지 확인하려면 어디서나 이것을 호출하십시오.

[GBVersionTracking isFirstLaunchEver];

그리고 비슷하게 :

[GBVersionTracking isFirstLaunchForVersion];

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

1
이것은 거의 완벽하다! GBToolbox 의존성과 podspec 없이는 훌륭했을 것입니다.
Stian Høiland 2014 년

4
@ StianHøiland GBToolbox 의존성이 사라지고 라이브러리에는 podspec (CocoaPods spec repo에 게시)이 제공됩니다.
작품

9

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

8

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
}

개인적으로 다음과 같이 UIApplication 확장을 선호합니다.

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
}

8

아래 정적 메소드로 구현할 수 있습니다.

+ (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;
}

스레드가 안전하도록하려면이 메소드를 잠 가야합니다.
Mati Bot

9
알고 있지만이 방법은 그렇지 않습니다. 플래그가 NO 인 경우 2 개의 스레드가 if (! flag) {에 도달 할 수 있습니다. 그들은 if 블록 안에 들어갈 것입니다. 그중 하나는 내부에 도달하고 NSUserDefaults를 설정하고 두 번째는 "hasLaunchOnce"를 전달하고 (첫 번째 스레드가 선언했기 때문에) 결과를 NO로 설정합니다. 즉, 잘못된 값을 얻을 수 있습니다.
Mati Bot

5

시작할 때 무언가를 저장 한 다음 존재하는지 확인해야합니다. 그렇지 않다면 처음입니다. "뭔가"는 파일, 데이터베이스 항목, 사용자 기본값 설정 ...이 될 수 있습니다.


4

이 작업은 매우 간단하며 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);
}

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

또한 [theDefaults synchronize];라인이 필요하지는 않지만 앱이 수백 개의 장치에서 수백 번 실행되면 결과가 항상 신뢰할 수있는 것은 아니라는 것이 아니라 더 나은 방법이라는 것을 알았습니다.


귀하의 예는 효과가 있지만 OP가 요구하는 것은 처음 시작인지 아닌지입니다. 부울은 이것에 완벽하게 좋습니다. 사용자가 앱을 몇 번 열 었는지 알고 싶다면 코드가 의미가 있습니다.
tilo

3

부울 키를 NSUserDefaults에 처음 저장하면 아니오가되며 예로 변경하고 앱을 삭제하거나 다시 설치할 때까지 처음으로 다시 유지됩니다.


3

빠르고 쉬운 기능

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

3

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

}

2

빠른

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 

2

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

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

2

스위프트 5 iOS 13.

나는 Chris Fremgen의 빠르고 쉬운 것을 좋아 합니다. 그래서 나는 그것을 업데이트했다.

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

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

}

2

XCode 11 , 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()

0

NSUserDefaults + 매크로

가장 좋은 방법은 변수 를 사용 NSUserDefaults하고 저장하는 것 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
}

0

다음은 swift 5.0에서 작동하는 답변입니다. @Zaid Pathan의 답변과 비교하여 개선 된 점은 숨겨진 계약이 없다는 것입니다. 호출 하기 전에 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()때 와 앱이 호출되었는지 확인할 때마다 함수를 호출하면됩니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.