ios ios7 push-notification apple-push-notifications uiapplicationdelegate

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.