ios - didReceiveRemoteNotification: fetchCompletionHandler: abrir desde el icono contra la notificación de inserción
ios7 push-notification (3)
La solución de @ MikeV en Swift 2:
func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) {
if(application.applicationState == UIApplicationState.Inactive)
{
print("Inactive")
//Show the view with the content of the push
completionHandler(.NewData)
}else if (application.applicationState == UIApplicationState.Background){
print("Background")
//Refresh the local model
completionHandler(.NewData)
}else{
print("Active")
//Show an in-app banner
completionHandler(.NewData)
}
}
Estoy tratando de implementar el manejo de notificaciones en segundo plano, pero tengo problemas para determinar si el usuario abrió la aplicación desde la notificación que se envió en lugar de abrirla desde el ícono.
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
//************************************************************
// I only want this called if the user opened from swiping the push notification.
// Otherwise I just want to update the local model
//************************************************************
if(applicationState != UIApplicationStateActive) {
MPOOpenViewController *openVc = [[MPOOpenViewController alloc] init];
[self.navigationController pushViewController:openVc animated:NO];
} else {
///Update local model
}
completionHandler(UIBackgroundFetchResultNewData);
}
Con este código, la aplicación se abre al MPOOpenViewController independientemente de cómo el usuario abra la aplicación. ¿Cómo puedo hacer que el controlador de vista solo se presione si abren la aplicación y no pasan la notificación?
Con el mismo código, esto funcionó en iOS 6, pero con el nuevo método de iOS 7, no se comporta como lo deseo.
Edición: estoy intentando ejecutar la aplicación en iOS 7 ahora, y no admitimos ninguna versión anterior a iOS 7. Usé este mismo código exacto en la versión de iOS 6 del método (sin el controlador de finalización) y se comportó la forma en que lo esperaría. Usted deslizaría la notificación y esto sería llamado. Si abres desde el ícono, nunca se llamará al método.
La solución de @MikeV en Swift 3 (pero con la instrucción switch):
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
switch application.applicationState {
case .inactive:
print("Inactive")
//Show the view with the content of the push
completionHandler(.newData)
case .background:
print("Background")
//Refresh the local model
completionHandler(.newData)
case .active:
print("Active")
//Show an in-app banner
completionHandler(.newData)
}
}
Ok, lo he descubierto. En realidad, el método se llama dos veces (una vez cuando recibe el envío y una vez cuando el usuario interactúa con el ícono o la notificación).
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
if(application.applicationState == UIApplicationStateInactive) {
NSLog(@"Inactive");
//Show the view with the content of the push
completionHandler(UIBackgroundFetchResultNewData);
} else if (application.applicationState == UIApplicationStateBackground) {
NSLog(@"Background");
//Refresh the local model
completionHandler(UIBackgroundFetchResultNewData);
} else {
NSLog(@"Active");
//Show an in-app banner
completionHandler(UIBackgroundFetchResultNewData);
}
}
Gracias Tim Castelijns por la siguiente adición:
Nota: la razón por la que se llama dos veces se debe a que la carga útil tiene
content_available : 1
. Si elimina la clave y su valor, solo se ejecutará al tocar. Esto no resolverá el problema de todos, ya que algunas personas necesitan esa clave para ser verdad.