web-dev-qa-db-fra.com

Gestion des notifications utilisateur sur iOS 10

J'ai du mal à déterminer quand l'utilisateur appuie sur une notification Push utilisateur sur iOS 10.

Jusqu'à présent, j'ai utilisé le -[UIApplicationDelegate application:didReceiveRemoteNotification:fetchCompletionHandler:] qui est appelé lorsque

  • Case 1: l'application est active et le Push est reçu
  • Case 2: lorsque l'utilisateur a lancé l'application après avoir enregistré une notification reçue

Les commentaires de cette méthode disent explicitement

Notez que ce comportement est en contraste avec application: didReceiveRemoteNotification :, qui n'est pas appelée dans ces cas et qui ne sera pas invoquée si cette méthode est implémentée.

Tout ce travail comme prévu.

Maintenant, iOS 10 a déconseillé cette méthode déléguée et a introduit le cadre UserNotification que je ne peux pas utiliser car je cible toujours iOS 8 et 9.

Lorsque mon application est en cours d'exécution sur iOS 10 et qu'un push est reçu alors que l'application est active (Case 1), le -[AppDelegate application:didReceiveRemoteNotification:fetchCompletionHandler:] est appelé correctement.

Encore une fois sur iOS 10, lorsque l'utilisateur démarre l'application en appuyant sur une notification (Case 2) cette méthode n'est pas appelée.

Je me rends compte que lorsque j'implémente l'ancien -[UIApplicationDelegate application:didReceiveRemoteNotification:] c'est celui qui est appelé dans le Case 2

Sur iOS 8 et 9, dans le Case 2 c'est le -[AppDelegate application:didReceiveRemoteNotification:fetchCompletionHandler:] la méthode est appelée.

Cela signifie-t-il que je dois mettre à jour mon application et implémenter l'ancien délégué uniquement pour iOS 10?

La question est donc de savoir quelle est la bonne implémentation de la gestion de l'interaction utilisateur d'un Push reçu sur iOS 10 sans utiliser le cadre UserNotification.

cheers, Jan

26
Jan

Cela a été corrigé dans iOS 10.1 Beta 1 !!

Le -[UIApplicationDelegate application:didReceiveRemoteNotification:fetchCompletionHandler:] est correctement appelé lorsque l'utilisateur appuie sur une notification.

13
Jan

Code Swift pour iOS 10:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    // Override point for customization after application launch.

    if #available(iOS 10.0, *) {
        let center = UNUserNotificationCenter.currentNotificationCenter()
        center.delegate = self
    }

    // ...

    return true
}

@available(iOS 10.0, *)
func userNotificationCenter(center: UNUserNotificationCenter, didReceiveNotificationResponse response: UNNotificationResponse, withCompletionHandler completionHandler: () -> Void) {

    print(response.notification.request.content.userInfo)        
}

@available(iOS 10.0, *)
func userNotificationCenter(center: UNUserNotificationCenter, willPresentNotification notification: UNNotification, withCompletionHandler completionHandler: (UNNotificationPresentationOptions) -> Void) {

    print(notification.request.content.userInfo)
}
24
Adam Bardon

Nous étions confrontés au même problème ici et nous n'avons pu résoudre ce problème que sur iOS 10 GM release en utilisant le code sur la réponse donnée ici: https: // forums. developer.Apple.com/thread/54332

     - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {  

           NSOperatingSystemVersion version = [[NSProcessInfo processInfo] operatingSystemVersion];
           if (version.majorVersion == 10 && version.minorVersion == 0) {
              [self application: application 
   didReceiveRemoteNotification: userInfo    
         fetchCompletionHandler: ^(UIBackgroundFetchResult result) { 

            }];
       }

Avec ce correctif, notre code a recommencé à fonctionner sur iOS 9 et 10.

Nous avons également dû changer la façon dont nous gérons comportement de l'état de l'application (UIApplicationStateActive, UIApplicationStateInactive et UIApplicationStateBackground) sur les notifications Push, car il semble qu'il ait également changé sur iOS 10

[~ # ~] éditez [~ # ~] :

  • Il semble que le comportement de l'état de l'application soit redevenu normal sur les dernières versions d'iOS 10.
15
andresk