¿IOS lanzará mi aplicación en segundo plano si el usuario abandonó la aplicación forzosamente?

Estoy activando una búsqueda de fondo utilizando el indicador de content-available en una notificación de inserción. Tengo habilitados los UIBackgroundModes fetch y remote-notification UIBackgroundModes .

Aquí está la implementación que estoy usando en mi AppDelegate.m:

 - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler { NSLog(@"Remote Notification Recieved"); UILocalNotification *notification = [[UILocalNotification alloc] init]; notification.alertBody = @"Looks like i got a notification - fetch thingy"; [application presentLocalNotificationNow:notification]; completionHandler(UIBackgroundFetchResultNewData); } 

Cuando la aplicación se ejecuta en segundo plano, funciona bien. (Se recibió la notificación y la aplicación activó la notificación local “parece que recibí una notificación”, como debería hacerlo el código anterior).

Sin embargo, cuando la aplicación no se está ejecutando y se recibe una notificación de inserción con el indicador de content-available , la aplicación no se inicia y nunca se llama al método delegado didRecieveRemoteNotification .

El video WWDC ¿ Qué hay de nuevo con la multitarea? (# 204 de la WWDC 2013) muestra esto: enter image description here

Dice que la aplicación se “inicia en segundo plano” cuando se recibe una notificación de inserción con el indicador de content-available .

¿Por qué mi aplicación no se está ejecutando en segundo plano?

Entonces la verdadera pregunta es:

¿Realizará iOS tareas en segundo plano después de que el usuario haya forzado la salida de la aplicación?

ACTUALIZACIÓN2:

Puede lograr esto utilizando el nuevo marco PushKit, introducido en iOS 8. Aunque PushKit se usa para VoIP. Por lo tanto, su uso debe ser para VoIP, de lo contrario existe el riesgo de rechazo de la aplicación. (Ver esta respuesta ).


UDPDATE1:

La documentación ha sido aclarada para iOS8 . La documentación se puede leer aquí . Aquí hay un extracto relevante:

Utiliza este método para procesar notificaciones remotas entrantes para tu aplicación. A diferencia de la application:didReceiveRemoteNotification: método application:didReceiveRemoteNotification: que se llama solo cuando su aplicación se ejecuta en primer plano, el sistema llama a este método cuando su aplicación se ejecuta en primer plano o en segundo plano. Además, si habilitó el modo de fondo de notificaciones remotas, el sistema inicia su aplicación (o la activa desde el estado suspendido) y la pone en segundo plano cuando llega una notificación de envío. Sin embargo, el sistema no inicia automáticamente su aplicación si el usuario lo ha abandonado. En esa situación, el usuario debe reiniciar su aplicación o reiniciar el dispositivo antes de que el sistema intente iniciar su aplicación de nuevo automáticamente.


Aunque esto no quedó claro con el video de WWDC, una búsqueda rápida en los foros de desarrolladores dio como resultado esto:

https://devforums.apple.com/message/873265#873265 (se requiere iniciar sesión)

También tenga en cuenta que si elimina su aplicación del conmutador de la aplicación (es decir, desliza el dedo hacia arriba para matar la aplicación), entonces el sistema operativo nunca volverá a iniciar la aplicación, independientemente de la notificación de inserción o de la obtención del fondo. En este caso, el usuario tiene que volver a iniciar manualmente la aplicación una vez y luego desde ese punto en adelante se invocarán las actividades de fondo. – pmarcos

Esa publicación fue por un empleado de Apple, así que creo que puedo confiar en que esta información es correcta.

Por lo tanto, parece que cuando la aplicación se elimina del conmutador de aplicaciones (deslizando hacia arriba), la aplicación nunca se iniciará, incluso para las búsquedas de fondo progtwigdas.

Puede cambiar la configuración de inicio de su objective en “Gestionar esquema” en Wait for .app to be launched manually , lo que le permite depurar configurando un punto de interrupción en la application: didReceiveRemoteNotification: fetchCompletionHandler: y enviando la notificación push para activar el lanzamiento de fondo .

No estoy seguro de que esto resuelva el problema, pero puede ayudarte con la depuración por ahora.

captura de pantalla

La respuesta es SÍ, pero no debe usar “Captura de fondo” o “Notificación remota”. PushKit es la respuesta que deseas.

En resumen, PushKit, el nuevo framework en iOS 8, es el nuevo mecanismo de notificación push que puede iniciar silenciosamente tu aplicación en segundo plano sin un aviso visual de alerta, incluso tu aplicación se eliminó deslizándote desde el conmutador de aplicaciones, sorprendentemente ni siquiera puedes verlo desde el selector de aplicaciones.

Referencia PushKit de Apple:

El marco PushKit proporciona las clases para que sus aplicaciones iOS reciban impulsos desde servidores remotos. Los empujes pueden ser de uno de dos tipos: estándar y VoIP. Los empujes estándar pueden entregar notificaciones al igual que en versiones anteriores de iOS. Los impulsos de VoIP brindan funcionalidad adicional además del impulso estándar que se necesita para que las aplicaciones de VoIP realicen el procesamiento bajo demanda de la inserción antes de mostrar una notificación al usuario.

Para implementar esta nueva característica, consulte este tutorial: https://zeropush.com/guide/guide-to-pushkit-and-voip – Lo probé en mi dispositivo y funciona como se esperaba.

En realidad, si necesita probar la obtención de fondos, debe habilitar una opción en el esquema:

Permitiendo bg fetch

Otra forma de cómo puedes probarlo: simular bg fetch

Aquí hay información completa sobre esta nueva característica: http://www.objc.io/issue-5/multitasking.html

He estado probando diferentes variantes de esto por días, y pensé por un día que lo tenía relanzando la aplicación en segundo plano, incluso cuando el usuario se las arregló para matar, pero no, no puedo replicar ese comportamiento.

Es desafortunado que el comportamiento sea bastante diferente que antes. En iOS 6, si eliminaste la aplicación de los íconos oscilantes, todavía se volvería a reactivar en los activadores de SLC. Ahora, si matas al deslizar, eso no sucede.

Es un comportamiento diferente, y el usuario, que continuaría obteniendo información útil de nuestra aplicación si lo hubieran matado en iOS 6, ahora no lo hará.

Necesitamos animar a nuestros usuarios a que vuelvan a abrir la aplicación ahora si han pasado para matarla y todavía esperan algo del comportamiento de notificación que solíamos darles. Me preocupa que esto no sea obvio para los usuarios cuando eliminan una aplicación. Después de todo, pueden ser, básicamente, limpiar o querer reorganizar las aplicaciones que se muestran minimizadas.

Esto podría ayudarte

En la mayoría de los casos, el sistema no reinicia las aplicaciones una vez que el usuario las abandona por la fuerza. Una excepción son las aplicaciones de ubicación, que en iOS 8 y posteriores se relanzan después de que el usuario abandonara la fuerza. En otros casos, sin embargo, el usuario debe iniciar la aplicación explícitamente o reiniciar el dispositivo antes de que el sistema pueda iniciar automáticamente la aplicación en segundo plano. Cuando la protección por contraseña está habilitada en el dispositivo, el sistema no inicia una aplicación en segundo plano antes de que el usuario desbloquee el dispositivo por primera vez.

Fuente: https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html