如何在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
相关产品推荐
相关产品推荐

