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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:41:53