2013-09-22 11 views
5

Ho bisogno di salvare il mio NSUserDefault quando la mia app è completamente chiusa in iOS. non didenterbackground e foreground. Solo quando l'utente uccide la mia app con segno meno (-) in iOS.Qual è il modo corretto per salvare NSUserDefaults quando la mia app è terminata su iOS

Quindi scrivo i seguenti codici in applicationWillTerminate di AppDelegate.

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

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

Ma non salva a NSUserDefault.

Quindi dove devo scrivere per salvare i miei dati?

+0

Hanno implementato 'applicationDidEnterBackground:'? Viene chiamato invece di 'applicationWillTerminate:'? – bneely

+0

sì, che viene salvato quando la mia app è in esecuzione. voglio solo salvare quando esco completamente dalla mia app. –

+0

Questo è l'approccio sbagliato. Perché non farlo entrando in background? – jrturton

risposta

2

Da Apple Doc:

Per le applicazioni che non supportano l'esecuzione in background o collegati contro iOS 3.x o versioni precedenti, questo metodo viene sempre chiamato quando l'utente chiude l'applicazione. Per le app che supportano l'esecuzione in background, questo metodo non viene generalmente chiamato quando l'utente chiude l'app perché l'app si sposta semplicemente sullo sfondo in quel caso. Tuttavia, questo metodo può chiamare nelle situazioni in cui l'app è in esecuzione in background (non sospeso) e il sistema deve terminarlo per qualche motivo.

Non è necessario che applicationWillTerminate sarà chiamato quando uscite app, non possono essere chiamati quando la vostra applicazione supporta l'esecuzione in background.

È possibile utilizzare UIApplicationExitsOnSuspend alla specifica che l'applicazione deve essere chiuso e non spostata sullo sfondo quando si esce.

Ho paura, non esiste un metodo delegato che gestisca in modo sdegnoso lo scenario forza-app dell'app.

Spero che questo possa aiutarti a risolvere il tuo problema.

1

Il problema è che applicationWillTerminate non viene richiamato affatto.

Cambia la tua applicationDidEnterBackground come qui di seguito e uccidere l'applicazione entro 20 secondi. Potete vedere applicationWillTerminate sempre chiamato & impostare il valore iCloud correttamente 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

Quando un'applicazione viene terminato dalla barra multitasking, si è semplicemente ucciso. Non è stato chiamato alcun metodo delegato. willTerminate viene chiamato per le app che non supportano il multitasking quando si preme il pulsante home.

Applicazioni di supporto predefinito multitasking, così si dovrebbe fare tutto il necessario per fare in didEnterBackground. Dopodiché, non puoi garantire che il tuo codice verrà richiamato di nuovo.

2

È possibile impostare il Application does not run in background" = "YES" nel file Info.plist e si può vedere applicationWillTerminate delegato sempre chiamato & valori memorizzazione in NSUserDefaults.

enter image description here

Problemi correlati