正确的方法来检索FCM的令牌 - iOS 10 Swift 3

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)

  • 如果有人做了我所做的, deviceToken:Data 参数不是 FCM 注册令牌。来自 InstanceID().token() 的令牌是。 (2认同)

MBH*_*MBH 24

Swift 3 + Firebase 4.0.4:

static var FirebaseToken : String? {
    return InstanceID.instanceID().token()
}
Run Code Online (Sandbox Code Playgroud)

  • 只是为了澄清; 你和下面的答案有什么区别(`Messaging.messaging().fcmToken`)?@MBH (3认同)

Mus*_*tri 24

Firebase推荐的方式:

let token = Messaging.messaging().fcmToken
Run Code Online (Sandbox Code Playgroud)

参考:在iOS上设置Firebase Cloud Messaging Client应用程序


Dan*_*aza 15

Swift 4 + Firebase(5.3.0)

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)


coh*_*n72 7

斯威夫特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)


jaz*_*bpn 6

FCM设备令牌swift3

    let fcmDeviceToken = FIRInstanceID.instanceID().token()
    print("FCM token: \(fcmDeviceToken ?? "")")
Run Code Online (Sandbox Code Playgroud)


Joh*_*rdo 5

使用第二个选项,这看起来真的很愚蠢/简单,但要修复那个nil可选的致命错误,只需删除最后的force-unwrap

你的代码:
var token = FIRInstanceID.instanceID().token()!
成功:
var token = FIRInstanceID.instanceID().token()

这至少可以解决这个令人讨厌的崩溃问题


Nav*_*han 5

首先注册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)


Bro*_*Han 5

获取当前的 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)