Actualizar insignia con notificación push mientras la aplicación está en segundo plano

He activado la notificación de inserción y he logrado actualizar el recuento de insignias de icons cuando la aplicación se pone en primer plano.

Sin embargo, estoy un poco confundido acerca de esto … el iPhone recibe la notificación y aparece el mensaje emergente para activar mi aplicación, y la insignia solo se actualiza después de que inicie la aplicación.

Esto no suena bien en términos de experiencia del usuario. Tengo entendido que el recuento de distintivos debe notificar al usuario de lo que necesita acción, a través del recuento incrementado, pero esto no ocurre hasta una etapa posterior cuando la aplicación está en vivo.

Entonces, ¿hay alguna manera de decirle a la aplicación que actualice el recuento de distintivos cuando recibe notificaciones automáticas y mientras está en segundo plano?

Tenga en cuenta que mi aplicación no usa la ubicación y que tengo UIRemoteNotificationTypeBadge en la solicitud de registro de notificación.

Saludos AF

Dado que iOS y no su aplicación manejan la notificación push, no puede cambiar la insignia de la aplicación al recibir una notificación push.

Pero puede enviar el número de placa en la carga de la notificación de inserción, pero tendrá que hacer el lado del servidor de cálculo.

Debe leer la Guía de progtwigción de notificaciones locales y automáticas y especialmente la Carga útil de notificaciones .

La carga útil podría verse así:

 { "aps" : { "alert" : "You got your emails.", "badge" : 9 } } 

Ahora el ícono de la insignia de la aplicación de aplicación mostrará 9.

Podemos modificar el número de la insignia cuando estamos en el estado de fondo enviando el parámetro “insignia” en el paquete de notificación de inserción. Como @rckoenes señaló que el parámetro JSON para la insignia debe ser INTEGER .

Ejemplo de código PHP para hacer lo mismo

 // Create the payload body $body['aps'] = array( 'alert' => $message, 'badge' => 1, 'sound' => 'default' ); 

badge => 1 donde 1 es un número entero, no una cadena (es decir, sin apostropías)

  **This is the APNS payload get back from server.** { "aps" : { "alert" : "You got your emails.", "badge" : 9, "sound" : "bingbong.aiff" }, "acme1" : "bar", "acme2" : 42 } 

El valor de la insignia de la llave se considera automáticamente como el recuento de la insignia. En el lado de la aplicación ios, no es necesario calcular ni manejar el recuento. En el ejemplo 9 anterior, se muestra el número de distintivos. Por lo tanto, el ícono de su aplicación mostrará 9.

NOTA: cuando su aplicación está cerca, no puede manejar las insignias por su cuenta. Por qué estamos utilizando la clave de identificación de la carga útil de APNS Para una mejor aclaración sobre la notificación, consulte la documentación.

si desea reducir el recuento de distintivos por su cuenta. Degrade el recuento y actualícelo usted mismo.

Si está utilizando NotificationServiceExtension, puede actualizar la insignia en eso.

 var bestAttemptContent : UNMutableNotificationContent? // bestAttemptContent.badge = 0//any no you wanna display 

Cada vez que su aplicación reciba una notificación, se llamará a su extensión de servicio. Guarde ese valor en el valor predeterminado del usuario y muéstrelo. Para compartir los valores predeterminados del usuario entre la aplicación y la extensión, debe habilitar el grupo de aplicaciones en la aplicación. Leer más aquí

Desde iOS 10 puedes desarrollar una extensión del Servicio de notificación para tu aplicación. El sistema lo iniciará cuando reciba una notificación y podrá calcular un número válido para la insignia y establecerlo.

Eche un vistazo a la documentación: https://developer.apple.com/documentation/usernotifications/unnotificationserviceextension

 -(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { application.applicationIconBadgeNumber = 0; NSLog(@"userInfo %@",userInfo); for (id key in userInfo) { NSLog(@"key: %@, value: %@", key, [userInfo objectForKey:key]); } [application setApplicationIconBadgeNumber:[[[userInfo objectForKey:@"aps"] objectForKey:@"badge"] intValue]]; NSLog(@"Badge %d",[[[userInfo objectForKey:@"aps"] objectForKey:@"badge"] intValue]); } 

Como @rckoenes dijo que tendrías que hacer el lado del servidor de cálculo, pero ¿cómo podrías saber cuándo incrementar el valor del número de la insignia que deberías enviar en la carga útil ?.

Cuando lance la aplicación, envíe un mensaje a su servidor que indique que la aplicación se ha iniciado. Por lo tanto, en el lado del servidor, comienza de nuevo desde badge = 0, y mientras el servidor no recibe mensajes, aumente el número de la insignia con cada carga de notificación push.

Después de recibir la notificación remota cuando abre la aplicación,

obtén el número de didBecomeActive actual en el didBecomeActivedidBecomeActive ” de tu AppDelegate .

Archivo usando el siguiente código:

 int badgeCount = [UIApplication sharedApplication].applicationIconBadgeNumber; badgeCount = badgeCount + 1;