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

pour Swift3 / iOS10 voir ce lien:

iOS10, Swift 3 and Firebase Push Notifications (FCM)

j'essaie d'utiliser la base de données Firebase pour les Notifications et je l'ai intégrée exactement comme décrit dans les docs. Mais je ne comprends pas pourquoi ça ne marche pas. Quand 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)"

Ce 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)
}
35
demandé sur Community 2016-05-25 16:15:23

6 réponses

1.Avis d'Observateur dans didFinishLaunchingWithOptions Méthode

2.Et mettre tokenRefreshNotification méthode puis u obtenir Token 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)
}
13
répondu Sanandiya Vipul 2017-02-14 09:02:18

moi aussi j'avais le même problème et rien ne marchait pour moi. Mais tout ce que vous avez à faire est d'aller sur votre console firebase, puis de trouver votre projet et d'aller dans ses paramètres, Il vérifier dans son onglet messagerie cloud et télécharger votre .certificat p12.

that's it! heureux de codage :)

21
répondu starlord_amj 2016-07-15 11:54:02

1-Avez-vous correctement configuré vos certificats comme spécifié dans la documentation google ( Je ne me souviendrai pas du 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 eu quelques difficultés lors de la mise en place de la FCM. Une fois que j'ai pensé que tout allait bien mais les notifications ne fonctionnaient toujours pas, j'ai décidé de supprimer complètement le application du téléphone, nettoyer mon dossier de construction et réinstaller le tout. Après ça, ça marchait.

3 - l'application recevait des notifications, mais je recevais toujours le token "Failed to fetch" par défaut..." message. Il a disparu après un certain temps. Ne me demandez 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 chaque indice est le bienvenu. Alors peut-être cela peut vous aider. Acclamation :)

4
répondu Moose 2016-07-04 12:33:28

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 se déplacer

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

doit être appelé en appuyant sur un bouton, et non sur le chargement de l'application.

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

3
répondu michael chein 2016-11-21 08:28:29

FCM travaillait pour moi puis s'est arrêté. J'ai fait ce que Rabs G. a suggéré et enlevé l'application et installé à nouveau et les notifications ont commencé à fonctionner à nouveau.

2
répondu Ro4ch 2016-11-06 14:53:14

les réponses ci-dessus couvrent la plus grande partie de la question, mais j'ai eu la même question et j'ai trouvé l'info suivante utile:

  1. Firebase can 'rotate' (change) 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 à l'appareil.

  2. la base de données Firebase docs indique que la meilleure pratique consiste à utiliser un délégué pour surveiller les changements le délégué de la méthode de rappel:

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

[Obj - C]

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

[Swift]

la méthode delegate doit être appelée à chaque changement, à partir duquel vous pouvez mettre à jour l'enregistrement dans votre serveur.

  1. malheureusement, cela ne marchait pas pour moi, j'avais un délégué mais le rappel n'était pas invoqué. Donc j'ai dû recourir à la mise à jour manuelle un jeton sur chaque application se lance (comme suggéré par @michel chein-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
    

    [Swift]

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

  1. après cela, je reçois toujours le message d'avertissement/d'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 faute. Donc, je pense que ce commentaire est un peu hors sujet (éventuellement calculé le temps). Si vous pouvez obtenir l'option 2 de travailler pour vous, certainement faire cela!

2
répondu Peza 2017-06-06 07:32:37