Hay muchos hilos de stackoverflow con respecto a este tema, pero todavía no encontré una buena solución.
Si la aplicación no está en el fondo, puedo comprobar launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey]
en la application:didFinishLaunchingWithOptions:
llamada para ver si se abre desde una notificación.
Si la aplicación está en segundo plano, todas las publicaciones sugieren usar application:didReceiveRemoteNotification:
y verificar el estado de la aplicación. Pero como experimenté (y también como sugiere el nombre de esta API), este método se llama cuando se recibe la notificación, en lugar de tocarlo.
Entonces, el problema es que, si la aplicación se inicia y luego se pone en segundo plano, y sabe que se recibe una notificación de application:didReceiveNotification
( application:didFinishLaunchWithOptions:
no se activará en este punto), ¿cómo saber si el usuario reanudó la aplicación tocando la notificación o simplemente tocando el icono de la aplicación? Porque si el usuario tocó la notificación, la expectativa es abrir la página mencionada en esa notificación. De lo contrario, no debería.
Podría usarlo handleActionWithIdentifier
para notificaciones de acciones personalizadas, pero esto solo se activa cuando se toca un botón de acción personalizada, no cuando el usuario toca el cuerpo principal de la notificación.
Gracias.
EDITAR:
después de leer una respuesta a continuación, pensé que de esta manera puedo aclarar mi pregunta:
¿Cómo podemos diferenciar estos 2 escenarios?
(A) 1.app pasa a segundo plano; 2. notificación recibida; 3. el usuario toca la notificación; 4. la aplicación entra en primer plano
(B) 1.app pasa a segundo plano; 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
Dado que application:didReceiveRemoteNotification:
se activa en ambos casos en el paso 2.
¿O debería application:didReceiveRemoteNotification:
activarse en el paso 3 solo para (A), pero de alguna manera configuré mal mi aplicación, así que la veo en el paso 2?
Respuestas:
OK finalmente me di cuenta.
En la configuración de destino ➝ pestaña Capacidades ➝ Modos de fondo, si marca "Notificaciones remotas",
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 hay forma de saber si el usuario tocará la notificación.Si desmarca esa casilla,
application:didReceiveRemoteNotification:
se activará solo cuando toque la notificación.Es un poco extraño que al marcar esta casilla se cambie el comportamiento de uno de los métodos delegados de la aplicación. Sería mejor si esa casilla estuviera marcada, Apple usa dos métodos de delegado diferentes para recibir notificaciones y tocar notificaciones. Creo que la mayoría de los desarrolladores siempre quieren saber si se toca una notificación o no.
Con suerte, esto será ú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.
fuente
He estado buscando lo mismo que usted y de hecho 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
Para obtener más información, consulte:
Referencia de marco de UIKit> Referencia de clase de UIApplication> UIApplicationState
fuente
content-available
clave, pero luego la notificación debe ser silenciosa (es decir, no incluir un sonido o insignia) como se indica en los documentos oficiales. .func applicationDidEnterBackground(_ application: UIApplication)
y falso en elfunc applicationDidBecomeActive(_ application: UIApplication)
esto me permitió mostrar la aplicación en notificaciones cuando la aplicación está inactiva debido al centro de control o la lista de notificacionesSegún iOS / XCode: ¿cómo saber que la aplicación se ha lanzado con un clic en la notificación o en el icono de la aplicación de trampolín? tienes que comprobar el estado de la aplicación en didReceiveLocalNotification así:
Aunque no tiene mucho sentido para mí, parece funcionar.
fuente
Si alguien lo quiere en swift 3.0
para swift 4
fuente
Si tiene "Modos de fondo"> "Notificaciones remotas" marcado == SÍ, toque en el evento de notificación llegará en:
Me ayudó. Por favor, disfruta :)
fuente
También encontré este problema, pero en iOS 11 con el nuevo
UserNotifications
Framework.Aquí para mí es así:
application:didFinishLaunchingWithOptions:
application(_:didReceiveRemoteNotification:fetchCompletionHandler:)
userNotificationCenter(_:willPresent:withCompletionHandler:)
userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler:
fuente
En mi caso, el modo de fondo desactivado no supuso 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 devolución de llamada:
fuente
Para iOS 10 y superior, coloque esto en AppDelegate, para saber si se toca la notificación (funciona incluso si la aplicación está cerrada o abierta)
fuente
Hay dos Funcs para manejar PushNotification recibidos dentro de la
PushNotificationManager
clase:Como probé el primer disparador tan pronto como llegó la notificación
Y el segundo cuando se toca en la notificación:
También lo probé con estados ON y OFF de Notificación remota (en modos de fondo)
fuente
SWIFT 5.1
UIApplication.State
no funcionó para mí, porque una vez que leo la huella digital (se muestra modal) en mi aplicación, la notificación también se lanza en la barra superior y el usuario debe hacer clic en ella.He creado
public static var isNotificationFromApp: Bool = false
adentro
AppDelegate
y lo configurotrue
en mi inicioviewController
y luego en mi notificaciónstoryboard
/viewController
solo verifico eso :)Espero que pueda ser útil
fuente
Puede configurar la carga útil de su notificación push para llamar al
application:didReceiveRemoteNotification:fetchCompletionHandler:
método del delegado de la aplicación cuando la aplicación está en segundo plano. Puede establecer alguna bandera 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 estos métodos para descargar contenido nuevo asociado con notificaciones push. Además, para que esto funcione, debe habilitar la notificación remota desde los modos en segundo plano y su carga útil de notificación push debe contener una
content-available
clave con su valor establecido en 1. Para obtener más información, consulte la sección Uso de notificaciones push para iniciar una descarga de apple doc aquí .Otra forma es tener un recuento de credenciales en la carga útil de notificaciones push. Entonces, la próxima vez que se inicie su aplicación, puede verificar el recuento de credenciales de la aplicación. Si es mayor que cero, realice su operación y cero / borre el recuento de credenciales del servidor también.
Espero que esto te ayude.
fuente