React Native Firebase Messaging:杀死状态下无点击调用自定义函数及弹窗需求问询
React Native Firebase Messaging 实现内置弹窗展示通知(应用杀死状态下)
React Native Firebase Messaging 本身没有直接提供拦截系统通知并替换为内置弹窗的功能,尤其是应用处于杀死状态时,系统会直接接管通知消息的展示。不过完全不需要修改库代码,通过官方API就能实现你的需求,分平台说明如下:
Android 实现方案
- 使用数据消息(Data Messages)替代通知消息:Firebase的通知消息(带
notification字段)在应用杀死时会被系统通知栏自动展示,而数据消息(仅含data字段)会绕过系统通知栏,直接传递到你的代码逻辑中。 - 具体步骤:
- 后端发送推送时,只包含
data字段,不要加notification字段。 - 在React Native中注册
BackgroundMessageHandler,处理后台(包括应用杀死状态)收到的数据消息:import messaging from '@react-native-firebase/messaging'; messaging().setBackgroundMessageHandler(async remoteMessage => { // 将消息存储到本地(比如MMKV、AsyncStorage) await saveNotificationToLocal(remoteMessage.data); }); - 在应用启动的根组件(比如App.js)中,读取本地存储的未展示通知,用自定义弹窗组件展示:
useEffect(() => { const checkStoredNotifications = async () => { const notifications = await getStoredNotifications(); if (notifications.length > 0) { // 展示自定义弹窗 showCustomNotificationModal(notifications[0]); // 标记为已读或删除 await removeNotificationFromLocal(notifications[0].id); } }; checkStoredNotifications(); }, []);
- 后端发送推送时,只包含
iOS 实现方案
- 使用静默通知(Silent Notifications):iOS在应用杀死状态下,只有携带
content-available: 1的静默通知能触发后台逻辑,且不会自动显示系统通知。 - 具体步骤:
- 后端发送的推送需包含
content-available: 1,同时只携带data字段(不要alert等通知字段)。 - 在React Native中同样注册
BackgroundMessageHandler,将消息存储到本地。 - 应用启动时读取本地存储,展示自定义弹窗。
- 注意:需要在Xcode中开启
Background Modes的Remote notifications选项,同时确保App已获取远程通知权限。
- 后端发送的推送需包含
特殊情况处理(如果后端必须发通知消息)
- Android:可以在原生层自定义
FirebaseMessagingService,重写onMessageReceived方法,拦截通知消息,将其存储到本地而非显示系统通知,然后React Native启动时读取。这种方式不需要修改RN Firebase库的代码,只需要在原生项目中扩展服务。 - iOS:应用杀死状态下,通知消息会直接被系统展示,无法拦截,因此这种情况只能要求后端切换为数据/静默消息格式。
总结:通过数据消息/静默消息+本地存储+启动时读取的方式,完全可以实现你的需求,不需要修改React Native Firebase Messaging的库代码,避免后续版本更新带来的维护问题。
内容的提问来源于stack exchange,提问作者Mohammad Faiz Quraishi
相关产品推荐
相关产品推荐

