Подтвердить что ты не робот

Лучший способ проверить, работает ли iPhone приложение в первый раз

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

4b9b3361

Ответ 1

Мне нравится использовать NSUserDefaults для хранения показаний первого запуска.

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];  
if (![defaults objectForKey:@"firstRun"])
  [defaults setObject:[NSDate date] forKey:@"firstRun"];

[[NSUserDefaults standardUserDefaults] synchronize];

Затем вы можете проверить его позже...

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];        
if([defaults objectForKey:@"firstRun"])           
{
  // do something or not...
}

Ответ 2

Хорошо, что меня смущает про пользовательские настройки по умолчанию.

ГДЕ они хранятся?

  • Вы не заботитесь о том, что это зависит от iOS/Mac.
  • вы просто получаетеVALUE by KEY
  • setVALUE by KEY + синхронизация
  • iOS/Mac делает все остальное.

Это общий прецедент: Проверка наличия значения, например firstRun. В первый раз, когда он НЕ СУЩЕСТВУЕТ, обычно следует установить значение. 2-й запуск - в следующем цикле он существует, и запускается другой прецедент /else stmt

----.h

@interface MyAppDelegate : UIResponder <UIApplicationDelegate>

//flag to denote if this is first time the app is run
@property(nonatomic) BOOL firstRun;

------.m

@implementation MyAppDelegate

@synthesize firstRun = _firstRun;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

    //============== 
    //Check to see if this is first time app is run by checking flag we set in the defaults

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];  

    if (![defaults objectForKey:@"firstRun"]){
        //flag doesnt exist then this IS the first run
        self.firstRun = TRUE;
        //store the flag so it exists the next time the app starts
        [defaults setObject:[NSDate date] forKey:@"firstRun"];
    }else{
        //flag does exist so this ISNT the first run
        self.firstRun = FALSE; 
    }        
    //call synchronize to save default - where its saved is managed by iOS - varies by device and iOS/Mac
    [[NSUserDefaults standardUserDefaults] synchronize];
    //TO TEST: delete the app on the device/simulator
    //run it - should be the first run
    //close it - make sure you kill it and its not just in the background else didFinishLaunchingWithOptions wont be called
    //just applicationDidBecomeActive
    //2nd run it should  self.firstRun = FALSE;
    //=============

//ПРИМЕЧАНИЕ. ВАЖНО, ЕСЛИ YOUR ROOTVIEWCONTROLLER проверяет appDelegate.firstRun, тогда убедитесь, что вы сделали чек выше ПЕРЕД настройкой self.window.rootViewController здесь

self.window.rootViewController = self.navController;


    [self.window makeKeyAndVisible];
    return YES;
}

---- ИСПОЛЬЗОВАНИЕ ФЛАГА

MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];

if (appDelegate.firstRun){
    NSLog(@"IS FIRST RUN - Do something: e.g. set up password");

}else {
     NSLog(@"FPMyMusicScreenViewController: IS NOT FIRST RUN - Prompt for password");
}

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

Ответ 3

В вашем делете делегата зарегистрируйте значение по умолчанию:

NSDictionary *defaultsDict = 
[[NSDictionary alloc] initWithObjectsAndKeys:[NSNumber numberWithBool:YES], @"FirstLaunch", nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:defaultsDict];
[defaultsDict release];

Затем, где вы хотите его проверить:

NSUserDefaults *sharedDefaults = [NSUserDefaults standardUserDefaults];
if ([sharedDefaults boolForKey:@"FirstLaunch"]) {
  //Do the stuff you want to do on first launch
  [sharedDefaults setBool:NO forKey:@"FirstLaunch"];
  [sharedDefaults synchronize];
}

Ответ 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

Вы можете использовать специальный метод категорий isFirstLaunch с UIViewController + FirstLaunch.

- (BOOL)isFirstLaunch
{
    if ([[NSUserDefaults standardUserDefaults] boolForKey:@"kFirstLaunch"]) {
        return YES;
    }
    else {
        [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"kFirstLaunch"];
        [[NSUserDefaults standardUserDefaults] synchronize];
        return NO;
    }
}

И когда вам нужно использовать его в контроллере

BOOL launched = [self isFirstLaunch];

if (launched) {
//if launched
}
else {
//if not launched
}

Ответ 6

Используйте NSUserDefaults. Если у sharedDefault есть ключ для вашего приложения, его запуск выполняется раньше. Конечно, при первом запуске приложения вам нужно будет создать хотя бы одну запись по умолчанию.

Ответ 7

Swift:

var isFirstLaunch: Bool {
    get {
        if (NSUserDefaults.standardUserDefaults().objectForKey("firstLaunchDate") == nil) {
            NSUserDefaults.standardUserDefaults().setObject(NSDate(), forKey: "firstLaunchDate")
            NSUserDefaults.standardUserDefaults().synchronize()
            return true
        }
        return false
    }
}

Другой совет:

При использовании NSUserDefaults эти параметры будут удалены, если приложение будет удалено. Если по какой-то причине вам нужно, чтобы эти настройки все еще зависали, вы можете сохранить их в цепочке ключей.