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,需要你自己构建通知。
解决方法:
- 先在应用前台状态测试,查看日志确认
onMessageReceived是否被触发。 - 如果需要后台也自定义通知,发送数据消息,格式示例:
{ "to": "你的FCM令牌", "data": { "title": "TeknoFore", "body": "测试数据消息" } }
资源与配置检查
小图标资源存在性:
通知必须设置有效小图标,确认R.drawable.ic_stat_notification资源存在,若不存在替换为应用内已有图标(如R.mipmap.ic_launcher)。google-services.json配置:
- 确保文件内的
package_name与应用的applicationId完全一致。 - 发布版测试时,需将应用签名的SHA-1指纹添加到Firebase控制台项目设置中。
- 确保文件内的
权限检查:
- 确保
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
相关产品推荐
相关产品推荐

