You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 06:18:05