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

如何在Firebase Messaging中实现推送拒收功能

核心原因

你当前使用的是FCM/主流推送SDK的通知消息类型,这类消息的触发逻辑和你预期不符:

  • App在前台运行时,通知消息才会走到你重写的onMessageReceived回调
  • App切后台/被杀死时,通知消息不会走上述自定义回调,会直接由系统/推送SDK在通知栏弹出,所以你加在onMessageReceived里的开关判断完全没有执行机会,自然拦不住推送。

解决方案


1. 推荐方案:改用数据消息推送

要求后端同事把推送的payload结构从notification类型改成data类型,这类消息无论App处于前台还是后台,都会触发onMessageReceived回调,你可以在回调入口优先判断开关状态,拦截逻辑就可以生效了。
修改后的onMessageReceived示例代码:

override fun onMessageReceived(remoteMessage: RemoteMessage) {
    // 入口优先判断推送开关是否开启,未开启直接终止后续逻辑
    if (!sysPref.pushEnabled) return

    Log.d(TAG, "From: " + remoteMessage.from)
    // 数据消息的内容从data字段取值,自行构造通知
    val pushTitle = remoteMessage.data["title"] ?: return
    val pushContent = remoteMessage.data["content"] ?: return
    sendNotification(pushTitle, pushContent)
}

2. 兼容方案:无法修改推送类型的情况

如果后端无法调整推送类型,只能用通知消息的话,只能覆盖前台场景的拦截,后台场景的通知消息无法通过自定义代码拦截,不推荐使用该方案。

3. 补充校验点

如果切换为数据消息后开关依然不生效,检查以下配置:

  • 如果你将推送服务配置在独立进程,默认MODE_PRIVATE模式的SharedPreferences不支持跨进程读写,会导致读不到开关状态,需要将存储逻辑替换为支持跨进程的实现,比如MODE_MULTI_PROCESS模式的SharedPreferences,或者Jetpack DataStore。
  • 检查开关状态的读写逻辑是否一致,避免存和读的key名称不匹配的低级错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 06:18:03