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: