求助:Xamarin Firebase iOS 11下FCM Token始终为null问题
解决iOS 11上FCM Token始终为null的问题
我之前也遇到过几乎一模一样的情况!iOS 11环境下无论模拟器还是真机都拿不到FCM Token,但iOS 9完全正常,折腾了好一阵才梳理出几个关键修复点,你可以逐一排查:
1. 升级Firebase SDK版本
iOS 11对旧版FCM SDK的兼容性很差,一定要确保使用支持iOS 11的SDK版本。建议直接升级到最新的稳定版:
- 如果用CocoaPods,执行命令:
pod update Firebase/Messaging - 升级后记得Clean项目(
Cmd+Shift+K)再重新编译。
2. 严格检查APNs配置
iOS 11开始对推送权限和证书的校验更严格,这是最容易踩坑的点:
- 登录Apple开发者后台,确认APNs推送证书没有过期,并且对应正确的App Bundle ID;
- 检查项目的
Entitlements.plist,确保aps-environment字段配置正确:开发环境填development,生产环境填production; - 在Xcode的Signing & Capabilities页面,确认
Push Notifications已经开启,并且系统自动生成了正确的Entitlements配置。
3. 调整FCM Token的获取时机
iOS 11要求必须在用户授予推送权限之后,才能成功获取FCM Token——之前iOS 9可能在授权前调用也能拿到,但iOS 11不行:
- 确保Token获取代码放在
UNUserNotificationCenter的授权回调里,或者在applicationDidBecomeActive方法中重试获取,示例代码:UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound]) { granted, error in if granted { // 用户授权后再获取Token Messaging.messaging().token { token, error in if let error = error { print("获取FCM Token失败: \(error.localizedDescription)") } else if let token = token { print("FCM Token: \(token)") // 这里将Token作为参数传给WebView的URL } } } }
4. 实现MessagingDelegate的回调方法
直接调用token(completion:)可能因为时机问题拿不到Token,而MessagingDelegate的didReceiveRegistrationToken方法会在Token首次生成或更新时可靠触发,强烈建议实现这个方法:
extension AppDelegate: MessagingDelegate { func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String?) { guard let token = fcmToken else { print("FCM Token为空") return } // 处理Token,比如拼接WebView的URL参数 print("获取到FCM Token: \(token)") } }
记得在application(_:didFinishLaunchingWithOptions:)中设置代理:
Messaging.messaging().delegate = self
5. 清除旧Token缓存重试
有时候iOS 11上的旧Token缓存会导致获取失败,可以尝试删除现有Token后重新获取:
Messaging.messaging().deleteToken { error in if let error = error { print("删除旧Token失败: \(error.localizedDescription)") } else { // 删除成功后重新获取 Messaging.messaging().token { token, error in // 处理新Token } } }
我当时就是通过升级SDK+调整Token获取时机解决的问题,你可以按照上面的步骤逐一排查,应该能解决iOS 11上Token为null的问题。
内容的提问来源于stack exchange,提问作者eddigiff
相关产品推荐
相关产品推荐

