【问题标题】:Firebase: How to translate a device token into a FCM tokenFirebase:如何将设备令牌转换为 FCM 令牌
【发布时间】:2024-05-20 02:45:02
【问题描述】:

我正在尝试将 Firebase 用于推送通知。但是,我遇到了障碍,即我无法在 iOS 中做那件事。我尝试了两种方法

Messaging.messaging().setAPNSToken(deviceToken, type: .prod) and InstanceID.instanceID().setAPNSToken(deviceToken, type: InstanceIDAPNSTokenType.sandbox)

第二名

application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data)

已导入 Firebase

我该怎么办?

编辑: 这是补充信息,错误信息是这样的。 无法获取默认令牌错误 Domain=com.firebase.iid Code=1003 "(null)" 我google了一下,没有相关信息。

【问题讨论】:

  • 如果你解决了我也有同样的问题,你能发布答案吗?

标签: ios firebase push-notification firebase-cloud-messaging


【解决方案1】:

所以你很接近。以下是 Cloud Messaging 的 Firebase 4.0 版本中现在发生的情况...

  1. 当您致电 application.registerForRemoteNotifications() 时,iOS 将请求 APNs 证书,就像任何其他 iOS 应用程序一样。

  2. 假设您尚未关闭方法调配(您可能还没有),Firebase 将自动在其自己调配的didRegisterForRemoteNotificationsWithDeviceToken 方法中将该 APNs 令牌交换为 FCM 令牌。

    李>
  3. 交换完成后,Firebase 会通知您的应用。过去,这样做的唯一方法是创建一个 kFIRMessagingRegistrationTokenRefreshNotification 类型的 NSNotification。但是这些天,它也可以通过MessagingDelegate让你知道。因此,最简单的做法是通过调用...声明您的 AppDelegate 一个消息传递委托...

    Messaging.messaging().delegate = self
    

    ...然后实现messaging(_:didRefreshRegistrationToken) 方法。

    func messaging(_ messaging: Messaging, didRefreshRegistrationToken fcmToken: String) {
      print("Look! I have an FCM token! \(fcmToken)")
    }
    

因此,tl;dr 是您不需要手动将 APNs 令牌交换为 FCM 令牌,您只需设置您的委托,以便在 FCM 库为您执行此操作时收到通知。

【讨论】:

  • 在您回答之前,我的调酒设置已开启!所以,我必须处理所有事情,但现在我关闭并让我的 AppDelegate 类符合 MessageDelegate 类,遵循你的建议。在 messaging(_:didRefreshRegistrationToken) 中,我写了一个初始化。但是,在执行application.registerForRemoteNotifications() 之后不会调用messaging(_:didRefreshRegistrationToken)。我的application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) 仍然被调用。为什么?
  • 我也有同样的问题,但是我把 Method Swizzling 关掉了,文档说 didRefreshRegistrationToken 仅适用于 IOS 10+ ,对于低于该版本的我该怎么办?,我用Messaging.messaging().shouldEstablishDirectChannel = true 而不是 connectdisconnect 方法,但是当我禁用方法调配时,我无法从 Notification.Name.MessagingRegistrationTokenRefreshed 收到通知,它杀死了我:(