iphone - restricciones - Cuando una aplicación de iOS pasa a segundo plano, ¿se detienen las tareas largas?
mi iphone 6 no enciende (3)
Sí, sé que si deseo que mi aplicación responda a las acciones de multitarea de los usuarios, como cambiar a otra aplicación, debería tratar con
- (void)applicationWillResignActive:(UIApplication *)application
- (void)applicationDidBecomeActive:(UIApplication *)application
¿Qué sucede si mi aplicación está realizando una operación bastante larga (como la descarga de un archivo grande) y el usuario hace que mi aplicación entre en segundo plano? ¿Esa operación se suspenderá automáticamente y se reanudará cuando el usuario regrese a mi aplicación?
¿Qué sucederá exactamente detrás de la escena cuando mi aplicación entre en el fondo o se reanude en primer plano?
¿Qué ocurre si, cuando los usuarios dejan que mi aplicación se quede en segundo plano, la ejecución de mi aplicación está en medio de un método?
Por ejemplo, mi aplicación está haciendo
for (int i = 1 to 10000K) {
do some calculation;
}
Cuando i == 500K, el usuario cambia a otra aplicación. ¿Qué sucede con el bucle for en mi aplicación?
Como se mencionó anteriormente, hay algunos casos en los que su aplicación se ejecuta en segundo plano y Apple puede permitir o denegar dependiendo de lo que esté haciendo.
Lo que es más importante si encajas en una de estas categorías, la frecuencia de actualización de tu aplicación está determinada por un algoritmo Apple que toma en consideración el uso de tu aplicación en ese dispositivo frente a otras aplicaciones. Si su aplicación se usa con más frecuencia, se le asigna más tiempo de fondo. Esta es solo una variable, pero se tiene la idea de que la asignación de tiempo en segundo plano varía de una aplicación a otra y no bajo tu control.
De la Guía de programación de aplicaciones de iOS :
El método
applicationDidEnterBackground:
tu aplicación delegadoapplicationDidEnterBackground:
tiene aproximadamente 5 segundos para finalizar cualquier tarea y regresar. En la práctica, este método debe regresar lo más rápido posible. Si el método no regresa antes de que se acabe el tiempo, tu aplicación se eliminará y se purgará de la memoria. Si aún necesita más tiempo para realizar tareas, llame al métodobeginBackgroundTaskWithExpirationHandler:
para solicitar un tiempo de ejecución en segundo plano y luego comience cualquier tarea de larga ejecución en un hilo secundario. Independientemente de si inicia cualquier tarea en segundo plano, el métodoapplicationDidEnterBackground:
debe salir en 5 segundos.
Si la operación de larga duración que describe arriba está en el hilo principal y tarda más de 5 segundos en finalizar después de que su aplicación se dirige al fondo, su aplicación será eliminada. El hilo principal será bloqueado y no tendrás la posibilidad de regresar de -applicationDidEnterBackground:
a tiempo.
Si su tarea se ejecuta en un hilo de fondo (y realmente debería ser así, si tarda mucho en ejecutarse), ese hilo parece estar en pausa si la aplicación regresa de -applicationDidEnterBackground:
(de acuerdo con la discusión en esta respuesta ). Se reanudará cuando la aplicación vuelva al primer plano.
Sin embargo, en este último caso, debe estar preparado para que su aplicación finalice en cualquier momento mientras está en segundo plano al limpiar las cosas en el camino hacia el fondo.
Si está realizando alguna operación que podría consumir tiempo y no desea eliminarla, puede ampliar el tiempo de su operación ejecutando en UIBackground Task i
{
UIBackgroundTaskIdentifier taskId = 0;
taskId = [application beginBackgroundTaskWithExpirationHandler:^{
taskId = UIBackgroundTaskInvalid;
}];
// Execute long process. This process will have 10 mins even if your app goes in background mode.
}
El argumento de bloque llamado "controlador" es lo que sucederá cuando la tarea de fondo expire (10min). Aquí hay un enlace a la documentation