35 votes

La notification APNS Firebase n'a pas réussi à récupérer le jeton.

Pour Swift3 / iOS10, voir ce lien :

ios10, Swift 3 et Firebase Push Notifications (FCM)

J'essaie d'utiliser Firebase for Notifications et je l'ai intégré exactement comme décrit dans la documentation. Mais je ne comprends pas pourquoi cela ne fonctionne pas. Lorsque je construis mon projet, je vois cette ligne :

2016-05-25 16:09:34.987: <FIRInstanceID/WARNING> Failed to fetch default token Error Domain=com.firebase.iid Code=0 "(null)"

Voici mon AppDelegate :

 func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    FIRApp.configure()
    FIRDatabase.database().persistenceEnabled = true
     var service: DataService = DataService()
    service.start()
    registerForPushNotifications(application)
    application.registerForRemoteNotifications()
    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]])
    }

    FIRInstanceID.instanceID().setAPNSToken(deviceToken, type: FIRInstanceIDAPNSTokenType.Unknown)
    print("Device Token:", tokenString)
}
func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void)  {
    // Print message ID.
    print("Message ID: \(userInfo["gcm.message_id"]!)")

    // Print full message.
    print("%@", userInfo)
}

1 votes

Implémentez didFailToRegisterForRemoteNotificationsWithError et voyez s'il est appelé et si c'est le cas, quel est le code d'erreur. Je suppose que vous avez activé le profil de provisionnement de votre application pour les apns ?

0 votes

@SausageModulationMatrix Cette fonction n'est pas atteinte.

0 votes

Avez-vous trouvé une solution à ce problème ?

22voto

starlord_amj Points 235

J'ai également eu le même problème et rien n'a fonctionné pour moi. Mais tout ce que vous avez à faire est d'aller dans votre console firebase, puis de trouver votre projet et d'aller dans ses paramètres, puis de vérifier dans son onglet cloud messaging et de télécharger votre certificat .p12 à l'intérieur.

c'est tout ! bon codage :)

1 votes

Initialement, je n'ai ajouté que le certificat de développement dans la console firebase. Même là, je recevais l'erreur. Ensuite, j'ai ajouté le certificat de production, ce qui a permis de réussir l'enregistrement et d'accorder le jeton. Donc, dans mon cas, nous avons besoin des deux certificats ajoutés à la console firebase.

0 votes

Je devais le faire. Je vérifierai maintenant après le téléchargement.

13voto

Sanandiya Vipul Points 666

1. mettre en place l'observateur de notification dans didFinishLaunchingWithOptions Méthode

2.Et Set tokenRefreshNotification alors vous obtenez un jeton dans cette méthode.

Voir ci-dessous Code

import Firebase
import FirebaseMessaging

override func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
  FIRApp.configure()

      NotificationCenter.default.addObserver(self,
                                                     selector: #selector(self.tokenRefreshNotification(notification:)),
                                                     name: NSNotification.Name.firInstanceIDTokenRefresh,
                                                     object: nil)
}

// NOTE: Need to use this when swizzling is disabled
public func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {

  FIRInstanceID.instanceID().setAPNSToken(deviceToken, type: FIRInstanceIDAPNSTokenType.Sandbox)
}

func tokenRefreshNotification(notification: NSNotification) {
  // NOTE: It can be nil here
  let refreshedToken = FIRInstanceID.instanceID().token()
  print("InstanceID token: \(refreshedToken)")

  connectToFcm()
}

func connectToFcm() {
  FIRMessaging.messaging().connectWithCompletion { (error) in
    if (error != nil) {
      print("Unable to connect with FCM. \(error)")
    } else {
      print("Connected to FCM.")
    }
  }
}

public func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) {
  print(userInfo)
}

4voto

Tristan Leblanc Points 71

1 - Avez-vous correctement configuré vos certificats comme spécifié dans la documentation de google ( je ne vais pas rappeler le processus ici, il est assez long... ) ? ( https://firebase.google.com/docs/cloud-messaging/ios/certs#configure_an_app_id_for_push_notifications )

2 - J'ai rencontré quelques difficultés lors de la mise en place du FCM. Une fois que j'ai pensé que tout allait bien mais que les notifications ne fonctionnaient toujours pas, j'ai décidé de supprimer complètement l'application du téléphone, de nettoyer mon dossier de construction et de réinstaller le tout. Après cela, tout fonctionnait.

3 - L'application recevait des notifications, mais je recevais toujours le message "Failed to fetch default token...". Il a disparu au bout d'un moment. Ne me demandez pas pourquoi !

Ce n'est pas vraiment une réponse appropriée, je partage juste mon expérience parce que je sais que la configuration de la notification n'est pas facile et que chaque indice est le bienvenu. Alors peut-être que celle-ci peut aider. Merci :)

2 votes

J'ai eu des problèmes avec FCM et j'ai supprimé l'application, puis j'ai nettoyé et reconstruit le projet, ce qui a fonctionné pour moi.

3voto

michael chein Points 41

Après avoir essayé tout ce qui précède (et tout ce que j'ai pu trouver ailleurs), ce qui résout le problème pour moi est de déplacer

let token = FIRInstanceID.instanceID().token()

doit être appelé lorsqu'on appuie sur un bouton, et non au chargement de l'application.

Je sais que ce n'est probablement pas la solution la plus élégante, mais elle est suffisante pour le débogage. Je suppose que le jeton n'est pas disponible immédiatement par le serveur, et qu'il prend un certain temps à être généré.

0 votes

J'ai eu le même problème, mon problème était que j'ai essayé de m'enregistrer pour la notification avant d'appeler FIRApp.configure() (sans raison valable). Lorsque j'ai changé cela, j'ai obtenu le jeton dans l'AppDelegate.

0 votes

Merci beaucoup ! J'ai appelé FIRApp.configure() dans appDelegate, et j'ai essayé de récupérer le jeton dans le viewDidLoad du premier contrôleur de vue. Il ne m'est jamais venu à l'esprit que FIRApp.configure n'avait pas été appelé. J'ai déplacé mon code (simplement la mise à jour du token sur mon serveur) dans appDelegate, et cela fonctionne parfaitement :)

2voto

Ro4ch Points 632

Le FCM fonctionnait pour moi puis s'est arrêté. J'ai fait ce que Rabs G. m'a suggéré, j'ai supprimé l'application et je l'ai installée à nouveau et les notifications ont recommencé à fonctionner.

0 votes

Même après l'avoir fait plusieurs fois, cette astuce n'a pas fonctionné pour moi.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X