2009-11-02 15 views

Odpowiedz

69

Chciałbym użyć NSUserDefaults do przechowywania wskazania pierwszego uruchomienia.

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

[[NSUserDefaults standardUserDefaults] synchronize]; 

Następnie można przetestować za to później ...

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

gdzie testować? w aplikacji skończyła się metoda uruchamiania? – prajakta

+0

Czy umieściłbyś to w 'applicationDidFinishLaunchingWithOptions'? –

+0

Czy nadal będzie działać, jeśli zostanie zarchiwizowany w chmurze? –

5

w aplikacji delegata zarejestrować Wartość domyślna:

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

Więc gdzie chcesz to sprawdzić:

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

shouldnt ustawić FirstLaunch na NIE w if..stmt, więc nie będzie działać w następnej iteracji aplikacji? –

+0

@ brian.clear, tylko jeśli nie musisz potwierdzać, że użytkownik zobaczył zawartość, którą chcesz pokazać, nie masz inicjalizacji do zrobienia/potwierdzenia itp. Na przykład w moim przypadku przy pierwszym uruchomieniu chcę użytkownik, aby potwierdzić, że zobaczył samouczek lub zdecydował się go pominąć, zamiast otwierać kliknięcie, a następnie zablokować telefon i ostatecznie aplikacja zostanie wypchnięta z pamięci. Może brzmi to niecodziennie, ale robiłem to wiele razy, pobierając nową aplikację, czekając gdzieś w kolejce, uruchamiając aplikację po raz pierwszy, a następnie blokując telefon od razu b/c to była moja kolej w kolejce. Tak, zależy od przypadku użycia. Ma sens? – thephatp

1

Użyj NSUserDefaults. Jeśli parametr sharedDefault ma klucz do aplikacji, jego uruchomienie jest wcześniejsze. Oczywiście przy pierwszym uruchomieniu aplikacji musisz mieć co najmniej jedną domyślną pozycję.

8

Ok, co mnie wkurza z tego powodu, że domyślam się.

GDZIE są przechowywane?

  • Nieważne, że zależy od systemu iOS/Mac.
  • po prostu getValue przez KEY
  • setValue przez KEY + zsynchronizować
  • iOS/Mac zajmie się resztą.

Jest to typowy przypadek użycia: Sprawdzanie istnienia wartości np. FirstRun. Za pierwszym razem NIE BĘDZIE ZNAJDOWAĆ, więc zazwyczaj następuje ustawienie wartości. 2-te Run - na następnej pętli ona istnieje i inny przypadek użycia/else stmt jest wyzwalany

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

// UWAGA WAŻNE Jeżeli użytkownik ROOTVIEWCONTROLLER sprawdza appDelegate.firstRun następnie upewnij się zrobić th e sprawdzić powyżej przed ustawieniem self.window.rootViewController tutaj

self.window.rootViewController = self.navController; 


    [self.window makeKeyAndVisible]; 
    return YES; 
} 

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

Powyższe przykłady mylić mnie trochę jak pokazują one, jak sprawdzić go po raz pierwszy ale wspomnij, jak "sprawdzić to później" w tym samym komentarzu. Problem polega na tym, że gdy go znajdziemy, natychmiast go tworzymy i synchronizujemy. Więc sprawdzanie tego późno właściwie oznacza, kiedy RESTART APLIKACJI nie w tym samym czasie, co w pierwszym uruchomieniu.

+0

Jaki jest właściwy sposób czyszczenia pamięci (te "domyślne ustawienia") z symulatora iPhone'a? –

+0

jedyne rozwiązanie zadziałało dla mnie dzięki! –

+0

Domyślnie boolForKey zwróci false, łańcuchy będą zerowe itd. Jeśli chcesz zainicjować ustawienia domyślne użytkownika, po prostu użyj registerDefaults, z kluczami i wartościami, których chcesz użyć. Jeśli chcesz zainicjować datę, może użyć [NSDate distantFuture] – shim

4

Możesz go zaimplementować za pomocą statycznej metody poniżej. Myślę, że to jest lepsze, ponieważ możesz odwoływać się do tej metody tyle razy, ile chcesz, w przeciwieństwie do innych rozwiązań. korzystają: (Należy pamiętać, że nie jest 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

Można użyć metody niestandardowej kategorii isFirstLaunch z UIViewController + FirstLaunch.

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

A kiedy trzeba użyć go w sterowniku

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

Kolejna wskazówka:

Podczas korzystania NSUserDefaults, ustawienia te zostaną usunięte, jeśli aplikacja jest zawsze usuwana. Jeśli z jakiegoś powodu chcesz, aby te ustawienia nadal się kręciły, możesz je zapisać w pęku kluczy.

Powiązane problemy