2009-11-02 20 views

risposta

69

Mi piace utilizzare 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]; 

È quindi possibile verificare in un secondo momento ...

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

dove testare ?? in app ha finito il metodo di lancio ?? – prajakta

+0

Vuoi metterlo in 'applicationDidFinishLaunchingWithOptions'? –

+0

Funzionerà ancora se è stato eseguito il backup nel cloud? –

5

Nella vostra applicazione delegato registrare un valore di default:

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

Poi in cui si desidera controllare:

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

non dovresti impostare il tuo FirstLaunch su NO nel file if..stmt in modo che non funzioni sulla prossima iterazione dell'app? –

+0

@ brian.clear, solo se non è necessario confermare che l'utente ha visto il contenuto che si desidera mostrare, non avere l'inizializzazione da fare/confermare, ecc. Ad esempio, nel mio caso alla prima esecuzione, desidero l'utente per confermare che ha visto il tutorial o ha scelto di ignorarlo, piuttosto che fare clic su Apri, quindi bloccare il proprio telefono e alla fine la mia app viene espulsa dalla memoria. Può sembrare insolito, ma l'ho fatto numerose volte quando scaricavo una nuova app mentre aspettavo in fila da qualche parte, lanciando l'app per la prima volta, quindi bloccando immediatamente il mio telefono b/c era il mio turno in linea. Quindi, dipende dal caso d'uso. Ha senso? – thephatp

1

Utilizzare 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.

8

Ok, ciò che mi confonde con le impostazioni predefinite dell'utente.

DOVE SONO STATI MEMORIZZATI?

  • non ti interessa varia per iOS/Mac.
  • basta getvalue da KEY
  • setvalue da KEY + sincronizza
  • iOS/Mac fa il resto.

Questo è il caso di uso comune: Verifica dell'esistenza di un valore, ad esempio firstRun. La prima volta che NON ESISTE, di solito segue l'impostazione del valore. 2 ° Run - sul prossimo ciclo esso esiste e altro caso d'uso/else stmt è innescato

---- .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; 
    //============= 

// NOTA IMPORTANTE se sei RootViewController controlla appDelegate.firstRun quindi assicuratevi di fare ° e controllare sopra prima di impostazione self.window.rootViewController qui

self.window.rootViewController = self.navController; 


    [self.window makeKeyAndVisible]; 
    return YES; 
} 

---- utilizzando il flag

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"); 
} 

Gli esempi sopra di me un po 'confuso in quanto mostrano come controllare per la prima volta ma poi menziona come "controllare più tardi" nello stesso commento. Il problema è quando scopriamo che non esiste, lo creiamo e lo sincronizziamo immediatamente. Quindi, controllare per ritardo significa in realtà quando si RIAVVIARE L'APP non nella stessa corsa della prima esecuzione.

+0

Qual è il modo corretto per cancellare la memoria (queste "impostazioni predefinite") dal simulatore iPhone? –

+0

l'unica soluzione ha funzionato per me grazie! –

+0

Per impostazione predefinita boolForKey restituirà false, le stringhe saranno nulle ecc. Se si desidera inizializzare i valori predefiniti dell'utente, utilizzare registerDefaults, con le chiavi e i valori che si desidera utilizzare. Se si desidera inizializzare una data, è possibile utilizzare [NSDate distantFuture] – shim

4

È possibile implementarlo con il metodo statico riportato di seguito. Penso che sia meglio visto che puoi chiamare questo metodo tutte le volte che vuoi, a differenza delle altre soluzioni. Enjoy: (tenere a mente che non è thread-safe)

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

è possibile utilizzare un metodo di isFirstLaunch categoria personalizzata 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 avete bisogno di usarlo controller

BOOL launched = [self isFirstLaunch]; 

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

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 suggerimento:

Quando si utilizza NSUserDefaults, queste impostazioni saranno spazzati se il l'app è mai stata cancellata. Se per qualche motivo richiedi che queste impostazioni rimangano in sospeso, puoi memorizzarle nel Portachiavi.

Problemi correlati