ver suenan recuperar pantalla notificaciones las historial como centro borradas bloqueada ios cocoa-touch apple-push-notifications uiapplicationdelegate

ios - suenan - Detectar si aplicación: didReceiveRemoteNotification: fetchCompletionHandler: se invocó tocando una notificación en el Centro de notificaciones



recuperar notificaciones iphone (7)

Cuando application: didReceiveRemoteNotification:fetchCompletionHandler: método se llama estado de la aplicación es UIApplicationStateInactive si el usuario toca la alerta (en este caso, desea preparar alguna UI) y es UIApplicationStateBackground cuando la aplicación se despierta silenciosamente (en este caso, solo carga algunos datos).

application: didReceiveRemoteNotification: fetchCompletionHandler:

es diferente de

application: didReceiveRemoteNotification:

¿Cómo? de los documentos:

A diferencia de la aplicación: método didReceiveRemoteNotification: que se llama solo cuando se está ejecutando su aplicación, el sistema llama a este método independientemente del estado de su aplicación. Si su aplicación se suspende o no se ejecuta, el sistema se reactiva o inicia su aplicación y la pone en estado de funcionamiento en segundo plano antes de llamar al método. Si el usuario abre su aplicación desde la alerta mostrada por el sistema, el sistema vuelve a llamar a este método para que sepa qué notificación seleccionó el usuario.

Mi problema es: quiero saber si el usuario llamó el método tocando una alerta mostrada por el sistema desde el Centro de notificaciones o desde una notificación de envío silencioso que activa el dispositivo. Actualmente, por lo que puedo ver, no hay una manera obvia de diferenciar.

- (BOOL)application: didFinishLaunchingWithOptions:

El seguimiento de launchOptions en el método anterior no es una solución porque solo se invoca si la aplicación se suspende / no se ejecuta en segundo plano. Si se ejecuta en segundo plano, no se llamará.


El estado de la aplicación no es confiable porque si tienes un centro de control o un centro de notificaciones de Apple abierto sobre tu aplicación, la aplicación: didReceiveRemoteNotification: fetchCompletionHandler: se llamará y el estado de la aplicación será Inactivo.

Estoy teniendo el mismo problema al tratar de responder a un clic en la notificación mientras la aplicación está en segundo plano y no parece haber una manera confiable de identificarlo únicamente.


En caso de rapidez

func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) { let state : UIApplicationState = application.applicationState if (state == .Inactive || state == .Background) { // go to screen relevant to Notification content } else { // App is in UIApplicationStateActive (running in foreground) } }


Los documentos de Apple son un poco confusos

application: didReceiveRemoteNotification: fetchCompletionHandler:

se usa si su aplicación admite el modo de fondo de notificación remota (es decir, está haciendo BackgroundFetch).

application: didReceiveRemoteNotification:

se llama cuando el sistema operativo recibe una notificación remota y la aplicación se está ejecutando (en el fondo / suspendido o en primer plano).
Puede consultar el UIApplicationState para ver si el usuario puso la aplicación en primer plano (tocando en la notificación) o si ya se estaba ejecutando cuando entra la notificación.

- (void) application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { UIApplicationState state = [application applicationState]; // user tapped notification while app was in background if (state == UIApplicationStateInactive || state == UIApplicationStateBackground) { // go to screen relevant to Notification content } else { // App is in UIApplicationStateActive (running in foreground) // perhaps show an UIAlertView } }


No estoy seguro si entiendo tu pregunta.

¿Desea diferenciar entre una captura de fondo de notificaciones automáticas silenciosas y una notificación push ruidosa? Simplemente puede verificar si el diccionario de notificación de inserción contiene la clave de "contenido disponible": [[userInfo objectForKey:@"aps"] objectForKey:@"content-available"] Si lo hace, entonces debe ser un impulso silencioso. Si no, fue un empuje normal.

¿Desea saber si se llama a ese método de obtención de fondos cuando la aplicación recibe una notificación y está suspendida / no en ejecución? Si es así, puede hacer lo siguiente:

  • Descarga e importa LumberJacks en tu aplicación. Consulte las instrucciones y aprenda a configurarlo para que pueda guardar los registros en el disco.
  • Coloque esto en cualquier método que quiera ver si / cuando se invoca ese método:

    • DDLogDebug(@"%@ - %@",NSStringFromSelector(_cmd),NSStringFromClass([self class]));

    Esto imprimirá la clase y el método al archivo de registro.

  • Examine el archivo de registro después de enviarse una notificación de inserción a su aplicación habilitada para la captura en segundo plano, y vea si alguno de los métodos se invoca mirando su archivo de registro.

Si ha configurado su aplicación correctamente para la application: didReceiveRemoteNotification: fetchCompletionHandler: , se llamará a la aplicación de método application: didReceiveRemoteNotification: fetchCompletionHandler: incluso cuando la aplicación está en segundo plano / no se está ejecutando si recibe una notificación de inserción (silencioso o no).


Para Swift: En la application(_:didFinishLaunchingWithOptions:) analiza las opciones de la aplicación. Si existen, sabrá que la aplicación fue lanzada desde ellos tocando.

if let remoteNotif = launchOptions?[UIApplicationLaunchOptionsKey.remoteNotification] as? [String: Any] { print("Remote notfi is /(remoteNotif)") if let notification = remoteNotif["aps"] as? [AnyHashable : Any] { /// - parse notification } }

De lo contrario, puede manejar el acceso y sabe que la aplicación está abierta / en segundo plano / inactiva application(_:didReceiveRemoteNotification:fetchCompletionHandler:)


Puede verificar el UIApplication de UIApplication para distinguir las llamadas silenciosas de las llamadas realizadas con la aplicación que usa activamente el usuario:

typedef enum : NSInteger { UIApplicationStateActive, UIApplicationStateInactive, UIApplicationStateBackground } UIApplicationState;

O mantenga su propia bandera establecida en la applicationDidEnterBackground: delegate applicationDidEnterBackground: