2017-09-21 53 views
0

我已经尝试了很多可能对这个问题的解决问题后,我的问题并没有被解决:didRefreshRegistrationToken如果用户不允许不会被调用的通知迅速

我想FCM Token。在AppDelegate.swift我已经导入

import UserNotifications 
import Firebase 
import FirebaseInstanceID 
import FirebaseMessaging 

之后,我已经与UNUserNotificationCenterDelegate, MessagingDelegate扩展它,然后在didFinishLaunchingWithOptions我说:

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() 

此后,我已经添加了这四个函数:

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)") 
    } 

现在的问题是,当我运行应用程序,它显示警报,要求发送通知的权限。允许或禁止它不是我所关心的,我已经实施了MessagingDelegate方法didRefreshRegistrationToken所以它应该被调用,但它没有调用该方法。所以我错过了什么?

回答

2

您必须添加一个观察员像

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

而在你的AppDelegate添加这个方法就像

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

希望它能帮助。

0

正如Firebase Docs提到的,您可以:

  1. 供应符合FIRMessagingDelegate协议
  2. 听一个NSNotification委托名为kFIRMessagingRegistrationTokenRefreshNotification

如果你把第一个选项,你需要设置代理人

Messaging.messaging().delegate = self 

您可以在quickstart example code

相关问题