Comment ouvrir un controller de vue spécifique sur didReceiveRemoteNotification lorsque l'application est en arrière-plan

Je suis en train d'implémenter une alarme où je reçois pushNotification du server, je reçois une notification push parfaite et ça marche bien en mode premier plan mais quand l'application entre en arrière-plan alors elle ne reçoit que la notification push mais ne charge pas la vue que je veux charger

Veuillez vérifier le code ci-dessous

func registerForPushNotifications(application: UIApplication) { let notificationSettings = UIUserNotificationSettings( forTypes: [.Badge, .Sound, .Alert], categories: nil) application.registerUserNotificationSettings(notificationSettings) } 

Cette méthode d'appel de didFinishLaunchingWithOptions

 func application(application: UIApplication, didRegisterUserNotificationSettings notificationSettings: UIUserNotificationSettings) { if notificationSettings.types != .None { application.registerForRemoteNotifications() } } func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) { let tokenChars = UnsafePointer<CChar>(deviceToken.bytes) var tokenSsortingng = "" for i in 0..<deviceToken.length { tokenSsortingng += Ssortingng(format: "%02.2hhx", arguments: [tokenChars[i]]) } NSUserDefaults.standardUserDefaults().setObject(tokenSsortingng, forKey: "deviceToken") } 

C'est la dernière méthode

  func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) { print(userInfo) let storyboard = UIStoryboard(name: "Main", bundle: nil) let navigationController = storyboard.instantiateViewControllerWithIdentifier("AlarmDetailsController") as! AlarmDetailsController //let dVC:AlarmDetailsController = navigationController.topViewController as! AlarmDetailsController navigationController.isPushNotification = true self.window?.rootViewController?.presentViewController(navigationController, animated: true, completion: {}) } 

S'il vous plaît aidez-moi pour ce problème Se souvenir de mon application fonctionne bien en mode de premier plan

1.Tout d'abord, vous devriez en arrière-plan dans l'application "Capacités" 2. Ensuite, utilisez le code suivant dans le délégué de l'application

Dans la class AppDelegate, ajoutez le code suivant:

 func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { // print(userInfo) let vc = mainStoryBoard.instantiateViewController(withIdentifier: "destinationVC") as! destinationVC self.visibleNavController.pushViewController(vc, animated: true) } 

Pour iOS 10, utilisez le code suivant: 1.Import

  import UserNotifications 

Pour le premier plan

  @available(iOS 10.0, *) func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (_ options: UNNotificationPresentationOptions) -> Void) { var userInfo = NSDictionary() userInfo = notification.request.content.userInfo as NSDictionary let pay = userInfo as NSDictionary let driverLocationVC = mainStoryBoard.instantiateViewController(withIdentifier: "destinationVC") as! destinationVC self.visibleNavController.pushViewController(driverLocationVC, animated: true) } 

Pour l'arrière-plan

  @available(iOS 10.0, *) func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) { print("Userinfo \(response.notification.request.content.userInfo)") var userInfo = NSDictionary() userInfo = response.notification.request.content.userInfo as NSDictionary print(userInfo) let driverLocationVC = mainStoryBoard.instantiateViewController(withIdentifier: "DriverLocationVC") as! DriverLocationVC self.visibleNavController.pushViewController(driverLocationVC, animated: true) } 

Pour l'extraction de jetons de périphérique

  func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { let tokenSsortingng = deviceToken.reduce("", {$0 + Ssortingng(format: "%02X", $1)}) print("Got token data! \(tokenSsortingng)") UserDefaults.standard.set(tokenSsortingng, forKey: "device_token") UserDefaults.standard.synchronize() } 

Si votre application est suspendue, vérifiez la UIApplicationLaunchOptionsRemoteNotificationKey dans le dictionary depuis l' application:didFinishLaunchingWithOptions

 func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { ... // Check if launched from notification if let userInfo = launchOptions?[UIApplicationLaunchOptionsRemoteNotificationKey] as? [Ssortingng: AnyObject] { // handle your notification like in application:didReceiveRemoteNotificatioUserInfo: } ... } 

Vous devez d'abord définir comme ceci dans votre Xcode

entrez la description de l'image ici

Il y a trois états: Premier plan, Arrière-plan, Tué dont vous avez besoin de connaître les détails de votre notification.

1. Au premier plan : Dès que votre notification arrive lorsque votre application est à l'avant-plan, elle mène à l'écran spécifique lorsque vous appuyez sur la bannière ou sur la base d'alerte de votre configuration en mode normal. Mais, dans les modes d'arrière-plan, il peut même naviguer silencieusement dès que votre notification arrive sans le toucher.

2. Context : Si votre application n'est pas au premier plan, l'utilisation du mode arrière-plan peut vous aider à ouvrir l'écran spécifique si vous le manipulez à l'intérieur de didReceiveRemoteNotification et dès que l'application est ouverte lorsque vous l'avez tapée.

3. Killed : Si votre application n'est pas en memory, uniquement en appuyant sur la notification push pour naviguer dans un écran spécifique car elle ne se trouvait pas dans la memory de l'appareil, didReceiveRemoteNotification ne se triggersra pas si l'user néglige la notification.

Alors, comment pouvons-nous gérer la navigation à l'écran spécifique? C'est basé sur la façon dont vous développez votre design d'application et je ne peux pas fournir de réponse correcte jusqu'à ce que je vois votre code.

Mais, oui, vous pouvez naviguer vers spécifique lorsque l'application est en arrière-plan dès que vous ouvrez l'application en appuyant sur notification qui apparaissent sur la bannière ou l'écran de locking.Tout peut être fait dans votre didReceiveRemoteNotification dans une condition lorsque vous voulez le faire en arrière-plan .

Regarde ça :

https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html

À votre notification push json, vous devez inclure les éléments suivants

 content-available : 1 

Lorsque cela est inclus, il peut effectuer une exécution en arrière-plan même si l'application est en arrière-plan sur datatables supplémentaires que vous envoyez depuis le server.

À vos données supplémentaires:

 {apns : [], data : [ "Navigate" : "Home" ]} 

Ensuite, à votre didReceiveRemoteNotification ,

 if let aps = userInfo["data"] as? NSDictionary{ // get the "Home" data and do navigation here // You might need to instantiate storyboard of the specific view controller which you want to go as RootViewController } 

Ainsi, lorsque votre notification arrivera, elle conduira à un écran spécifique en arrière-plan si vous le faites dès que vous appuyez sur la notification push depuis la bannière ou l'alerte. L'application va s'ouvrir et cela conduira à un écran spécifique.