2013-09-22 8 views
5

Muszę zapisać moją NSUserDefault, gdy moja aplikacja zostanie całkowicie zamknięta w iOS. nie didenterbackground i foreground. Tylko wtedy, gdy użytkownik zabije moją aplikację ze znakiem minus (-) w iOS.Jaki jest poprawny sposób zapisywania NSUserDefaults, gdy moja aplikacja jest zakończona na iOS

Więc piszę następujące kody w applicationWillTerminate z AppDelegate.

- (void)applicationWillTerminate:(UIApplication *)application 
{ 

    [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"iCloud"]; 
    [[NSUserDefaults standardUserDefaults] synchronize]; 
} 

Ale to nie zapisuje do NSUserDefault.

Więc gdzie powinienem napisać, aby zapisać moje dane?

+0

Czy zaimplementowałeś 'applicationDidEnterBackground:'? Czy to jest wywoływane zamiast 'applicationWillTerminate:'? – bneely

+0

tak, to jest zapisywanie, gdy moja aplikacja jest uruchomiona. chcę tylko zaoszczędzić, gdy całkowicie zrezygnuję z mojej aplikacji. –

+0

To niewłaściwe podejście. Dlaczego nie zrobić tego po wprowadzeniu tła? – jrturton

Odpowiedz

2

Od Apple Doc:

W przypadku aplikacji, które nie obsługują wykonanie tła lub połączonych przeciwko iOS 3.x lub wcześniej, metoda ta jest zawsze wywoływana, gdy użytkownik przerywa aplikację. W przypadku aplikacji obsługujących wykonywanie w tle ta metoda nie jest zwykle wywoływana, gdy użytkownik opuszcza aplikację, ponieważ aplikacja przenosi się w tym przypadku na tło. Jednak ta metoda może zostać wywołana w sytuacjach, gdy aplikacja działa w tle (nie zawieszone) i system musi z jakiegoś powodu ją zakończyć.

To nie jest konieczne, aby applicationWillTerminate zostanie wywołana, kiedy wyjścia aplikacji, nie można nazwać gdy aplikacja obsługuje wykonanie tła.

Możesz użyć UIApplicationExitsOnSuspend, aby określić, że aplikacja powinna zostać zakończona, a nie przeniesiona do tła po zamknięciu.

Obawiam się, że nie istnieje żadna metoda delegata, która będzie w stanie obsłużyć scenariusz działania aplikacji.

Mam nadzieję, że pomoże to w rozwiązaniu problemu.

1

Problem polega na tym, że applicationWillTerminate nie jest w ogóle wywoływany.

Zmień swój applicationDidEnterBackground jak poniżej i zabij aplikację w ciągu 20 sekund. Widać applicationWillTerminate uzyskiwanie nazywa & ustawiania wartości iCloud prawidłowo NSUserDefaults

- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 

    __block UIBackgroundTaskIdentifier identifier = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ 
     if (identifier != UIBackgroundTaskInvalid) { 
      [[UIApplication sharedApplication] endBackgroundTask:identifier]; 
      identifier = UIBackgroundTaskInvalid; 
     } 
    }]; 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     for (int i=0; i < 20; i++) { 
      NSLog(@"%d", i); 
      sleep(1); 
     } 
     if (identifier != UIBackgroundTaskInvalid) { 
      [[UIApplication sharedApplication] endBackgroundTask:identifier]; 
      identifier = UIBackgroundTaskInvalid; 
     } 
    }); 
} 
2

Kiedy aplikacja zostanie zakończone z wielozadaniowym baru, jest to po prostu zabić. Nie ma żadnej metody delegowanej. willTerminate jest wywoływany dla aplikacji, które nie obsługują wielozadaniowości po naciśnięciu przycisku home.

Aplikacje domyślnie obsługują wielozadaniowość, więc powinieneś robić wszystko, co musisz zrobić na didEnterBackground. Po tym czasie nie możesz zagwarantować, że któryś z twoich kodów zostanie ponownie wywołany.

2

Można ustawić Application does not run in background" = "YES" w pliku Info.plist i widać applicationWillTerminate delegat uzyskiwanie nazywa & wartości przechowywanie w NSUserDefaults.

enter image description here

Powiązane problemy