基于FCM的Android双应用(客户端与工作端)消息发送技术咨询
FCM消息发送逻辑常见技术问题与解决方案
嘿,针对你这段客户端用FCM发送消息的逻辑,我整理了几个开发中常遇到的技术问题和解决思路,都是实际踩过坑的经验:
1. 令牌(Token)相关问题
- 废弃API替换:你代码里用的
FirebaseInstanceId.getInstance().getToken()已经被Firebase官方废弃了,新版SDK推荐用异步方法FirebaseMessaging.getInstance().getToken()来获取令牌。旧方法可能在应用初始化未完成时返回null,直接导致消息发送失败。
修正后的代码示例:FirebaseMessaging.getInstance().getToken() .addOnCompleteListener(task -> { if (!task.isSuccessful()) { Log.w(TAG, "获取FCM令牌失败", task.getException()); return; } // 获取到有效令牌后再执行消息构建逻辑 String clientToken = task.getResult(); String jsonLatLng = new Gson().toJson(new LatLng(Common.placeLatLng.latitude, Common.placeLatLng.longitude)); Notification notification = new Notification(clientToken, jsonLatLng); Sender content = new Sender(tokenId, notification); mFCMService.sendMessage(content) .enqueue(new Callback<FCMResponse>() { @Override public void onResponse(Call<FCMResponse> call, Response<FCMResponse> response) { // 处理成功响应 } @Override public void onFailure(Call<FCMResponse> call, Throwable t) { // 处理请求失败 } }); }); - 令牌更新监听:FCM令牌会在应用卸载重装、设备系统更新、应用签名变更等场景下自动更新,你必须在客户端监听令牌更新事件,及时将新令牌同步到你的服务端或工作端应用,否则后续发送消息会收到
InvalidRegistration错误。
监听代码示例:FirebaseMessaging.getInstance().addOnNewTokenListener(token -> { Log.d(TAG, "令牌已刷新: " + token); // 这里将新令牌同步到你的服务端 });
2. 消息结构与目标校验
- 自定义数据解析一致性:你把
LatLng序列化为JSON传递,要确保工作端应用的解析逻辑和客户端序列化逻辑完全一致,比如Gson的配置、字段名匹配,否则会出现解析失败的情况。另外,如果需要在应用后台唤醒并处理消息,建议使用数据消息而非通知消息——通知消息在应用后台时会由系统弹窗展示,不会触发你的自定义业务逻辑。 - 目标令牌正确性:你的
Sender类中的tokenId必须是工作端应用的有效设备令牌(如果是发送到主题则是主题名称),一定要确认这个值是正确的目标接收方标识,否则消息会发送到错误设备或直接失败。
3. 回调逻辑完善
- 错误分支处理:你当前的
onResponse只写了开头,一定要补充onFailure分支以及onResponse中的失败响应处理,这样才能快速排查发送失败的原因,比如网络异常、FCM服务器返回的MismatchSenderId(服务器密钥与应用Sender ID不匹配)、QuotaExceeded(发送配额超限)等错误。
完善后的回调示例:@Override public void onResponse(Call<FCMResponse> call, Response<FCMResponse> response) { if (response.isSuccessful()) { Log.d(TAG, "消息发送成功: " + response.body()); } else { try { Log.e(TAG, "消息发送失败,响应错误: " + response.errorBody().string()); } catch (IOException e) { e.printStackTrace(); } } } @Override public void onFailure(Call<FCMResponse> call, Throwable t) { Log.e(TAG, "消息发送请求失败", t); }
4. 配置与权限检查
- FCM配置一致性:客户端和工作端都要确保
google-services.json配置正确,特别是Sender ID和API密钥要和Firebase控制台中的项目信息匹配,否则会出现MismatchSenderId错误。同时要确认依赖的FCM SDK版本一致,避免版本兼容问题。 - 网络权限配置:客户端必须拥有网络权限才能发送HTTP请求到FCM服务器,确保
AndroidManifest.xml中添加了:<uses-permission android:name="android.permission.INTERNET" />
内容的提问来源于stack exchange,提问作者ayabbear
相关产品推荐
相关产品推荐

