如何解决Firebase Cloud Messaging获取token时SERVICE_NOT_AVAILABLE错误
错误成因
- 首先你的代码存在逻辑错误:FCM token获取是异步操作,当前实现的
getToken()方法是同步返回,监听器还没触发回调就直接返回了空字符串,会导致即使后续拿到token,上传到Firestore的token字段也是空值。 - 报错
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
相关产品推荐
相关产品推荐

