web-dev-qa-db-fra.com

Échec d'extraction du jeton par Notification APNS Firebase

Pour Swift3/iOS10, voir ce lien:

ios10, Swift 3 et notifications push de Firebase (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 ça ne marche 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)"

C'est 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.Set Notification Observer in didFinishLaunchingWithOptions Méthode

2.And Set tokenRefreshNotification méthode, puis vous obtenez Token dans cette méthode.

voir code ci-dessous

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)
}
13
Sanandiya Vipul

Moi aussi j'avais le même problème et rien ne fonctionnait pour moi. Mais tout ce que vous avez à faire est d’aller dans votre console Firebase, puis de rechercher votre projet et d’avoir ses paramètres, de vérifier son onglet de messagerie en nuage et d’y télécharger votre certificat.

c'est ça! Bonne codage :)

22
starlord_amj

1 - Avez-vous correctement configuré vos certificats comme spécifié dans la documentation de Google (je ne rappellerai pas 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é des difficultés lors de la création de FCM. Une fois que je pensais 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, ça fonctionnait.

3 - L'application recevait des notifications, mais le message "Échec lors de l'extraction du jeton par défaut ..." était toujours affiché. Il a disparu après un moment. Ne me demande pas pourquoi!

Ce n'est pas vraiment une bonne réponse, je partage juste mon expérience parce que je sais que configurer la notification n'est pas facile et que chaque indice est le bienvenu. Alors peut-être que celui-ci peut aider. À votre santé :)

4
Moose

Après avoir essayé tout ce qui précède (et tout ce que je pourrais trouver ailleurs), ce qui résout le problème pour moi est de déménager.

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

être appelé lorsque vous appuyez sur un bouton et non lors du chargement de l'application.

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

3
michael chein

FCM travaillait pour moi alors juste arrêté. J'ai fait ce que Rabs G. a suggéré et supprimé l'application, puis installé à nouveau et les notifications ont recommencé à fonctionner.

2
Ro4ch

Les réponses ci-dessus couvrent l'essentiel du problème, mais j'avais le même problème et j'ai trouvé les informations suivantes utiles:

  1. Firebase peut 'faire pivoter' (changer) le jeton FCM d'un utilisateur à tout moment. Il s'agit de l'ID à 128 caractères que votre serveur utilisera pour envoyer la notification Push au périphérique.

  2. La documentation Firebase indique que la meilleure pratique consiste à utiliser un délégué pour surveiller les modifications à l'aide de la méthode de rappel par délégué:

    - (void)messaging:(nonnull FIRMessaging *)messaging didRefreshRegistrationToken:(nonnull NSString *)fcmToken
    

[Obj - C]

func messaging(_ messaging: Messaging, didRefreshRegistrationToken fcmToken: String)

[Rapide]

La méthode déléguée doit être appelée à chaque modification. Vous pouvez alors mettre à jour l'enregistrement sur votre serveur.

  1. Malheureusement, cela ne fonctionnait pas pour moi, j'avais un délégué mais le rappel n'était pas appelé. J'ai donc dû recourir à la mise à jour manuelle du jeton à chaque lancement d'application (comme suggéré par @micheal chein ci-dessus) comme suit:

    NSString *deviceToken = [FIRInstanceID instanceID].token; // Send this to your server
    

    [Obj-C]

    let token = FIRInstanceID.instanceID().token() // Send this to your server
    

    [Rapide]

** Important: mettez à jour le jeton après un délai (20-25 secondes), car la rotation ne peut parfois refléter qu'après un certain temps. Vous pouvez utiliser une minuterie pour cela.

  1. Après cela, je reçois toujours le message d’avertissement/erreur APNS:

    2017-06-06 09:21:49.520: <FIRInstanceID/WARNING> Failed to fetch APNS token Error Domain=com.firebase.iid Code=1001 "(null)"
    

MAIS , Les notifications push fonctionnent à chaque fois sans échec. Donc, je pense que ce message est un peu éteint (peut-être mal interprété). Si vous pouvez obtenir l'option 2 pour travailler pour vous, faites-le!

2
Peza