aplicación: didReceiveRemoteNotification: fetchCompletionHandler no llamado

Parece que la application:didReceiveRemoteNotification:fetchCompletionHandler función application:didReceiveRemoteNotification:fetchCompletionHandler no se llama cuando la aplicación se ha cerrado. Tenía la impresión de que la función se invocaría sin importar en qué estado se encontraba la aplicación, pero parece que solo se invoca si la aplicación ya se está ejecutando en segundo plano. ¿Hay alguna forma de activar una aplicación en segundo plano si aún no se está ejecutando utilizando el nuevo modo de fondo de notificación remota de iOS 7?

application:didReceiveRemoteNotification:fetchCompletionHandler: se llama incluso si la aplicación se suspende, no se ejecuta en absoluto, está en segundo plano o está activa. También vale la pena señalar que el método es iOS 7 solamente. Aquí está la documentación de la manzana .

SIN EMBARGO, si la aplicación fue cerrada a la fuerza (es decir, al matar con el selector de aplicaciones), la aplicación no se iniciará. (vea la respuesta SO ) EDITAR: Revisé esto nuevamente en iOS 7.1 para ver si lo arreglaron, pero aún sigue siendo el caso que si la aplicación se application:didReceiveRemoteNotification:fetchCompletionHandler: manualmente, la aplicación NO se application:didReceiveRemoteNotification:fetchCompletionHandler: y la application:didReceiveRemoteNotification:fetchCompletionHandler: no lo hará ser llamado

Al recibir el push, la aplicación solo se activa solo “si es necesario” para llamar a la application:didReceiveRemoteNotification:fetchCompletionHandler: method (es decir, debe establecer el indicador “content-available” dentro de la carga útil de notificaciones push. Consulte la respuesta SO ). El método se volverá a llamar si el usuario abre la aplicación tocando la notificación.

EDITAR: no he comprobado esto en iOS 8. ¿Alguien más?

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { //Remote Notification Info NSDictionary * remoteNotifiInfo = [launchOptions objectForKey: UIApplicationLaunchOptionsRemoteNotificationKey]; //Accept push notification when app is not open if (remoteNotifiInfo) { [self application:application didReceiveRemoteNotification: remoteNotifiInfo]; } return YES; } 

La aplicación debe ser lanzada incluso si no se está ejecutando. La documentación de Apple dice:

Cuando este valor está presente y una notificación push llega a un dispositivo, el sistema envía la notificación a su aplicación (la inicia si es necesario ) y le da unos minutos para procesar la notificación antes de mostrarle algo al usuario. (Guía de progtwigción de la aplicación iOS)

Cuando llega una notificación de inserción, el sistema muestra la notificación al usuario y la inicia en segundo plano (si es necesario) para que pueda llamar a este método. (Referencia del protocolo UIApplicationDelegate)

A diferencia de la aplicación: método didReceiveRemoteNotification: que se llama solo cuando se está ejecutando su aplicación, el sistema llama a este método independientemente del estado de su aplicación. Si su aplicación se suspende o no se ejecuta , el sistema se reactiva o inicia su aplicación y la pone en estado de funcionamiento en segundo plano antes de llamar al método. (Referencia del protocolo UIApplicationDelegate)

Sin embargo, cuando se prueba con “contenido disponible”: 1 empuja la aplicación nunca se inicia cuando no se está ejecutando. Cuando la aplicación se suspende, funciona.

¿Has encontrado una solución Wes?

Cuando su aplicación ha sido abandonada a la fuerza, ese método no se llama. En su lugar, como de costumbre, se (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions .

Si la aplicación se abrió tocando “Abrir” en una notificación emergente, la notificación se encuentra dentro de launchOptions .

Obtenga el diccionario de notificación push de esta manera:

 NSDictionary * pushNotificationUserInfo = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]; if (pushNotificationUserInfo) { // call your handler here } 

Según lo documentado por Apple, la nueva API multitarea (fetch y notificación remota) funcionará solo cuando la aplicación esté suspendida / en segundo plano / en primer plano .

  • En el estado de fondo / primer plano , entonces la application:didReceiveRemoteNotification:fetchCompletionHandler se activará.

  • En el estado Suspendido , entonces -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions se activará.

  • En el estado No se está ejecutando (su caso), la application:didReceiveRemoteNotification:fetchCompletionHandler nunca se activa.

Consulte la documentación de Apple para obtener más información sobre los estados de la aplicación.

Si fuerza a salir de una aplicación del selector de aplicaciones, no se lo despertará en segundo plano (por ningún medio) hasta después de la próxima vez que se inicie. Cuando fuerza a salir de una aplicación, le está diciendo efectivamente al sistema operativo que no desea que se ejecute esta aplicación, incluso si un evento de fondo normalmente lo hubiera despertado.

Vale la pena tener cuidado con esto durante las pruebas, ya que puede forzar el cierre de la aplicación para verificar que se lance a través de la notificación automática cuando la aplicación no se está ejecutando. De hecho, el uso de la fuerza para dejar de fumar será la razón por la cual no se iniciará.

A quién le importa en Swift 2.0, he resuelto mi problema de esta manera, es para el fondo

 if let remoteNotification = launchOptions?[UIApplicationLaunchOptionsRemoteNotificationKey] as? NSDictionary { pushNotificationAction(remoteNotification as [NSObject : AnyObject]) } 

Recientemente encontré el mismo problema, y ​​encontré que Apple actualizó su documentación y dice:

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.

aplicación (_: didReceiveRemoteNotification: fetchCompletionHandler 🙂

¿Entonces supongo que no hay forma de hacer nada cuando la aplicación es asesinada por la fuerza?