La messagerie dans le nuage remet l'application à l'arrêt

J'ai une application qui stocke la session de l'user dans NSUserDefaults. Lorsque l'application est forcée de fermer, dans l'initiale vérifier si la session user du controller de données là, dans le cas où il l'a envoyé à la window de démarrage comme suit:

override func viewWillAppear(animated: Bool) { self.view.hidden = true let defaults = NSUserDefaults.standardUserDefaults() if defaults.ssortingngForKey("user") != nil { dispatch_async(dispatch_get_main_queue(), { () -> Void in let viewController:UIViewController = self.storyboard?.instantiateViewControllerWithIdentifier("vistaInicio") as! ViewControllerInicio self.presentViewController(viewController, animated: true, completion: nil) }) }else { self.view.hidden = false } } 

Cela a fonctionné sans heurt jusqu'à aujourd'hui quand j'ai décidé d'implémenter des notifications push avec la mise à jour de firebase en suivant ce tutoriel. Configurer une application client Firebase Cloud Messaging sur iOS . Le problème se produit quand il a tué l'application et entrez à nouveau donne le code d'erreur suivant:

  2016-05-19 16:05:27.647: <FIRInstanceID/WARNING> Failed to fetch APNS token Error Domain=com.firebase.iid Code=1001 "(full)" 2016-05-19 16:05:27.659: <FIRMessaging/INFO> FIRMessaging library version 1.1.0 2016-05-19 16:05:27.831: <FIRMessaging/WARNING> FIRMessaging registration is not ready with auth credentials Unable to connect with FCM. Optional(Error Domain=com.google.fcm Code=501 "(null)") 

Capture d'écran

Voici la solution,

Commencez par download les certificates nécessaires dans la console Firebase puis, dans votre application, activez les notifications push et les modes d'arrière-plan -> Notifications à distance

Après cela dans App Delegate, utilisez le code ci-dessous (je précise la ligne délicate):

  func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { registerForPushNotifications(application) // Override point for customization after application launch. // Use Firebase library to configure APIs FIRApp.configure() return true } func registerForPushNotifications(application: UIApplication) { let notificationSettings = UIUserNotificationSettings( forTypes: [.Badge, .Sound, .Alert], categories: nil) application.registerUserNotificationSettings(notificationSettings) } 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]]) } //Tricky line FIRInstanceID.instanceID().setAPNSToken(deviceToken, type: FIRInstanceIDAPNSTokenType.Unknown) print("Device Token:", tokenSsortingng) } 

Ne pas oublié dans AppDelegate:

 import Firebase import FirebaseInstanceID import FirebaseMessaging func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { registerForPushNotifications(application) FIRApp.configure() // Add observer for InstanceID token refresh callback. NSNotificationCenter .defaultCenter() .addObserver(self, selector: #selector(AppDelegate.tokenRefreshNotificaiton), name: kFIRInstanceIDTokenRefreshNotification, object: nil) // Override point for customization after application launch. return true } func registerForPushNotifications(application: UIApplication) { let settings: UIUserNotificationSettings = UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories: nil) application.registerUserNotificationSettings(settings) application.registerForRemoteNotifications() } func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) { print("===== didReceiveRemoteNotification ===== %@", userInfo) } func tokenRefreshNotificaiton(notification: NSNotification) { let refreshedToken = FIRInstanceID.instanceID().token()! print("InstanceID token: \(refreshedToken)") // Connect to FCM since connection may have failed when attempted before having a token. connectToFcm() } func connectToFcm() { FIRMessaging.messaging().connectWithCompletion { (error) in if (error != nil) { print("Unable to connect with FCM. \(error)") } else { print("Connected to FCM.") } } } 

S'il vous plaît assurez-vous également de faire dans Info.plist : FirebaseAppDelegateProxyEnabled = NO

Je ne sais pas pour l'instant mais j'ai obtenu l' print(...) dans didReceiveRemoteNotification mais je n'ai pas le popup. J'envoie le message de Firebase -> Console -> Notification -> Single device et copyz ici le jeton que j'ai reçu de Xcode Console -> func tokenRefreshNotificaiton

La réponse est correcte ce sont les étapes, mais aussi s'il vous plaît vérifier votre time de l'appareil. Puisque si votre heure et la date est trop loin cela ne fonctionnera pas

Après avoir sortingplé toute l'intégration, pour moi le problème était que le dispositif de test avait la date changée à une semaine à l'avance. Probablement, le SDK FCM effectue des vérifications basées sur la date.

L'erreur pourrait être less générique du côté de Firebase, puisque j'ai perdu presque un jour à chercher une solution. J'espère que cela t'aides.