Il modo migliore per verificare se un’applicazione per iPhone è in esecuzione per la prima volta

Voglio verificare se la mia app per iPhone è in esecuzione per la prima volta. Posso creare un file nella cartella documenti e controllare quel file per vedere se è la prima volta che l’app è in esecuzione, ma volevo sapere se c’è un modo migliore per farlo.

Mi piace usare NSUserDefaults per memorizzare un’indicazione della prima esecuzione.

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

Puoi quindi testarlo più tardi …

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

Ok, cosa mi confonde con le User Default.

DOVE SONO STATI MEMORIZZATI?

  • non ti interessa varia per iOS / Mac.
  • ottieni solo VALORE per CHIAVE
  • setVALUE per KEY + synchronize
  • iOS / Mac fa il resto.

Questo è il caso di uso comune: verifica dell’esistenza di un valore, ad esempio firstRun. La prima volta NON ESISTE quindi di solito seguito dall’impostazione del valore. 2nd Run – on next loop esiste e viene triggersto altro caso d’uso / else stmt

—- .h

 @interface MyAppDelegate : UIResponder  //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; //============= 

// NOTA IMPORTANTE SE YOURE ROOTVIEWCONTROLLER controlla appDelegate.firstRun quindi assicurati di eseguire il controllo sopra PRIMA di impostare self.window.rootViewController qui

 self.window.rootViewController = self.navController; [self.window makeKeyAndVisible]; return YES; } 

—- UTILIZZO DELLA BANDIERA

 MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate]; if (appDelegate.firstRun){ NSLog(@"IS FIRST RUN - Do something: eg set up password"); }else { NSLog(@"FPMyMusicScreenViewController: IS NOT FIRST RUN - Prompt for password"); } 

Gli esempi di cui sopra mi hanno un po ‘confuso perché mostrano come controllarlo per la prima volta, ma poi menziono come “verificarlo più tardi” nello stesso commento. Il problema è che quando scopriamo che non esiste, lo creiamo e lo sincronizziamo immediatamente. Quindi, controllare per ritardo significa effettivamente quando si RIAVVIARE L’APP non nella stessa corsa della prima esecuzione.

Nel delegato della tua app registri un valore predefinito:

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

Quindi dove vuoi controllarlo:

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

Puoi implementarlo con il metodo statico qui sotto. Penso che sia meglio visto che puoi chiamare questo metodo tutte le volte che vuoi, a differenza delle altre soluzioni. divertiti: (tieni presente che non è sicuro per i thread)

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

È ansible utilizzare un metodo di categoria personalizzato isFirstLaunch con UIViewController + FirstLaunch.

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

E quando hai bisogno di usarlo nel controller

 BOOL launched = [self isFirstLaunch]; if (launched) { //if launched } else { //if not launched } 

Usa NSUserDefaults. Se sharedDefault ha una chiave per la tua app, viene eseguita prima. Ovviamente, dovrai fare in modo che l’app crei almeno una voce predefinita la prima volta che viene eseguita l’app.

Swift:

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

Un altro consiglio:

Quando si utilizza NSUserDefaults, queste impostazioni verranno cancellate se l’app viene mai cancellata. Se per qualche motivo richiedi che queste impostazioni rimangano in sospeso, puoi memorizzarle nel Portachiavi.