Notificación de inserción de iOS: ¿cómo detectar si el usuario hizo tapping en la notificación cuando la aplicación está en segundo plano?

Hay muchos hilos de stackoverflow con respecto a este tema, pero aún no encontré una buena solución.

Si la aplicación no está en segundo plano, puedo verificar launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey] en la application:didFinishLaunchingWithOptions: llame para ver si está abierto desde una notificación.

Si la aplicación está en segundo plano, todas las publicaciones sugieren utilizar la application:didReceiveRemoteNotification: y verifica el estado de la aplicación. Pero a medida que experimenté (y también como sugiere el nombre de esta API), se llama a este método cuando se recibe la notificación, en lugar de presionarse.

Entonces, el problema es si la aplicación se inicia y luego funciona, y usted sabe que se recibió una notificación de la application:didReceiveNotification ( application:didFinishLaunchWithOptions: no se activará en este momento), ¿cómo sabe si el usuario reanudó la aplicación? tocando la notificación o simplemente tocando el ícono de la aplicación? Porque si el usuario toca la notificación, la expectativa es abrir la página mencionada en esa notificación. De lo contrario, no debería.

Podría usar handleActionWithIdentifier para notificaciones de acciones personalizadas, pero esto solo se activa cuando se toca un botón de acción personalizado, no cuando el usuario toca el cuerpo principal de la notificación.

Gracias.

EDITAR:

después de leer una respuesta a continuación, pensé de esta manera que puedo aclarar mi pregunta:

¿Cómo podemos diferenciar estos 2 escenarios?

(A) 1.app va al fondo; 2. notificación recibida; 3. el usuario toca la notificación; 4. la aplicación entra en primer plano

(B) 1.app va al fondo; 2. notificación recibida; 3. el usuario ignora la notificación y toca el icono de la aplicación más tarde; 4. la aplicación entra en primer plano

Desde la application:didReceiveRemoteNotification: se desencadena en ambos casos en el paso 2.

O, ¿debe la application:didReceiveRemoteNotification: en el paso 3 solo para (A), pero de alguna manera configuré la aplicación incorrecta, así que la estoy viendo en el paso 2?

OK, finalmente lo descubrí.

En la configuración de destino tab application:didReceiveRemoteNotification: ➝ Modos de fondo, si application:didReceiveRemoteNotification: “Notificaciones remotas”, la application:didReceiveRemoteNotification: se activará tan pronto como llegue la notificación (siempre que la aplicación esté en segundo plano), y en ese caso no habrá forma de saber si el usuario tocará en la notificación.

Si desmarca esa casilla, la application:didReceiveRemoteNotification: se activará solo cuando toque la notificación.

Es un poco extraño que marcar esta casilla cambie la forma en que se comporta uno de los métodos de delegado de la aplicación. Sería mejor si se marca esa casilla, Apple usa dos métodos de delegado diferentes para notificación de recepción y toque de notificación. Creo que la mayoría de los desarrolladores siempre quieren saber si se toca una notificación o no.

Espero que esto sea útil para cualquier otra persona que se encuentre con este problema. Apple tampoco lo documentó claramente aquí, así que me tomó un tiempo darme cuenta.

enter image description here

He estado buscando lo mismo que usted y en realidad encontré una solución que no requiere que se marque la notificación remota.

Para verificar si el usuario ha tocado, o la aplicación está en segundo plano o está activa, solo tiene que verificar el estado de la aplicación en

 -(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{ if(application.applicationState == UIApplicationStateActive) { //app is currently active, can update badges count here }else if(application.applicationState == UIApplicationStateBackground){ //app is in background, if content-available key of your notification is set to 1, poll to your backend to retrieve data and update your interface here }else if(application.applicationState == UIApplicationStateInactive){ //app is transitioning from background to foreground (user taps notification), do what you need when user taps here } 

Para más información, verifique:

Referencia de UIKit Framework> Referencia de la clase UIApplication> UIApplicationState

De acuerdo con iOS / XCode: ¿cómo saber que la aplicación se ha lanzado con un clic en notificación o en el icono de la aplicación de trampolín? tienes que verificar el estado de la aplicación en didReceiveLocalNotification de esta manera:

 if ([UIApplication sharedApplication].applicationState == UIApplicationStateInactive) { // user has tapped notification } else { // user opened app from app icon } 

Aunque no tiene mucho sentido para mí, parece funcionar.

Si alguien lo quiere en veloz 3.0

 switch application.applicationState { case .active: //app is currently active, can update badges count here break case .inactive: //app is transitioning from background to foreground (user taps notification), do what you need when user taps here break case .background: //app is in background, if content-available key of your notification is set to 1, poll to your backend to retrieve data and update your interface here break default: break } 

Si tiene “Modos de fondo”> “Notificaciones remotas” marcadas == SÍ, toque evento de notificación llegará en:

 -(void)userNotificationCenter:(UNUserNotificationCenter *)center **didReceiveNotificationResponse**:(UNNotificationResponse *)response withCompletionHandler:(void(^)())completionHandler. 

Me ayudó. Por favor, disfruta 🙂

También encontré este problema, pero en iOS 11 con el nuevo UserNotifications Framework.

Aquí para mí es así:

  • Nuevo lanzamiento: application:didFinishLaunchingWithOptions:
  • Recibido en primer plano: application:didReceiveRemoteNotification:fetchCompletionHandler:
  • Recibido en Background: userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler:

En mi caso, el modo de fondo OFF no hizo ninguna diferencia. Sin embargo, cuando la aplicación se suspendió y el usuario tocó la notificación, pude manejar el caso en este método de callback:

 func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) { } 

Puede configurar la carga útil de su notificación push para llamar a la aplicación del delegado de application:didReceiveRemoteNotification:fetchCompletionHandler: método cuando la aplicación está en segundo plano. Puede establecer un indicador aquí para que cuando el usuario inicie su aplicación la próxima vez, pueda realizar su operación.

De la documentación de Apple, debe usar este método para descargar contenido nuevo asociado con notificaciones automáticas. También para que esto funcione, debe habilitar la notificación remota desde los modos de fondo y su carga de notificación de inserción debe contener la clave de content-available con su valor establecido en 1. Para más información, consulte Uso de notificaciones automáticas para iniciar una sección de descarga desde Apple Doc aquí .

Otra forma es tener el recuento de distintivos en la carga útil de notificación de inserción. Así que la próxima vez que se inicie su aplicación, puede verificar el recuento de la insignia de la aplicación. Si es más grande que cero, realice su operación y cuente cero / borre la cuenta del servidor también.

Espero que esto te ayude.

Intereting Posts