firebase 检索发件人ID的FCM令牌之前未设置APNS设备令牌时出错

mzillmmw  于 2022-11-17  发布在  其他
关注(0)|答案(5)|浏览(735)

我收到来自firebase的消息,要求通知苹果推送通知。在firebase中,我有苹果推送通知密钥的证书,与Firebase中的Xcode项目中从Apple Developer中提取的ID相同。
但我不知道为什么会发生这种情况,我收到了此错误,它在消息传递扩展中注册了两个令牌:

extension AppDelegate : MessagingDelegate {
  func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String?) {}}

撷取寄件者识别码'########'的FCM Token之前,未设定APNS装置Token。将不会透过APNS传送此FCM Token的通知。请务必在设定APNS装置Token之后,重新撷取FCM Token。
添加了AppDelegate中的内容

import Firebase
import MasivPushIosSdk

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate{

    var firebaseToken: String = ""
    
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

        FirebaseApp.configure()
        self.registerForFirebaseNotification(application: application)
        Messaging.messaging().delegate = self
        return true
    }
    
    func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        Messaging.messaging().apnsToken = deviceToken
    }

    func registerForFirebaseNotification(application: UIApplication) {
        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 })
        } else {
            let settings: UIUserNotificationSettings =
                UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
            application.registerUserNotificationSettings(settings)
        }

        application.registerForRemoteNotifications()
    }
    
}

extension AppDelegate: MessagingDelegate, UNUserNotificationCenterDelegate {

//MessagingDelegate
    func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String?) {
        self.firebaseToken = fcmToken!
        print("Firebase token: \(fcmToken)")
    }

    //UNUserNotificationCenterDelegate
    func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
        print("APNs received with: \(userInfo)")
     }
}
j2cgzkjk

j2cgzkjk1#

这是一个仅用于模拟器的日志。您可以安全地忽略它。您得到此日志的原因是Firebase尝试创建从FCM令牌到APNS令牌的Map,以便将APNS消息发送到iOS设备。但是,模拟器上没有APNS令牌,因此Map失败。
尝试在实际设备上测试它,看看是否仍然会出现错误。

webghufk

webghufk2#

我在这个问题上花了很长时间。我终于让它与远程消息一起工作了。
它可以由几个主要原因引起。

  1. GoogleService-Info.plist没有通过xcode添加到您的项目中(如果需要,请选中“复制文件”)
  2. GoogleService-Info.plist应该出现在构建阶段-〉复制捆绑资源中。如果1完成,它会自动出现在这里。
    1.(如果您使用的是React Native)确保GoogleService-Info.plist信息指向Javascript代码所拥有的同一Firebase项目。
  3. Apple服务密钥和使用此密钥的firebase项目应指向相同的Apple捆绑包标识符。
    1.(如果您使用的是React Native)将其放入componentDidMount()中
const authStatus = await firebase.messaging().requestPermission();
  if (authStatus === 1) {
    let fcmToken = await firebase.messaging().getToken();
    if (fcmToken) {
      console.log('Firebase Push Token is:', fcmToken);
    } 
  }

1.最后,确保你的设备可以正常连接到互联网。我被困在这里,我的iPhone X有2个3酒吧,但没有连接到互联网,而使用相同的wifi作为我的开发笔记本电脑。我的笔记本电脑没有问题,所以我认为我的手机连接也可以。一天多的时间浪费了,因为我的假设。所以,只要仔细检查你的手机的连接工作。
如需更多信息:A)如果在本机工作:https://firebase.google.com/docs/cloud-messaging/ios/client B)如果使用React原生:https://rnfirebase.io/messaging/usage/ios-setup
注:不要混合A和B。一个用于本机IOS,另一个用于本机React。
我添加了React Native,因为我遇到了你的问题,在我的搜索,而使用它。

dm7nw8vv

dm7nw8vv3#

请确保未重命名身份验证密钥文件

在我的例子中,我已经将auth密钥文件重命名为其他文件,这就导致了这个问题。我尝试将它重命名为默认格式AuthKey_<KeyID>.p8,一切都开始工作了。

htrmnn0y

htrmnn0y4#

在我们的例子中,我们注意到它上面有一根圆木:

项目的捆绑包ID与“GoogleService-Info. plist”中的捆绑包ID不一致

于是,情况就这样了:我们的应用程序的捆绑包标识符与我们用于为Firebase项目创建iOS应用程序的捆绑包标识符不同。
使它们相同,解决了问题。

gijlo24d

gijlo24d5#

这可能是迟到了,但错误
撷取寄件者识别码'########'的FCM Token之前,未设定APNS装置Token。将不会透过APNS传送此FCM Token的通知。请务必在设定APNS装置Token之后,重新撷取FCM Token。
为我整理了一下

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        print("Yay! Got a device token 🥳 \(deviceToken)")
        Messaging.messaging().setAPNSToken(deviceToken, type: .unknown)
    }

相关问题