2017-09-21 9 views
0

Mon problème n'est pas résolu après que je l'ai essayé beaucoup de questions qui pourraient avoir la solution à ce problème:didRefreshRegistrationToken n'est pas appelé si l'utilisateur Ne laissez pas les notifications rapides

Je veux FCM Token. En AppDelegate.swift j'ai importé

import UserNotifications 
import Firebase 
import FirebaseInstanceID 
import FirebaseMessaging 

Après que je l'ai étendu avec UNUserNotificationCenterDelegate, MessagingDelegate puis dans didFinishLaunchingWithOptions J'ai ajouté:

if #available(iOS 10.0, *) { 
      // For iOS 10 display notification (sent via APNS) 
      UNUserNotificationCenter.current().delegate = self 
      let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound] 
      UNUserNotificationCenter.current().requestAuthorization(
       options: authOptions, 
       completionHandler: {_, _ in }) 
      // For iOS 10 data message (sent via FCM 
      Messaging.messaging().delegate = self 
     } else { 
      let settings: UIUserNotificationSettings = 
       UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil) 
      application.registerUserNotificationSettings(settings) 
     } 

     application.registerForRemoteNotifications() 

     FirebaseApp.configure() 

Et après que je l'ai ajouté ces quatre fonctions:

func application(_ application: UIApplication, 
        didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { 
     Messaging.messaging().apnsToken = deviceToken as Data 

    } 

    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping() -> Void) { 
     print("Here") 
    } 

    func messaging(_ messaging: Messaging, didReceive remoteMessage: MessagingRemoteMessage) { 
     print("Received data message: \(remoteMessage.appData)") 
    } 

    func messaging(_ messaging: Messaging, didRefreshRegistrationToken fcmToken: String) { 
     print("Firebase registration token: \(fcmToken)") 
    } 

Maintenant, le problème est lorsque j'exécute l'application, il montre l'alerte qui demande des autorisations pour l'envoi de notification. L'autoriser ou l'interdire n'est pas mon souci J'ai mis en application MessagingDelegate la méthode didRefreshRegistrationToken ainsi il devrait être appelé, mais il n'appelle pas cette méthode. Alors, je manque quelque chose?

Répondre

2

Vous devez ajouter un observateur comme

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

Et ajoutez cette méthode dans votre Appdelegate comme

func tokenRefreshNotification(_ notification: Notification) { 
    if let refreshedToken = InstanceID.instanceID().token() { 
     print("InstanceID token: \(refreshedToken)") 
    } 
} 

Hope it helps.

0

Comme mentionné dans le Firebase Docs, vous pouvez:

  1. offre un délégué conforme au protocole FIRMessagingDelegate
  2. écouter un NSNotification nommé kFIRMessagingRegistrationTokenRefreshNotification

Si vous prenez la première option, vous besoin de définir le délégué

Messaging.messaging().delegate = self 

Vous pouvez le voir dans le quickstart example code