Hay un montón de stackoverflow hilos sobre este tema, pero todavía no encontrar una buena solución.

Si la aplicación no es en el fondo, puedo comprobar launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey] en application:didFinishLaunchingWithOptions: llame para ver si se abre de una notificación.

Si la aplicación está en el fondo, todos los puestos que se sugieren para el uso application:didReceiveRemoteNotification: y comprobar el estado de la aplicación. Pero como ya he experimentado (y también como el nombre de esta API sugiere), este método se llama cuando la recepción de la notificación, en lugar de ser aprovechado.

Por lo que el problema es que si la aplicación se inicia y, a continuación, en segundo plano, y usted sabe que se recibe una notificación de application:didReceiveNotification (application:didFinishLaunchWithOptions: no se disparará en este punto), ¿cómo se puede saber si el usuario se reanudó la aplicación de tocando la notificación, o simplemente pulsando el icono de la aplicación? Porque si el usuario aprovechado la notificación, la expectativa es que para abrir la página mencionada en la notificación. De lo contrario, no debería.

Podría utilizar handleActionWithIdentifier para la acción personalizada de notificaciones, pero esto sólo se activa cuando una acción personalizada botón se toca, no cuando el usuario pulsa en el cuerpo principal de la notificación.

Gracias.

EDICIÓN:

después de leer una respuesta de abajo, pensé que de esta manera puedo aclarar mi pregunta:

¿Cómo podemos diferenciar estos 2 escenarios:

(A) 1.la aplicación pasa a segundo plano; 2.notificación recibida; 3. el usuario pulsa en la notificación; 4. aplicación entra en primer plano

(B) 1.la aplicación pasa a segundo plano; 2.notificación recibida; 3. el usuario ignora la notificación y pulsa en el icono de la aplicación posterior; 4. aplicación entra en primer plano

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

O, en caso de application:didReceiveRemoteNotification: ser activado en el paso 3 (a), pero de alguna manera me configurado mi aplicación incorrecta, entonces, estoy viendo que en el paso 2?

  • El uso de un diccionario personalizado valor por su capacidad de carga y actuar en consecuencia. Bastante simple.
  • un diccionario en la carga puede representar si el usuario ha tocado en la notificación, a la derecha? por ejemplo, su amigo, publicó un artículo B, se puede decir {usuario: Una, en el artículo: B} en la carga, mientras que la aplicación está en segundo plano y se obtiene didReceiveRemoteNotification. ¿Cómo sabes cuando la aplicación se reanuda, si se debe mostrar el artículo?
  • Ver mi respuesta aquí : stackoverflow.com/a/28937556/2353523 realmente es así de simple INFORMACIÓN. Se debe educar a ti mismo en lo que didReceiveRemoteNotification realmente. Aquí es lo que usted necesita para empezar tome el tiempo para aprender algunas cosas, no sólo tiene que ir directamente a LO 😉
  • He leído la documentación y me hizo educar a mí mismo en lo que didReceiveRemoteNotification hace. ¿Has leído mi pregunta? Por la Manzana de la documentación oficial didReceiveRemoteNotification «le dice al delegado que la ejecución de la aplicación recibió una notificación remota». Me estoy preguntando ¿qué es una buena manera de saber si el usuario ha tocado en una notificación. El enlace PARA que usted se refiere es que cuando la aplicación está en el lanzamiento de un nuevo comienzo, le estoy pidiendo al escenario cuando la aplicación está en segundo plano.
  • Whoa. No era una afrenta mate. Simplemente decir que hay un montón de documentos sobre cómo crear un JSON carga, y de la manija de la notificación, lo que usted siquiera insinuado, solo tienes que probar cosas. Siempre se siente más gratificante de esta figura de las cosas en su sobre. Yo aprendí a hacerlo desde la misma página web me ha enviado a vosotros. Todos estamos aquí para aprender, no hay falta de respeto. Y sí. Sí lo leí 🙂 y al parecer el único ayudando. Código de mate. Código!
  • Si realmente aprendió cómo hacerlo y están tratando de ayudar, ¿podría decirme lo que me he perdido en mi propio aprendizaje? Me estaba diciendo (A) didFinishLaunchingWithOptions no se activará si la aplicación está en segundo plano, (B) didReceiveRemoteNotification se activa cuando llegue la notificación. Es una de las declaraciones equivocadas? Si no, ¿cuál es la respuesta para «¿cómo se puede detectar si un usuario ha tocado en la notificación cuando la aplicación está en el fondo»? La pregunta no tiene nada que ver con cómo crear JSON carga. Se supone que el JSON de carga ya está.
  • Todavía estoy tratando de entender esto por mi cuenta, y si lo hago, voy a auto-responder a esta pregunta. Pero yo sólo lo publicado aquí en la media hora para ver si alguien lo sabe, como me pasó alguna vez y no lo encontramos obvio.
  • He respondido a su pregunta con el primer comentario y siguió con un ejemplo en el enlace. Cuando se crea una carga personalizada que usted puede recuperar los datos de ella en didFinishLaunching y luego actuar en consecuencia, enviando al usuario independientemente de la opinión que parece apropiado (que es lo que se insinúa en el primer párrafo) que, básicamente, cómo saber si se abre la aplicación con una notificación. A) su derecho porque es un método que sucede después de su lanzamiento, que es donde usted quiere manejar la carga si el usuario abre a partir de una notificación. Leer 2.5 de la documentación en el enlace de arriba. Buena lectura.
  • Comience aquí : En iOS, el delegado, en su implementación de la aplicación:didFinishLaunchingWithOptions: método, se utiliza el UIApplicationLaunchOptionsRemotenotificationkey clave para acceder a la carga desde el lanzamiento de opciones de diccionario. Luego tiene otro enlace a «la Carga de La Notificación» para crear su propio diccionario. Es una pregunta duplicada por eso no he respondido.
  • posibles duplicados de iOS / XCode: ¿cómo saber que app ha puesto en marcha con un clic en la notificación o en trampolín icono de la aplicación?
  • OK tal vez yo no he estado lo suficientemente claro. Me refiero a que si la aplicación es totalmente abandonado, no en el fondo, sí didFinishLaunching será llamado. Pero si el lanzamiento de su app, y luego de fondo de la aplicación, y ahora una notificación entra, y el usuario pulsa en la notificación, y ahora la didFinishLaunching no va a ser llamado de nuevo. En lugar applicationWillEnterForeground y applicationDidBecomeActive será llamado. Cómo puede usted decir que la aplicación está entrando en primer plano, ya que el usuario ha tocado en la notificación o el icono de la aplicación?
  • Permítanos continuar esta discusión en el chat.

InformationsquelleAutor Bao Lei | 2015-08-18

10 Comentarios

  1. 93

    ACEPTAR finalmente comprendí.

    En la configuración del destino ➝ Capacidades ficha ➝ Fondo Modos, si usted llega Remoto «de las Notificaciones», application:didReceiveRemoteNotification: obtendrá activa tan pronto como la notificación llega (siempre y cuando la aplicación está en el fondo), y en este caso, no hay ninguna manera de saber si el usuario pulsa en la notificación.

    Si anula la selección de esta casilla, application:didReceiveRemoteNotification: se activa sólo cuando se pulsa sobre la notificación.

    Es un poco extraño que al marcar esta casilla cambiar la forma de uno de la aplicación de los métodos de delegado se comporta. Sería mejor si esa casilla está marcada, Apple utiliza dos diferentes métodos de delegado para la notificación de recepción de notificación y toque. Creo que la mayoría de los desarrolladores de siempre quiero saber si la notificación se tocó o no.

    Esperemos que esto le será útil para cualquier persona que se ejecuta en este tema. Apple también no documento claramente aquí así que me tomó un tiempo para averiguar.

    notificación push iOS: cómo detectar si el usuario ha tocado en la notificación cuando la aplicación está en segundo plano?

    • Tengo experiencia Modos ajustado a «OFF» completamente, pero todavía recibe una notificación cuando llega una notificación con la aplicación en modo de fondo.
    • Genial!!! Esto me ayudó. Es una lástima, sin embargo, que necesito interruptor de apagado de notificaciones. Me gustaría prefetch de datos cuando una notificación de inserción llega Y detectar el usuario presiona. No puedo encontrar una manera de lograr esto.
    • Me puse el modo de Fondo en modo «ON» y permitir el control remoto de notificaciones. Todavía no es capaz de detectar el evento de notificación.
    • Tengo el mismo problema de Fondo de modo está ajustado a «ON» y habilitado notificación remota, pero aún no recibe una notificación cuando la notificación llega a la app en segundo plano
    • Creo que va a causar rechazo en la Appstore, ya que esta opción es básicamente utilizado para la descarga de contenidos relacionados con la notificación en el fondo. Así que si usted no se descarga de cualquier contenido, Apple podría rechazar tu aplicación. developer.apple.com/library/ios/documentation/iPhone/Conceptual/…
    • Muy útil, Gracias cuerpo
    • he implementado todo a la perfección y estoy recibiendo notificaciones también . pero nunca va dentro de la aplicación:didReceiveRemoteNotification: método a menos que el usuario pulsa en la notificación de mensaje . ¿tienes alguna solución para esto ?
    • Con un mínimo de destino de la implementación de iOS 10, esto ya no es necesario, ya que el nuevo UserNotificationCenter api no sufre de estos molestos problemas.
    • El problema es que este delegado la función también se llama si usted recibe una notificación, mientras que en la aplicación.

  2. 65

    He estado buscando lo mismo que usted y realmente encontrar una solución que no requiere de notificación remota a ser molesto.

    Para comprobar si el usuario ha accedido, o de la aplicación está en segundo plano o se activa, usted sólo tendrá que comprobar 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 info de verificación:

    UIKit Marco de Referencia > UIApplication de Referencia de la Clase > UIApplicationState

    • ¿Qué acerca de la aplicación que se va a UIApplicationStateInactive el usuario como consecuencia de participar con el centro de Notificaciones (deslizar el dedo desde la parte superior) o el centro de Control (desliza el dedo desde la parte inferior), mientras la aplicación está en la pantalla. Aparentemente, no hay ninguna manera de saber si la APN fue recibido en estado Inactivo o usuario realmente aprovechado de ella.
    • Tienes razón, pero eso es un super borde de los casos…aparte de eso, esta respuesta es la más válida en términos de separación entre la aplicación en primer plano…usuario tocar…app en segundo plano
    • Gracias, este tipo de desmitifican todo. Recuerde que para que el delegado método que se llama cuando la aplicación está en el fondo, el empuje de la notificación tiene que incluir el content-available clave, pero, a continuación, la notificación debe ser silencioso (es decir, no incluir un sonido o placa) como se indica en el documento oficial.
    • Yo en realidad era capaz de solucionar el problema de no saber si el centro de control se abre o si el usuario realmente aprovechado la notificación mediante la adición de un valor booleano que se establece en true en el func applicationDidEnterBackground(_ application: UIApplication) y false en la func applicationDidBecomeActive(_ application: UIApplication) esto me permitió mostrar la aplicación de notificaciones cuando la aplicación está inactiva debido a que el centro de control o en la lista de notificaciones de
    • se perturba mi mente ¿por qué Apple no presente un evento diferente o simplemente agregar una marca en los metadatos para indicar que el usuario ha interactuado con la notificación. Tener que ‘deducir’ si el usuario tomó una acción basada en el ambiente de información sobre el estado de la aplicación es bastante razonable para una clave de bits de información que afecta al usuario de la expectativa de comportamiento. Tal vez la única cosa a hacer es crear una acción personalizada para abrir la aplicación con esa información?
    • Nota en iOS10+ este enfoque ya no es necesario un UNUserNotificationCenterDelegate método puede ser utilizado en lugar de la que se llama cuando un usuario interactúa con una notificación. Usted también puede presentar acciones de las alertas de notificación cuando la aplicación está en primer plano así. Consulte stackoverflow.com/a/41783666/1761357 para una explicación detallada.

  3. 19

    De acuerdo a
    iOS /XCode: ¿cómo saber que app ha puesto en marcha con un clic en la notificación o en trampolín icono de la aplicación?
    usted tiene que comprobar el estado de la aplicación en didReceiveLocalNotification como este:

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

    Aunque no totalmente de sentido para mí, parece que funciona.

    • No funcionaría en este escenario. He intentado eso antes. Cuando esta casilla fue marcada (ver mi aceptado la respuesta para más detalles), cuando llegue la notificación, su línea de comentario «// el usuario ha aprovechado la notificación» será introducida, incluso aunque el usuario no pulsa en la notificación (notificación acaba de llegar).
    • No estoy de acuerdo. He Remoto «de las notificaciones» marcada en mi fondo de capacidades y funciona de la manera descrita en mi respuesta. Tengo el Fondo de «fetch» marcada. Tal vez eso hace que el cambio?
    • podría usted por favor, +1 de mi respuesta? 😉 Todavía tengo la necesidad de algunos votos más a participar en stackoverflow. Muchas gracias
    • Yupe, esta es la solución. tnx.
    • Tenga en cuenta que este será un falso positivo si se envía la notificación mientras el usuario está en una pantalla diferente (por ejemplo, si tiran hacia abajo la barra de estado y luego de recibir una notificación de la aplicación).
    • Esto funciona para mí. Me había preguntado por qué a veces me gustaría obtener redundante notificaciones. Resulta que Werner es correcta. Si usted abre la Aplicación a través de la Alerta de la pantalla después de ir a través de didReceiveRemoteNotification otro tiempo, ahora, mientras la Aplicación se está UIApplicationStateInactive. Thx Werner.
    • he implementado todo a la perfección y estoy recibiendo notificaciones también . pero nunca va dentro de la aplicación:didReceiveRemoteNotification: método a menos que el usuario pulsa en la notificación de mensaje . ¿tienes alguna solución para esto ?

  4. 16

    Si alguien lo quiere en swift 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
        }

    para swift 4

    switch UIApplication.shared.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
    }
    • En los cuales provocan debemos añadir este código , didReceiveRemoteNotification o didFinishLaunchingWithOptions?
    • En didReceiveRemoteNotification
    • sh,,,, he recibido la notificación de inserción en todo el estado, es decir, cuando la aplicación está en primer plano, fondo, cierre(terminado)..! pero mi problema es que cómo el incremento de la insignia de la cuenta cuando la aplicación está en segundo plano estatal y cierre (terminar) estado???? Por favor, dígame en los detalles de cómo lo hago….? mi aplicación recuento es sólo aumentan cuando la aplicación está en primer plano del estado…..? si es posible por favor me dicen en breve…….!
  5. 6

    Si usted tiene el Fondo de «Modos» > «Remoto notificaciones» checked == SÍ, pulsa en la notificación de eventos llegará en:

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

    Me ayudó a mí. Por favor, disfruten 🙂

    • Vi que Apple ha añadido a esto, pero no podía averiguar cómo llegar a la notificación de la carga personalizada de esta manera.
  6. 5

    Me encontré con este problema, también — pero en iOS 11 con el nuevo UserNotifications Marco.

    Aquí para mí es como este:

    • Nuevo Lanzamiento: application:didFinishLaunchingWithOptions:
    • Recibido en primer plano: application:didReceiveRemoteNotification:fetchCompletionHandler:
    • Recibido en Antecedentes: userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler:
  7. 3

    En mi caso, de fondo se desactiva el modo de no hacer ninguna diferencia. Sin embargo, cuando la aplicación fue suspendida y el usuario aprovechado la notificación, que podía manejar el caso en este método de devolución de llamada:

    func userNotificationCenter(_ center: UNUserNotificationCenter,
                                didReceive response: UNNotificationResponse,
                                withCompletionHandler completionHandler: @escaping () -> Void) {
    
    }
    • Esta es la forma oficial de que Apple dice. De acuerdo a la Manzana del doc, que será llamado cada vez que el usuario de interactuar con las notificaciones push de interfaz de usuario. Si la aplicación no está en el fondo, se lanzará la aplicación en modo de fondo y llamar a este método.
  8. 2

    Para iOS 10 y por encima poner esto en AppDelegate, para llegar a conocer la notificación se toca(funciona aunque la aplicación esté cerrada o abierta)

    func userNotificationCenter(_ center: UNUserNotificationCenter,
                                    didReceive response: UNNotificationResponse,
                                    withCompletionHandler completionHandler: @escaping () -> Void) {
    print("notification tapped here")
    }
  9. 1

    Hay dos Funcs para manejar recibido PushNotification interior :

    class PushNotificationManager: NSObject, MessagingDelegate, UNUserNotificationCenterDelegate{
    
    }

    Ya he probado el primero en el disparador tan pronto como la Notificación llegó

    @available(iOS 10.0, *)
    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
    
        completionHandler(UNNotificationPresentationOptions.alert)
    
        //OnReceive Notification
        let userInfo = notification.request.content.userInfo
        for key in userInfo.keys {
             Constants.setPrint("\(key): \(userInfo[key])")
        }
    
        completionHandler([])
    
    }

    Y la segunda cuando se toca en la Notificación:

    @available(iOS 10.0, *)
    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
    
        //OnTap Notification
        let userInfo = response.notification.request.content.userInfo
        for key in userInfo.keys {
            Constants.setPrint("\(key): \(userInfo[key])")
        }
    
        completionHandler()
    }

    También he probado con ambas Notificación Remota(en el Fondo Modos) estado De encendido/Apagado.

  10. -7

    Puede configurar la notificación de inserción de la carga útil a la llamada de la aplicación del delegado application:didReceiveRemoteNotification:fetchCompletionHandler: método cuando la aplicación está en segundo plano. Puede establecer algunos bandera aquí, de modo que cuando el usuario inicie la aplicación la próxima vez, usted puede realizar su operación.

    De la documentación de apple debe utilizar este método para descargar nuevos contenidos asociados con notificaciones push. También para que esto funcione, tienes que activar la notificación Remota de Fondo modos y su empuje carga de la notificación debe contener content-available clave con su valor se establece en 1. De obtener más información, consulte Uso de las Notificaciones Push para Iniciar una sección de Descarga de apple doc aquí.

    Otra manera es tener recuento de empuje de carga de la notificación. Así que la próxima vez que la aplicación se lanza usted puede comprobar la aplicación de recuento. Si su rallador de cero, realice su operación y cero/claro recuento de servidor también.

    Espero que esto ayude.

    • han de leer los detalles de mi pregunta? Estoy viendo didReceiveRemoteNotification recibir llamadas cuando la notificación sólo llega (antes de que el usuario pulsa sobre ella). Yo quería saber si el usuario ha tocado en él.
    • No contestó OP pregunta. Él no sólo quiere saber que ha habido una notificación. Él quiere saber si el usuario abre la Aplicación tocando esa notificación remota.

Dejar respuesta

Please enter your comment!
Please enter your name here