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

Android WebView应用FCM通知无法接收的问题排查求助

FCM通知无法接收的问题排查与解决

核心问题:调用了空实现的通知方法

你的MyFirebaseMessagingService中,onMessageReceived方法调用的是sendNotification(from, body),但这个方法只是用Handler提交了一个空Runnable,完全没有触发通知构建逻辑。真正能生成通知的sendNotification(String messageBody)方法根本没被调用,这是导致通知不显示的直接原因。

解决方法:
修改onMessageReceived中的调用逻辑,删掉空实现的重载方法,确保调用正确的通知构建方法:

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    System.out.println("From: " + remoteMessage.getFrom());

    String messageBody = "";
    // 处理通知消息
    if (remoteMessage.getNotification() != null) {
        messageBody = remoteMessage.getNotification().getBody();
        System.out.println("Message Notification Body: " + messageBody);
    }
    // 处理数据消息(后台也能触发onMessageReceived)
    if (remoteMessage.getData().size() > 0) {
        messageBody = remoteMessage.getData().get("body");
        System.out.println("Message Data Body: " + messageBody);
    }

    // 调用正确的通知生成方法
    sendNotification(messageBody);
}

// 删除无用的空方法
// private void sendNotification(String from,String body){...}

FCM消息类型适配问题

FCM分两种消息类型,不同类型的处理逻辑不同:

  • 纯通知消息(payload仅含notification字段):应用后台时,FCM系统会直接弹出默认通知,不会走到onMessageReceived;只有应用前台时才会触发该方法。
  • 数据消息(payload仅含data字段):无论应用前后台,都会触发onMessageReceived,需要你自己构建通知。

解决方法:

  1. 先在应用前台状态测试,查看日志确认onMessageReceived是否被触发。
  2. 如果需要后台也自定义通知,发送数据消息,格式示例:
{
  "to": "你的FCM令牌",
  "data": {
    "title": "TeknoFore",
    "body": "测试数据消息"
  }
}

资源与配置检查

  1. 小图标资源存在性:
    通知必须设置有效小图标,确认R.drawable.ic_stat_notification资源存在,若不存在替换为应用内已有图标(如R.mipmap.ic_launcher)。

  2. google-services.json配置:

    • 确保文件内的package_name与应用的applicationId完全一致。
    • 发布版测试时,需将应用签名的SHA-1指纹添加到Firebase控制台项目设置中。
  3. 权限检查:

    • 确保AndroidManifest.xml添加了INTERNET权限:
      <uses-permission android:name="android.permission.INTERNET" />
      
    • Android 13+需动态申请POST_NOTIFICATIONS权限,补充代码确认权限授予:
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
          if (ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS)
                  != PackageManager.PERMISSION_GRANTED) {
              registerForActivityResult(new ActivityResultContracts.RequestPermission(), isGranted -> {
                  if (!isGranted) {
                      // 提示用户开启通知权限
                  }
              }).launch(Manifest.permission.POST_NOTIFICATIONS);
          }
      }
      

其他优化建议

  • 提前创建通知渠道:将通知渠道创建逻辑移到应用启动时(如MainActivity.onCreate),避免首次发送通知时渠道未初始化完成。
  • 确认令牌获取成功:在令牌获取代码中添加日志输出,确保能拿到有效FCM令牌:
    String msg = "FCM Token: " + token;
    Log.d("FCM", msg);
    Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 22:09:53