azn*_*e89 36 ios firebase swift firebase-cloud-messaging
我已经使用FirebaseAuth/FCM等实施了Firebase,并通过Firebase控制台成功发送了通知.
但是,我需要从我自己的应用服务器推送通知.
我想知道下面哪种方式是正确的方法来检索设备的注册ID: -
1)从didRegisterForRemoteNotificationWithDeviceToken中检索注册ID令牌
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)
}
Run Code Online (Sandbox Code Playgroud)
2)从firebase检索注册令牌(基于检索当前注册令牌的Firebase文档)
let token = FIRInstanceID.instanceID().token()!
Run Code Online (Sandbox Code Playgroud)
我正在使用第一种方式,即使注册ID相应地存储在我的应用服务器数据库上也没有收到推送通知,我得到了这个CURL会话结果: -
{"multicast_id":6074293608087656831,"success":0,"failure":1,"canonical_ids":0,"results":[{"error":"InvalidRegistration"}]}
Run Code Online (Sandbox Code Playgroud)
我还尝试了第二种方式,并在运行应用程序时遇到致命错误,如下所示: -
如果有人能指出我正确的方式表示赞赏,谢谢!
Sam*_*Sam 51
tokenRefreshNotification
启动应用程序时,并不总是调用该函数.
但是,当将代码放在常规didRegisterForRemoteNotificationsWithDeviceToken
委托函数中时,我每次都可以获取令牌:
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
if let refreshedToken = InstanceID.instanceID().token() {
print("InstanceID token: \(refreshedToken)")
}
}
Run Code Online (Sandbox Code Playgroud)
(Swift 3 + Firebase 4.0.4)
MBH*_*MBH 24
static var FirebaseToken : String? {
return InstanceID.instanceID().token()
}
Run Code Online (Sandbox Code Playgroud)
Mus*_*tri 24
Firebase推荐的方式:
let token = Messaging.messaging().fcmToken
Run Code Online (Sandbox Code Playgroud)
参考:在iOS上设置Firebase Cloud Messaging Client应用程序
Dan*_*aza 15
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
InstanceID.instanceID().instanceID(handler: { (result, error) in
if let error = error {
print("Error fetching remote instange ID: \(error)")
} else if let result = result {
print("Remote instance ID token: \(result.token)")
}
})
}
Run Code Online (Sandbox Code Playgroud)
斯威夫特4
友情提供:https://stackoverflow.com/a/50945350/1014164
InstanceID.instanceID().instanceID { (result, error) in
if let error = error {
print("Error fetching remote instange ID: \(error)")
} else if let result = result {
print("Remote instance ID token: \(result.token)")
}
}
Run Code Online (Sandbox Code Playgroud)
FCM设备令牌swift3
let fcmDeviceToken = FIRInstanceID.instanceID().token()
print("FCM token: \(fcmDeviceToken ?? "")")
Run Code Online (Sandbox Code Playgroud)
使用第二个选项,这看起来真的很愚蠢/简单,但要修复那个nil可选的致命错误,只需删除最后的force-unwrap
你的代码:
var token = FIRInstanceID.instanceID().token()!
成功:
var token = FIRInstanceID.instanceID().token()
这至少可以解决这个令人讨厌的崩溃问题
首先注册firebase令牌刷新通知:
NotificationCenter.default.addObserver(self, selector:
#selector(tokenRefreshNotification), name:
NSNotification.Name.InstanceIDTokenRefresh, object: nil)
Run Code Online (Sandbox Code Playgroud)
然后您可以在tokenRefreshNotification选择器中接收令牌:
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()
}
Run Code Online (Sandbox Code Playgroud)
获取当前的 FCM 令牌
if let token = Messaging.messaging().fcmToken {
// token is current fcmToken
}
Run Code Online (Sandbox Code Playgroud)
更新当前的 FCM 令牌
如果我们删除当前的 instanceId,稍后将通过 MessagingDelegate (messaging:didReceiveRegistrationToken) 收到新令牌。
InstanceID.instanceID().deleteID { (error) in
if let er = error {
print(er.localizedDescription)
} else {
print("instanceID().deleteID success ---------------?")
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
50216 次 |
最近记录: |