繁体   English   中英

如何检测真正的 iOS/APNS 推送令牌何时注册到 Firebase 云消息传递 (FCM)?

[英]How can I detect when the real iOS/APNS push token is registered with Firebase Cloud Messaging (FCM)?

即使用户没有授予推送通知权限,也会调用如下所示的 Firebase 的didReceiveRegistrationToken 我需要确保正在注册 APNS 推送令牌以进行分析,并将其保存在我的服务器上,但是即使用户未授予推送权限,也会调用此 function。 ♂️

/**
 * Requirement for Firebase push notifications.
 * See documentation here: https://firebase.google.com/docs/cloud-messaging/ios/client
 */
extension AppDelegate: MessagingDelegate {
    // Note: This callback is fired at each app startup and whenever a new token is generated.
    func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String) {
        print("Firebase registration token: \(fcmToken)")
        let dataDict: [String: String] = ["token": fcmToken]
        NotificationCenter.default.post(name: Notification.Name("FCMToken"), object: nil, userInfo: dataDict)
        print("Getting called even if the user hasn't opted in for push notifications!")
    }
}

TL;DR :FCM 令牌不是检测 APNS 令牌是否已注册的可靠方法。 禁用 firebase 中的方法 swizzling 并手动监听 APNS 注册

  1. FCM Tokens: FCM 令牌也称为设备实例 ID; 它标识该特定设备上的特定应用程序。 换句话说, FCM 令牌不等于 APNS 令牌。 这是一种解释: APNs、FCM 或 GCM 令牌

  2. FCM 令牌自动生成:令人惊讶的是,即使没有 iOS 用户授予权限,Firebase 也会在应用启动时生成 FCM 令牌。 我猜它想找到一种方法来识别应用程序和设备对,所以一旦你启动,你就会有一个 FCM 令牌。 如果需要,您可以禁用自动生成并等待用户选择加入。

默认情况下,FCM SDK 在应用启动时为客户端应用实例生成一个注册令牌。 如果您想在使用实例 ID 之前获得明确的选择加入,您可以通过禁用 FCM 来防止在配置时生成。 为此,请将元数据值添加到您的 Info.plist(而不是您的 GoogleService-Info.plist):

这就是问题之一! 即使用户禁用了 FCM 令牌的自动生成,也会在提示用户启用推送通知时生成一个,而不是在用户接受推送通知权限时生成。 这似乎很奇怪,我最终将此报告给 Firebase。

  1. APNS Token Swizzling :所以默认情况下 Firebase 接管 AppDelegate 的didRegisterForRemoteNotificationsWithDeviceToken (称为“swizzling”)。 您可以禁用它并自己覆盖委托方法。 这将使您可以访问 APNS 令牌和 FCM 令牌。
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    print("Successfully registered for notifications!")
    // Required to make FCM work since we disabled swizzling!
    Messaging.messaging().apnsToken = deviceToken
    // String version of APNS so we can use save it/use it later/do analytics.
    let apnsToken = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
}

获取设备 ID 令牌的回调和获取实际推送消息的回调是两件不同的事情。 设备 ID 令牌回调只是为您提供一个标识设备的令牌,以便稍后推送通知。 它实际上并不是推送通知本身。 这只是一个身份证。

也就是说,如果您从安全角度不同意客户端 SDK 的行为,您可以直接联系 Firebase 支持并提供反馈。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM