web-dev-qa-db-fra.com

Remise de l'application de messagerie dans le cloud

J'ai une application qui stocke la session de l'utilisateur dans NSUserDefaults. Lorsque l'application est forcée de fermer, vérifiez dans un premier temps si la session utilisateur du contrôleur de données y est présente, au cas où elle serait envoyée à la fenêtre de démarrage comme suit:

override func viewWillAppear(animated: Bool) {

    self.view.hidden = true

    let defaults = NSUserDefaults.standardUserDefaults()
    if   defaults.stringForKey("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 m'a bien fonctionné jusqu'à aujourd'hui, lorsque j'ai décidé d'implémenter les notifications Push avec la mise à jour de Firebase à la suite de ce tutoriel Configuration d'une application cliente de messagerie Firebase Cloud sur iOS . Le problème se produit lorsqu'il a tué l'application et que la saisie de 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)")

Screenshot

20
Felipe Parra

Voici la solution,

Téléchargez d'abord les certificats nécessaires dans la console Firebase Ensuite, 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 spécifie 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 tokenString = ""

    for i in 0..<deviceToken.length {
        tokenString += String(format: "%02.2hhx", arguments: [tokenChars[i]])
    }

    //Tricky line
    FIRInstanceID.instanceID().setAPNSToken(deviceToken, type: FIRInstanceIDAPNSTokenType.Unknown)
    print("Device Token:", tokenString)
}
35
LoGoCSE

N'oubliez pas 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.")
      }
    }
  }

Assurez-vous également de le faire dans Info.plist: FirebaseAppDelegateProxyEnabled = NO

Je ne sais pas pour l'instant mais j'ai la print(...) dans didReceiveRemoteNotification mais je n'ai pas la popup. J'envoie le message de Firebase -> Console -> Notification -> Appareil unique et copie ici le token que j'ai obtenu de Xcode Console -> func tokenRefreshNotificaiton

5
Svitlana

La réponse est correcte, voici les étapes, mais vérifiez également l'heure de votre appareil. Parce que si votre heure et votre date sont trop éloignées, cela ne fonctionnera pas

4
Mr.G

Après avoir triplement vérifié l'intégralité de l'intégration, pour moi, le problème était que le test l'appareil avait la date changé à une semaine à l'avance. Le SDK FCM effectue probablement des vérifications basées sur la date.

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

2
raver99