Firebase Messaging出现SERVICE_NOT_AVAILABLE崩溃无法复现求解决方案
解决方案
1. 升级FCM相关依赖版本
你当前使用的firebase-messaging:22.0.0存在已知的未捕获异常bug,谷歌官方在23.0.0及以上版本已经修复了该问题,会自动捕获SERVICE_NOT_AVAILABLE、超时类异常,不会向上抛出导致应用崩溃,直接升级依赖到最新稳定版即可解决大部分崩溃。
2. 增加FCM操作异常捕获兜底
如果因为项目兼容限制无法升级依赖,在所有FCM相关操作外层添加异常捕获:
- 调用
FirebaseMessaging.getInstance().getToken()获取token的逻辑外层添加try-catch,捕获所有ExecutionException、IOException、TimeoutException类异常,异常直接内部消化不抛出 - 为FCM相关线程配置自定义未捕获异常处理器,过滤FCM抛出的服务不可用、超时类异常,避免直接触发应用崩溃
// 示例代码 try { FirebaseMessaging.getInstance().getToken() .addOnCompleteListener(task -> { if (!task.isSuccessful()) { return; } String token = task.getResult(); // 正常处理token逻辑 }); } catch (Exception e) { // 捕获同步抛出的异常 }
3. 前置GMS服务可用性检测
该类崩溃90%以上出现在无内置GMS服务、GMS服务被用户禁用、或网络环境无法访问谷歌服务的设备上,可以在初始化FCM之前先检测设备GMS服务状态,仅服务正常的设备才执行FCM相关逻辑:
// GMS服务可用性检测示例 int gmsStatus = GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(context); if (gmsStatus == ConnectionResult.SUCCESS) { // GMS服务正常,执行FCM初始化、token获取等操作 } else { // GMS不可用,跳过所有FCM相关逻辑 }
4. 调整FCM初始化时机
不要在Application.onCreate中同步执行FCM token获取操作,调整为应用首页渲染完成后,在子线程中延迟初始化,避免启动阶段网络不稳定触发超时异常。
内容的提问来源于stack exchange,提问作者DAS
相关产品推荐
相关产品推荐

