2010-06-29 7 views
36

Il metodo delegato applicationWillTerminate non viene richiamato in iOS 4.0 Quando si preme il pulsante Home, vengono richiamati i metodi delegati applicationWillResignActive e applicationDidEnterBackground.ApplicationWillTerminate in iOS 4.0

- (void)applicationWillResignActive:(UIApplication *)application 
{ 
    NSLog(@"Application Did Resign Active"); 
} 

- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 
    NSLog(@"Application Did Enter Background"); 
} 

E quando premi due volte il tasto Home e ancora una volta lanciare l'applicazione della trovo i metodi delegato applicationWillEnterForeground e applicationDidBecomeActive sono sempre chiamati.

- (void)applicationWillEnterForeground:(UIApplication *)application 
{ 
    NSLog(@"Application Will Enter Foreground"); 
} 



- (void)applicationDidBecomeActive:(UIApplication *)application 
{ 
    NSLog(@"Application Did Become Active"); 
} 

ma io voglio sapere quando sarà chiamato il metodo delegato applicationWillTerminate, dove faccio alcune routine di backup DB/file.

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

} 

Ho anche provato a colpire il segno meno e cancellato l'App in esecuzione in background, ma ancora non ha chiamato alcuna metodo delegato.

Qualche idea ???

+0

hai effettivamente messo un po 'di codice in 'applicationWillTerminate: ', giusto? La tua domanda mostra attualmente un corpo del metodo vuoto. – BoltClock

+0

[qui] (http: // StackOverflow.it/questions/7818045/applicationwillterminate-when-is-it-called-and-when-not) è la soluzione che ho trovato finora – swiftBoy

risposta

52

Dalla Guida iPhone Application Programming:

Anche se si sviluppa l'applicazione utilizzando iPhone SDK 4 e versioni successive, è comunque necessario essere preparati per l'applicazione per essere terminato. Se la memoria diventa vincolata, il sistema potrebbe rimuovere le applicazioni dalla memoria per creare più spazio. Se la tua applicazione è attualmente sospesa, il sistema rimuove la tua applicazione dalla memoria senza alcun preavviso. Tuttavia, se l'applicazione è attualmente in esecuzione in background, il sistema chiama il metodo applicationWillTerminate: del delegato dell'applicazione. L'applicazione non può richiedere ulteriore tempo di esecuzione in background da questo metodo.

Quindi sì, generalmente non essere chiamato applicationWillTerminate: molto spesso in iOS 4. Se è necessario salvare i dati, si dovrebbe fare in modo sia applicationWillTerminate: e applicationDidEnterBackground:.

+5

Intorno al minuto 22 del video citato da falconcreek, si dice che solo le app in esecuzione in background che sono ucciso tramite l'icona del segno meno rosso ottieni il beneficio di un'applicazioneWillTerminate: chiama prima di essere ucciso. Quelli sospesi muoiono subito È elencato in "Terminazione" e non è reso chiaro al 100%, ma sembra che questo si applichi alla terminazione del sistema e alla terminazione avviata dall'utente tramite il segno meno. –

+0

In esecuzione su iOS 4 su iPhone 3G sembra che applicationWillTerminate: viene chiamato dopo applicationDidEnterBackground: quando viene premuto il pulsante home. –

+3

@David: beh, l'iPhone 3G non supporta il multitasking, quindi avrebbe senso. –

2

Ho una soluzione per terminare le app quando l'utente preme il tasto Home in iOS4. Questo chiamerà il metodo delegato applicationWillTerminate invece di entrare nel processo in background.

  1. aprire il file info.plist
  2. aggiungere la chiave UIApplicationExitsOnSuspend
  3. impostare la nuova chiave per SI
+4

Questo chiuderà immediatamente l'applicazione invece di sospenderla. Quindi, quando l'utente riavvia l'applicazione, dovrà ricominciare tutto da capo, eliminando il vantaggio di una rapida commutazione delle applicazioni. In generale, l'utilizzo di UIApplicationExitsOnSuspend è sconsigliato a meno che l'applicazione non abbia realmente bisogno di uscire (http://tinyurl.com/2fgkf5p). – Brian

+0

@Brian: Non c'è motivo di scoraggiare questo comportamento se meglio si adatta alle esigenze della tua applicazione e base di utenti, altrimenti non ci sarebbe alcun punto nell'esistenza della funzionalità. – ninehundredt

+0

@lakehousetech, non devi credermi sulla parola. La Guida alla programmazione delle app iOS dice "La disattivazione dell'esecuzione in background è fortemente scoraggiata, ma potrebbe essere l'opzione preferita in determinate condizioni." Che è praticamente quello che ho detto :-). La guida dice anche che le app che partiranno a freddo dovrebbero ripristinare il loro stato precedente, quindi la cessazione immediata è raramente necessaria. – Brian

1

In realtà si può anche utilizzare questo passaggio per farlo.

  1. Aprire il file info.plist
  2. aggiungere la chiave -> applicazione non viene eseguito in background
  3. impostare questo valore chiave per SI