Chcę sprawdzić, czy moja aplikacja iPhone działa po raz pierwszy. Mogę utworzyć plik w folderze dokumentów i sprawdzić ten plik, aby zobaczyć, czy jest to pierwsza aplikacja, ale chciałem się dowiedzieć, czy jest lepszy sposób na zrobienie tego.Najlepszy sposób sprawdzenia, czy aplikacja iPhone działa po raz pierwszy
Odpowiedz
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...
}
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];
}
shouldnt ustawić FirstLaunch na NIE w if..stmt, więc nie będzie działać w następnej iteracji aplikacji? –
@ 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
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ę.
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.
Jaki jest właściwy sposób czyszczenia pamięci (te "domyślne ustawienia") z symulatora iPhone'a? –
jedyne rozwiązanie zadziałało dla mnie dzięki! –
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
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;
}
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
}
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.
gdzie testować? w aplikacji skończyła się metoda uruchamiania? – prajakta
Czy umieściłbyś to w 'applicationDidFinishLaunchingWithOptions'? –
Czy nadal będzie działać, jeśli zostanie zarchiwizowany w chmurze? –