Notificación de Apple Push en un problema de background

Estoy usando parse.com como proveedor de APN para una aplicación de testing que estoy creando. He confirmado que las notifications push funcionan, ya que he podido recibir alertas con éxito cuando la aplicación está en primer plano. Además, tengo el valor de remote-notification para la key UIBackgroundModes especificada en mi plist.

En mi aplicación, quiero enviar los datos de location actuales de un usuario a la database de mi parse.com específica de la aplicación cuando se recibe una notificación de inserción. Realmente no me importa la carga de notificación en sí, ya que la notificación es solo un medio para get una pequeña información. La aplicación recostack constantemente los datos en segundo plano y los almacena en un persistente NSDictionary .

He puesto el código de envío de location en la application:didReceiveRemoteNotification: method. Si mi aplicación está en primer plano cuando recibo una notificación, se invoca el método. Si mi aplicación está en segundo plano, no se llama al método.

  • ¿Estoy haciendo algo mal?
  • ¿Incluso es posible ejecutar una request de API en la application:didReceiveRemoteNotification: cuando la aplicación está en segundo plano y el usuario no ha interactuado con la notificación? **

EDITAR: El problema persiste incluso cuando uso la application:didReceiveRemoteNotification:fetchCompletionHandler:

Nota: Mi NSDictionary lleno de datos de location no está vacío. Además, no estoy intentando hacer ninguna manipulación de interfaz de usuario en segundo plano, simplemente tratando de realizar una request de API.

Compruebe lo siguiente:

  • La carga de la notificación incluye "contenido disponible"
 {"alert":"", "badge":"0", "content-available":"1", "sound":""} 

La documentation para UIApplicationDelegate -application: didReceiveRemoteNotification es bastante clara en este método:

Si la aplicación no se está ejecutando cuando llega una notificación push, el método inicia la aplicación y proporciona la información adecuada en el dictionary de opciones de lanzamiento. La aplicación no llama a este método para manejar esa notificación de inserción. En su lugar, su implementación de la aplicación: willFinishLaunchingWithOptions: o application: didFinishLaunchingWithOptions: method necesita get los datos de la carga de notifications push y responder adecuadamente.

Debe manejar notifications en ambos methods para poder responder cuando su aplicación esté en segundo plano y en primer plano.

puedes intentar usar esto en lugar de

 application:didReceiveRemoteNotification 

método, ya que necesita search su push en el modo de background, por lo tanto, esto funcionaría cuando la aplicación esté en modo de background. Sin embargo, es posible que tenga que agregar notifications personalizadas o UIAlertView cuando la aplicación esté en primer plano para mostrar su post. Espero que ayude y no es demasiado tarde.

 - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler { NSLog(@"Remote Notification Received: %@", userInfo); UILocalNotification *notification = [[UILocalNotification alloc] init]; notification.alertBody = @"message to be displayed"; notification.applicationIconBadgeNumber = 1; [[UIApplication shanetworkingApplication] presentLocalNotificationNow:notification]; completionHandler(UIBackgroundFetchResultNewData); } 

La respuesta de Alex L's trabajó para mí.

Solo asegúrese de que el valor del content-available sea ​​1 (número), no una cadena "1":

 { "alert":"", "content-available":1, "sound":"" } 

badge parámetro de la badge es opcional.

(Uso de Parse Server para APN)