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

如何解决Firebase Cloud Messaging获取token时SERVICE_NOT_AVAILABLE错误

错误成因
  1. 首先你的代码存在逻辑错误:FCM token获取是异步操作,当前实现的getToken()方法是同步返回,监听器还没触发回调就直接返回了空字符串,会导致即使后续拿到token,上传到Firestore的token字段也是空值。
  2. 报错SERVICE_NOT_AVAILABLE的核心原因是FCM服务和Google Play服务的通信链路偶发不可用,除了你已经排查的网络、配置问题外,常见触发场景包括:
    • 设备的Google Play服务版本过旧,和当前集成的FCM SDK版本不兼容
    • 网络环境虽然连通,但存在针对FCM域名的限制、代理干扰,导致FCM的长连接建立失败
    • 应用刚安装/刚授权Google Play服务权限时,FCM服务还未完成初始化就发起了token获取请求
解决方案
  • 首先修复异步获取token的逻辑错误,不要同步返回token,要等token获取成功回调后再执行用户信息上传操作,示例代码如下:
// 先发起token获取请求,回调成功后再构造User对象上传
FirebaseMessaging.getInstance().token.addOnSuccessListener { token ->
    val user = User(
        et_email_sign_up_activity.text.toString(), 
        et_name_sign_up_activity.text.toString(),
        et_mobile_sign_up_activity.text.toString(), 
        "",
        FirebaseAuth.getInstance().currentUser?.uid!!, 
        tv_address.text!!.toString(), 
        token
    )
    Firebase().uploadUserSignIn(user, this)
}.addOnFailureListener {
    val dialog = AlertDialog.Builder(this)
    dialog.setMessage(it.toString())
    dialog.show()
}
  • 针对SERVICE_NOT_AVAILABLE报错的修复方案:
    • 检查项目依赖的FCM SDK版本,和设备上的Google Play服务版本,确保SDK版本不高于Google Play服务支持的最高版本,也可以在应用启动时加Google Play服务版本校验逻辑,提示用户升级到最新版Google Play服务。
    • 给FCM token获取逻辑加重试机制,捕获到SERVICE_NOT_AVAILABLE异常时,做指数退避重试,最多重试3-5次,避免偶发网络波动导致获取失败。
    • 测试时确认网络可以正常访问Google服务,避免代理、防火墙拦截FCM的请求域名。
    • 把token获取操作延迟到应用初始化完成、FirebaseAuth登录成功之后再执行,不要在应用冷启动第一时间就发起请求。

内容的提问来源于stack exchange,提问作者Aditya Dixit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 22:24:07