Manejando Notificaciones Push cuando la Aplicación se termina

Cuando mi aplicación no se está ejecutando y recibe una notificación de inserción, si hago clic en esa notificación, se inicia la aplicación, pero luego no se inicia al usuario con Alert-View que configuro, preguntándoles si desean ver el Contenidos de la notificación o no. Simplemente se inicia y se sienta allí.

Las notificaciones push funcionan perfectamente cuando la aplicación se está ejecutando, ya sea como la aplicación activa o mientras está en segundo plano, pero nada funciona correctamente cuando la aplicación no se está ejecutando.

Intenté cerrar la sesión de launchOptions NSDictionary en la aplicación: didFinishLaunchingWithOptions: para ver qué carga está trayendo, pero aparece como “(nulo)”. Entonces, básicamente, no contiene nada, lo cual no tiene sentido porque no debería contener la carga de la Notificación.

¿Alguien tiene alguna idea de cómo hacer que las Notificaciones Push funcionen cuando llegan mientras la aplicación NO se estaba ejecutando?

Me refiero a cómo manejar las notificaciones Push cuando la aplicación no está funcionando. ¿Qué sucede si, si recibe muchas notificaciones y no abrió la aplicación, tampoco tocó el panel de notificaciones del sistema? ¿Cómo se preservan esos impulsos para una recuperación posterior?

Según su pregunta, no hay forma de mantener todas las notificaciones cuando abre la aplicación, mejor llame a una API para recibir todas las notificaciones según la marca de tiempo de su back-end / servidor, tal como lo hace Facebook.

1) Cuando la aplicación se ejecuta en segundo plano y Cuando la aplicación se ejecuta en la application:didReceiveRemoteNotification: en primer plano application:didReceiveRemoteNotification: método se llamará como se application:didReceiveRemoteNotification: continuación.

 - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { if (application.applicationState == UIApplicationStateInactive) { // opened from a push notification when the app was on background NSLog(@"userInfo->%@", [userInfo objectForKey:@"aps"]); } else if(application.applicationState == UIApplicationStateActive) { // a push notification when the app is running. So that you can display an alert and push in any view NSLog(@"userInfo->%@", [userInfo objectForKey:@"aps"]); } } 

2) Cuando la aplicación no se inicia (cerrar), se application:didFinishedLaunchingWithOptions .

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { if (launchOptions != nil) { // opened from a push notification when the app is closed NSDictionary* userInfo = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]; if (userInfo != nil) { NSLog(@"userInfo->%@", [userInfo objectForKey:@"aps"]); } } else { // opened app without a push notification. } } 

3) No hay forma de eliminar una notificación específica a partir de. La forma de eliminar todas las notificaciones de su aplicación para que no se muestren en el Centro de notificaciones cuando el usuario abre la aplicación desde una de ellas, es establecer la insignia de la aplicación en 0.

La aplicación no procesa la notificación push en segundo plano, lo que realmente hace el sistema operativo es activar la aplicación una vez que presiona la notificación. Puedes ver este momento de la siguiente manera:

  - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { if ([launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]) { // Your app has been awoken by a notification... } } 

Puede recuperar notificaciones entregadas a su aplicación utilizando el getDeliveredNotifications(completionHandler:) . Tenga en cuenta que esto solo devuelve las notificaciones que se muestran actualmente en el Centro de notificaciones y no las que el usuario borró manualmente.

 UNUserNotificationCenter.current().getDeliveredNotifications { notifications in // notifications: An array of UNNotification objects representing the local // and remote notifications of your app that have been delivered and are still // visible in Notification Center. If none of your app's notifications are // visible in Notification Center, the array is empty. // As said in the documentation, this closure may be executed in a background // thread, so if you want to update your UI you'll need to do the following: DispatchQueue.main.sync { /* or .async {} */ // update UI } } 

No hay forma de manejar esto al final de la aplicación. Debería mantener el recuento de distintivos no leídos en el servidor. Cuando se elimina la aplicación, el valor de la insignia se actualiza desde el servidor.

Entonces, cuando abras la aplicación en cualquier momento, necesitarás llamar a un servicio web para obtener las notificaciones requeridas y actualizar las insignias de tabbar (si se usa).

Puede mostrar la alerta después de iniciar una aplicación finalizada previamente a partir de una notificación como esta:

DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.1) { // display the alert }