2012-04-17 31 views
6

Sto lavorando a un progetto in Xcode versione 4.2.1 e in iOS 5.0. Mi chiedo quale funzione verrà chiamata quando si interrompe completamente un'applicazione, il che significa anche il momento in cui un utente impone che l'app in esecuzione sullo sfondo venga interrotta dalla schermata principale. Mi è stato presupposto cheQuale funzione viene chiamata quando viene terminata l'app per iPhone?

(void)applicationWillTerminate:(UIApplication *)application

sarebbe chiamato, ma è venuto fuori che non è stato chiamato anche dopo aver terminato l'applicazione su sfondo. Quello che sostanzialmente voglio fare è chiamare un metodo che ho creato poco prima che l'app sia terminata completamente, quindi è necessario sapere quale funzione è chiamata alla fine dell'app.

Grazie.

+0

per favore potete selezionare/spuntare una delle risposte. –

risposta

1

Se l'app è già sospesa, non riceverà ulteriori notifiche. Guarda la notifica didEnterBackground.

+0

Vuoi dire che non riesco a capire cosa voglio fare fintanto che sono nella schermata principale? Per quanto riguarda la funzione, non l'ho trovata anche se ho visto un tale tipo di funzione. – Max

+0

-1: non è presente alcuna notifica "willSuspend" o messaggio delegato. Probabilmente vuoi "didEnterBackground". – rickster

+0

Potrei non volerlo perché voglio chiamare un metodo quando l'applicazione è completamente terminata, non quando si preme il tasto home. Cioè, non voglio chiamare il mio metodo quando sto entrando in background. – Max

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

È nel protocollo UIApplicationDelegate.

0

Il documentation here indica il comportamento per questo caso.

In breve, riceverai il messaggio applicationWillTerminate: solo se l'app è in esecuzione (in primo piano o in background) quando viene interrotta. Pertanto, a meno che l'app non sia in esecuzione in primo piano o in una delle modalità di background di lunga durata (ad esempio VoIP, Audio o un'attività di lunga durata indicata da beginBackgroundTaskWithExpirationHandler) passerà dallo stato background allo stato suspended abbastanza rapidamente. In questo caso, non riceverai mai il messaggio applicationWillTerminate:.

5

Here's a good overview delle notifiche del ciclo di vita dell'applicazione & messaggi delegati su iOS 4.0 e successivi. In breve ...

L'app in genere non vedrà mai willTerminate, perché il sistema in genere termina l'app solo quando è già sospesa (in background). Una volta che la tua app è stata sospesa, non ha più possibilità di agire (*), quindi non c'è alcuna richiamata per quello.

didEnterBackground messaggio delegato o notifica deve essere considerata l'ultima possibilità di ripulire o salvare lo stato prima della possibile chiusura.


(*) Va bene, la vostra applicazione può fare cose se è in una delle modalità di esecuzione di sfondo supportate, come audio, VoIP, o la navigazione, ma in quel caso esso sia non è stato ancora sospesa o è stato non sospeso con un punto di ingresso specifico per quella modalità in background.

+0

Quindi nel caso in cui un utente interrompa forzatamente l'applicazione in esecuzione in background, non ci sarebbe un buon modo per chiamare il mio metodo. Grazie per l'aiuto. – Max

+0

Probabilmente non riceverai nemmeno una notifica; a meno che l'utente non chiuda l'app tramite lo switcher dell'app entro un paio di secondi dallo sfondo, l'app sarà già sospesa. – rickster

-1

I tre metodi saranno utili:

- (void)applicationWillResignActive:(UIApplication *)application 
    { 
    } 

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

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

metodo "applicationWillTerminate" sarà chiamato solo quando l'applicazione è non in stato di sospensione mentre viene terminato.

Per capire questo, considerando attualmente l'applicazione è in stato attivo di primo piano, passare attraverso due casi seguenti:

Caso 1: Quando si unico tocco pulsante Home, applicazione va direttamente a stato di sospensione chiamando methods: (1) applicationWillResignActive e quindi (2) applicationDidEnterBackground.

Ora quando si tenta di chiudere/terminare l'app, toccando due volte il pulsante Home e facendo scorrere la schermata dell'app corrente dalle schermate dell'app recenti, l'app è in sospeso. Quindi, "applicationWillTerminate" il metodo non verrà chiamato.

Caso 2: Quando si doppio tap pulsante Home, applicazione va a inattivo stato con il metodo chiamando - (1) applicationWillResignActive.

Ora quando si tenta di chiudere/terminare l'app, facendo scorrere verso l'alto la schermata dell'app corrente dalle ultime schermate dell'app, l'app si trova in stato inattivo (non in stato sospeso) mentre viene interrotta. Quindi, "applicationWillTerminate" verrà chiamato il metodo.

Guardate cosa dicono di Apple: enter image description here

Per maggiori informazioni su questo aspetto - Apple's Official Documentation on applicationWillTerminate(_:)

+0

Ottima risposta, grazie! Sarebbe bello avere anche un link alla documentazione di Apple. –

Problemi correlati