如何通过Messaging didReceiveRegistrationToken回调持续更新FCM Token?
FCM Token重复生成问题及持续更新方案
我遇到FCM Token重复生成两次的情况,想知道如何通过MessagingDelegate的didReceiveRegistrationToken回调来始终保持FCM Token处于更新状态,当前代码实现如下:
extension AppDelegate: MessagingDelegate { func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String?) { let deviceToken:[String: String] = ["token": fcmToken ?? ""] print("Device token: ", deviceToken) } }
解决Token重复生成及保持更新的方案
1. 过滤重复Token,仅在变化时同步到服务器
每次收到回调返回的Token时,先和本地存储的旧Token做对比,只有当两者不一致时,再执行上传服务器的操作,避免重复生成导致的无效同步。修改后的代码如下:
extension AppDelegate: MessagingDelegate { func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String?) { guard let newToken = fcmToken else { return } // 从本地存储读取旧Token let savedToken = UserDefaults.standard.string(forKey: "SavedFCMToken") if newToken != savedToken { // Token发生变化,执行上传服务器逻辑 let deviceToken = ["token": newToken] print("更新后的Device Token: ", deviceToken) // 这里添加你的服务器上传代码 // 更新本地存储的Token UserDefaults.standard.set(newToken, forKey: "SavedFCMToken") } } }
2. 启动时主动校验Token状态
在App启动阶段主动获取当前Token,和本地存储值做对比,确保服务器端的Token始终是最新的,避免因回调未触发导致的Token过期问题:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { FirebaseApp.configure() // 主动获取FCM Token并校验 Messaging.messaging().token { token, error in if let error = error { print("获取FCM Token失败: \(error.localizedDescription)") } else if let token = token { let savedToken = UserDefaults.standard.string(forKey: "SavedFCMToken") if token != savedToken { let deviceToken = ["token": token] print("App启动时更新的Device Token: ", deviceToken) // 执行服务器上传逻辑 UserDefaults.standard.set(token, forKey: "SavedFCMToken") } } } Messaging.messaging().delegate = self return true }
3. 理解重复回调的触发逻辑
didReceiveRegistrationToken会在多种场景下触发:App首次安装启动、Token过期失效、App被重新安装、系统推送设置变更等。SDK内部的状态同步可能导致重复回调,通过本地Token对比的方式可以有效过滤这类无效触发。
内容的提问来源于stack exchange,提问作者dhaval123
相关产品推荐
相关产品推荐

