正确的方式来检索FCM的令牌 – iOS 10 Swift 3

我已经通过FirebaseAuth / FCM等实现了Firebase,并通过Firebase控制台成功发送了通知。

不过,我需要从我自己的应用程序服务器推送通知。

我想知道下面哪种方式是正确的方式来检索设备的注册ID:

1)从didRegisterForRemoteNotificationWithDeviceToken中检索注册标识符

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { var token = "" for i in 0..<deviceToken.count { token += String(format: "%02.2hhx", arguments: [deviceToken[i]]) } print("Registration succeeded!") print("Token: ", token) Callquery(token) } 

2)从 Firebase中检索注册令牌 (基于检索当前注册令牌的Firebase文档)

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

我正在使用第一种方式,即使注册ID相应地存储在我的应用程序服务器数据库上,也没有收到推送通知,我得到这个CURL会话结果: –

 {"multicast_id":6074293608087656831,"success":0,"failure":1,"canonical_ids":0,"results":[{"error":"InvalidRegistration"}]} 

我也尝试了第二种方式,并得到致命错误,如下所示运行应用程序: – 在这里输入图像说明

如果有人能指出我正确的方式感谢赞赏,谢谢!

tokenRefreshNotification函数在启动应用程序时并不总是被调用。

但是,将代码放在常规的didRegisterForRemoteNotificationsWithDeviceToken委托函数内时,每次都可以获取令牌:

 func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { if let refreshedToken = FIRInstanceID.instanceID().token() { print("InstanceID token: \(refreshedToken)") } } 

(swift 3)

Swift 3 + Firebase 4.0.4:

 static var FirebaseToken : String? { return InstanceID.instanceID().token() } 

去第二个选项,这看起来真的很愚蠢/简单,但要解决这个零可选的致命错误,只需删除最后的解压

你的代码:
var token = FIRInstanceID.instanceID().token()!
做了:
var token = FIRInstanceID.instanceID().token()

那至less会解决这个令人讨厌的崩溃

FCM设备令牌swift3

  let fcmDeviceToken = FIRInstanceID.instanceID().token() print("FCM token: \(fcmDeviceToken ?? "")") 

Firebase推荐的方式:

 let token = Messaging.messaging().fcmToken 

参考: 在iOS上设置Firebase云消息传递客户端应用程序

首先注册firebase令牌刷新通知:

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

然后,您可以在tokenRefreshNotificationselect器中接收标记:

 func tokenRefreshNotification(_ notification: Notification) { if let refreshedToken = FIRInstanceID.instanceID().token() { print("InstanceID token: \(refreshedToken)") } // Connect to FCM since connection may have failed when attempted before having a token. connectToFcm() } 

尝试这个

 let credential = FIRFacebookAuthProvider.credential(withAccessToken;FBSDKAccessToken.current().tokenString)