Estoy activando una búsqueda de fondo usando la content-available
bandera en una notificación push. Tengo el fetch
y remote-notification
UIBackgroundModes
habilitado.
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 recibe la notificación y la aplicación activó la notificación local "Parece que recibí una notificación", como debería hacer el código anterior).
Sin embargo, cuando la aplicación no se está ejecutando y se recibe una notificación push con el content-available
indicador, la aplicación no se inicia y didRecieveRemoteNotification
nunca se llama al método delegado.
El video WWDC Qué hay de nuevo con la multitarea (# 204 de WWDC 2013) muestra esto:
Dice que la aplicación se "inicia en segundo plano" cuando se recibe una notificación push con la content-available
bandera.
¿Por qué mi aplicación no se inicia en segundo plano?
Entonces la verdadera pregunta es:
¿IOS realizará tareas en segundo plano después de que el usuario haya forzado el cierre de la aplicación?
fuente
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
Respuestas:
ACTUALIZACIÓN2:
Usted puede lograr esto mediante el nuevo marco PushKit, introducido en iOS 8. Aunque PushKit se utiliza para VoIP. Por lo tanto, su uso debe estar relacionado con 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:
Aunque esto no fue aclarado por el video de WWDC, una búsqueda rápida en los foros de desarrolladores reveló esto:
https://devforums.apple.com/message/873265#873265 (se requiere inicio de sesión)
Esa publicación fue de 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 recuperaciones de fondo programadas.
fuente
Puede cambiar la configuración de inicio de su objetivo en "Administrar esquema" a
Wait for <app>.app to be launched manually
, lo que le permite depurar estableciendo un punto de interrupciónapplication: didReceiveRemoteNotification: fetchCompletionHandler:
y enviando la notificación de inserción para activar el inicio en segundo plano.No estoy seguro de que resuelva el problema, pero puede ayudarlo con la depuración por ahora.
fuente
La respuesta es SÍ, pero no debe usar 'Recuperación en segundo plano' o 'Notificación remota'. PushKit es la respuesta que deseas.
En resumen, PushKit, el nuevo marco en ios 8, es el nuevo mecanismo de notificación de inserción que puede iniciar silenciosamente su aplicación en segundo plano sin avisos de alerta visual, incluso si su aplicación fue eliminada al deslizar el interruptor de la aplicación, sorprendentemente, incluso no puede verla desde el conmutador de aplicaciones.
Referencia de PushKit de Apple:
Para implementar esta nueva función, consulte este tutorial: https://zeropush.com/guide/guide-to-pushkit-and-voip : lo probé en mi dispositivo y funciona como se esperaba.
fuente
En realidad, si necesita probar la recuperación en segundo plano, debe habilitar una opción en el esquema:
Otra forma de probarlo:
Aquí hay información completa sobre esta nueva característica: http://www.objc.io/issue-5/multitasking.html
fuente
He estado probando diferentes variantes de esto durante días, y pensé que por un día tuve que volver a iniciar la aplicación en segundo plano, incluso cuando el usuario se deslizó para matar, pero no, no puedo replicar ese comportamiento.
Es lamentable que el comportamiento sea bastante diferente al anterior. En iOS 6, si eliminas la aplicación de los íconos que se mueven, aún se volverá a despertar con los activadores 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 la hubiera matado en iOS 6, ahora no lo hará.
Necesitamos empujar a nuestros usuarios para que vuelvan a abrir la aplicación ahora si han deslizado para matarla y todavía esperan algunos de los comportamientos de notificación que solíamos darles. Me preocupa que esto no sea obvio para los usuarios cuando deslizan una aplicación. Después de todo, pueden estar básicamente limpiando o queriendo reorganizar las aplicaciones que se muestran minimizadas.
fuente
Esto podría ayudarte
Fuente: https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html
fuente
El enlace del video: https://developer.apple.com/videos/play/wwdc2019/707/
fuente