Как обнаружить запуск приложения в первый раз на iPhone

Как я могу обнаружить самый первый запуск

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

метод?

Ответ 1

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

Ответ 2

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

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

ОБНОВЛЕНИЕ: - Для 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: fooobar.com/questions/41917/...

Ответ 3

Я написал крошечную библиотеку для этой цели. Это позволяет мне узнать, является ли это первым запуском за всю историю, или только для этой версии, и для любых предыдущих версий, которые пользователь установил. Он доступен на github как cocoapod под лицензией Apache 2: GBVersionTracking

Вы просто вызываете это в application:didFinishLaunching:withOptions:

[GBVersionTracking track];

И затем, чтобы проверить, является ли это первым запуском, просто вызывайте это где угодно:

[GBVersionTracking isFirstLaunchEver];

И аналогично:

[GBVersionTracking isFirstLaunchForVersion];

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

Ответ 4

Вы можете реализовать его со статическим методом ниже:

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

Ответ 5

Еще одна идея для 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
}

Ответ 6

для быстрого 3.0

добавить расширение

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

Ответ 7

Вам нужно что-то сэкономить при запуске, а затем проверить, существует ли он. Если нет, то это первый раз. "Что-то" может быть файлом, записью базы данных, настройкой по умолчанию для пользователей....

Ответ 8

Это довольно просто сделать, и требуется всего шесть строк кода.

Полезно добавить этот код в настройки запуска приложения или где-нибудь еще, что вам может потребоваться, чтобы проверить, было ли это в первый раз, когда ваше приложение было запущено.

//These next six lines of code are the only ones required! The rest is just running      code when it 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);
}

P.S. НЕ использовать bools в настройках Просто придерживайтесь целых чисел. Они по умолчанию равны нулю, когда undefined.

Кроме того, строка [theDefaults synchronize]; не требуется, но я обнаружил, что, когда приложение запускается сотни раз на сотни устройств, результаты не всегда надежны, кроме того, это лучше.

Ответ 9

Хранить ключ bool в NSUserDefaults в первый раз, когда он не будет, вы измените его на yes и сохраните его так, как только приложение удалит или переустановит его снова в первый раз.

Ответ 10

Для Swift 2.0 в Xcode 7. В файле 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
    }
}

}

Ответ 11

Быстрая и простая функция

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

Ответ 12

NSUserDefaults + Macro

Лучший подход - использовать 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
}

Ответ 13

Вот ответ, работающий в 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() всякий раз, когда вы хотите проверить, было ли isFirstAppLaunch() ваше приложение.

Ответ 14

быстрый

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