iOS平台下如何强制生成新的FCM Token?
解决Firebase 7.11.0强制生成FCM新Token失效的问题
你的代码在异步操作的顺序和状态管理上存在小问题,这才导致新生成的Token无法生效。结合你使用的Firebase 7.11.0版本,我来帮你梳理正确的流程和修正方案:
现有代码的核心问题
你把删除Installations、获取authToken、删除Messaging Token、获取新Token嵌套在一起,但异步操作的执行顺序没有得到严格保证——可能前一个删除操作还没完全完成,后面的获取Token操作就已经触发了,导致系统要么返回旧Token,要么生成的新Token没有正确绑定到新的Installations实例上。
修正后的流程和代码
在Firebase 7.x版本中,FCM Token是和Installations实例绑定的,正确的强制刷新流程需要确保每个异步操作完成后再执行下一步。我们可以用DispatchGroup来管理这些异步任务:
let dispatchGroup = DispatchGroup() // 第一步:先删除当前的Messaging Token dispatchGroup.enter() Messaging.messaging().deleteToken { error in print("Messaging Token 删除结果: \(error?.localizedDescription ?? "成功")") dispatchGroup.leave() } // 等待Token删除完成后,再删除Installations实例 dispatchGroup.notify(queue: .main) { dispatchGroup.enter() Installations.installations().delete { error in print("Installations 删除结果: \(error?.localizedDescription ?? "成功")") dispatchGroup.leave() } // 等待Installations删除完成后,强制刷新并获取新的Token dispatchGroup.notify(queue: .main) { // 先强制刷新authToken,确保新的Installations实例已初始化 Installations.installations().authTokenForcingRefresh(true) { authResult, authError in if let authError = authError { print("获取Auth Token失败: \(authError)") return } print("新Auth Token已生成: \(authResult?.authToken ?? "")") // 最后获取新的FCM Token Messaging.messaging().token { newToken, tokenError in if let validToken = newToken { print("✅ 新FCM Token生成成功: \(validToken)") } else { print("❌ 获取新FCM Token失败: \(tokenError?.localizedDescription ?? "未知错误")") } } } } }
额外注意事项
- 网络连接:确保设备处于联网状态,所有删除和获取Token的操作都需要和Firebase服务器通信
- 配置正确性:既然旧Token能正常使用,说明
GoogleService-Info.plist配置没问题,但可以确认下文件没有被误修改 - 避免重复操作:不要在短时间内多次触发刷新流程,否则可能导致服务器端状态不一致
- 后台状态:如果在后台执行这个流程,需要确保应用有足够的后台权限完成网络请求
内容的提问来源于stack exchange,提问作者Tal Zion
相关产品推荐
相关产品推荐

