iphone - caracteristicas - applicationWillTerminate cuando se llama y cuando no
ios 6 (6)
Hola, he leído varias preguntas sobre SO sobre la aplicaciónWillTerminate al que se llama y no se llama.
Quería resumir lo que entendí, ya que hay varias publicaciones que hablan de manera diferente.
Para IOS (sin multitarea) se llama siempre cuando se presiona el botón de inicio.
Para iOS 4 y superior
a. no se llama al presionar el botón de inicio (cuando la aplicación se mueve al fondo)
segundo. se llama al cerrar la aplicación desde la base de tareas múltiples y si la aplicación tiene un indicador de finalización repentina en info.plist desactivado, en caso contrario no se llama. (Configuré la "Aplicación debería recibir eventos App Died" e incluso al cerrar la aplicación desde el puerto multitarea no se llamó a la función terminar)
Basado en eso tuve un par de preguntas
¿Es una buena práctica establecer que la aplicación debe obtener el indicador de eventos App Died? (Configuré la "Aplicación debería recibir eventos App Died" e incluso al cerrar la aplicación desde el puerto multitarea no se llamó a la función terminar)
o
¿Es mejor registrarse para "UIApplicationWillTerminateNotification" que la configuración de info.plist?
Básicamente, necesito hacer algo de trabajo solo cuando la aplicación termina y NO cuando se mueve a fondo.
o
EDITAR (1): cuando finaliza la aplicación, se envía lo siguiente a la aplicación. ¿Cómo lo atrapo?
Señal recibida del programa: "SIGKILL".
EDITAR (2):
Tenga en cuenta: no se llama en IOS 4 y superior cuando se elimina desde el puerto multitarea. Usted puede pensar que es. Pero en mi caso no es así.
Estoy preguntando si alguien sabe por qué? ¿Hay algo más que me estoy perdiendo?
También tenga en cuenta que configuro "La aplicación debería recibir eventos App Died" y aun así no se está llamando.
EDITAR (3):
La respuesta para la siguiente pregunta tampoco funcionó. applicationWillTerminate no se invoca
¿Alguien enfrenta el problema similar a mí?
// aplicación de respuesta absolutaWillTerminate
func applicationWillTerminate (application: UIApplication) {
print("applicatoinWillTerminate")
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}
paso 1: comando + shift + h (doble clic (pestaña))
paso 2: mover el lado superior de la aplicación (matar)
paso 3: trabajo de ApplicationWillTerminate
Como sé, hay 3 situaciones en las que su aplicación morirá.
Terminado por el usuario final, puede hacer algo en
-[UIApplication applicationWillEnterBackground:]
, en cuyo caso,-[UIApplication applicationWillTerminate:]
NO se llamará.Abandonado por el sistema, como la memoria no es suficiente, puede hacer algo en
-[UIApplication applicationWillTerminate:]
, en cuyo caso, NO sabemos siapplicationWillEnterBackground:
ha sido llamado;Se estrelló, no se puede hacer nada excepto utilizar algún tipo de herramienta de informe de bloqueo. (Editado: capturar
SIGKILL
es imposible)
Como sabemos, la aplicación tiene solo 5 segundos cuando se llama a -applicationWillTerminate
. Entonces, si alguien quiere actualizar el servidor en ese punto. Que utilizar llamada síncrona.
[NSURLConnection sendSynchronousRequest:urlRequest returningResponse:nil error:&error];
Nota: - -applicationWillTerminate
no llamará si la aplicación está siendo eliminada del estado suspendido. Estado suspendido significa que la aplicación no funciona en backgroupd. Una de las soluciones para esto es usar una tarea en segundo plano.
Fuente: http://www.cocos2d-iphone.org/forum/topic/7386
Copié mi código de estado de ahorro de applicationWillTerminate a applicationDidEnterBackground y también agregué un booleano multitaskingEnabled para que solo llame al estado de ahorro en applicationDidEnterBackground. PORQUE, hay una instancia en un dispositivo multitarea donde se llama applicationWillTerminate: si la aplicación está en primer plano y usted apaga el dispositivo. En ese caso, se llama tanto a applicationDidEnterBackground como a applicationWillTerminate.
Veo -applicationWillTerminate:
recibir una llamada con la siguiente prueba. En un nuevo proyecto (utilicé la plantilla ''Aplicación de vista única''), agregue lo siguiente a AppDelegate:
- (void)applicationDidEnterBackground:(UIApplication *)application
{
NSLog(@"%s", __PRETTY_FUNCTION__);
__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;
}
});
}
- (void)applicationWillTerminate:(UIApplication *)application
{
NSLog(@"%s", __PRETTY_FUNCTION__);
}
Este ejemplo iniciará una tarea en segundo plano cuando la aplicación entre en el fondo. La tarea es solo un retraso de 20 segundos (con el registro una vez por segundo) que mantiene la aplicación ejecutándose en segundo plano (tenga en cuenta la diferencia entre ejecutarse en segundo plano y suspendido) el tiempo suficiente para permitir que se elimine del conmutador de la aplicación.
Por lo tanto, para probarlo, ejecute la aplicación, presione el botón de inicio para enviar la aplicación al fondo, luego, antes de que se agote la demora de 20 segundos, elimine la aplicación del selector de aplicaciones. Después del final de los años 20, se llama -applicationWillTerminate:
Puede ver la consola en Xcode para verificar que este sea el caso.
Intenté esto en iOS Simulator para iOS 5.1 y 6.1 (ambos iPhone) y lo vi suceder en ambos casos. También probé en el iPhone 4S con iOS 6.1.2 y vi el mismo comportamiento.
En resumen, a menos que tenga UIApplicationExitsOnSuspend
en su Info.plist establecido en SÍ, en iOS4 y superior no hay garantía de que applicationWillTerminate:
alguna vez se llame.
Como dice la documentación :
Para las aplicaciones que admiten la ejecución en segundo plano, este método generalmente no se llama cuando el usuario abandona la aplicación porque la aplicación simplemente se mueve hacia el fondo en ese caso. Sin embargo, este método se puede invocar en situaciones en las que la aplicación se ejecuta en segundo plano (no se suspende) y el sistema debe finalizarlo por algún motivo.
(Énfasis mío)
Si necesita hacer algo antes de que la aplicación salga, debe hacerlo en applicationDidEnterBackground:
No hay forma de atrapar SIGKILL.