React Native iOS端首次启动应用时messaging().onMessage不触发问题咨询
问题原因
- iOS端Firebase Messaging依赖APNs服务完成消息链路搭建,和Android端原生链路直接初始化的逻辑不同:首次启动时,你的
onMessage监听在组件挂载时就完成了注册,但此时iOS还没走完通知权限申请、APNs token获取、Firebase服务和APNs链路绑定的全流程,导致监听器没有被正确绑定到消息分发队列,无法捕获前台消息。 - 冷启动初始化延迟:
@react-native-firebase/messaging的iOS端实现存在冷启动初始化耗时,首次启动时Messaging实例还没完全挂载完成就注册监听器,会导致监听器失效,第二次启动时本地已经有缓存的权限和token,初始化速度大幅提升,所以监听器可以正常绑定。 - 权限申请阻塞:如果通知权限申请和
onMessage注册在同一时序触发,权限弹窗未完成用户确认前,Firebase Messaging的前台监听通道不会激活,也会导致首次启动的消息无法捕获。
解决方案
方案1:调整监听注册时机,等Messaging初始化完成后再注册监听
把原来的空依赖useEffect改成依赖权限申请结果和Messaging初始化状态,代码示例:
import { Alert } from 'react-native'; import messaging from '@react-native-firebase/messaging'; import { useEffect, useState } from 'react'; function FCMReadInForeGround() { const [isMessagingReady, setIsMessagingReady] = useState(false); // 先完成通知权限申请和链路初始化 useEffect(() => { const initFCM = async () => { // 申请通知权限 const authStatus = await messaging().requestPermission(); const enabled = authStatus === messaging.AuthorizationStatus.AUTHORIZED || authStatus === messaging.AuthorizationStatus.PROVISIONAL; if (enabled) { // 主动获取一次APNs token确保链路打通 await messaging().getAPNSToken(); setIsMessagingReady(true); } }; initFCM(); }, []); // 等Messaging就绪后再注册onMessage监听 useEffect(() => { if (!isMessagingReady) return; const unsubscribe = messaging().onMessage(async remoteMessage => { Alert.alert('A new FCM message arrived!', JSON.stringify(remoteMessage)); }); return unsubscribe; }, [isMessagingReady]); return null; } export default FCMReadInForeGround;
方案2:添加初始化延迟(适配v14以下版本的RN Firebase)
如果你使用的是@react-native-firebase/messaging v14以下的旧版本,可以在注册监听前加500ms左右的延迟,规避初始化时序问题:
useEffect(() => { const timer = setTimeout(() => { const unsubscribe = messaging().onMessage(async remoteMessage => { Alert.alert('A new FCM message arrived!', JSON.stringify(remoteMessage)); }); return unsubscribe; }, 500); return () => clearTimeout(timer); }, []);
附加校验点
- 确认iOS端的
AppDelegate.m/AppDelegate.swift里已经正确添加了Firebase Messaging的APNs回调配置,没有漏加didReceiveRemoteNotification相关的代理方法 - 确认Xcode项目的Signing & Capabilities里已经正确开启Push Notifications和Background Modes(勾选Remote notifications)
内容的提问来源于stack exchange,提问作者user8112970
相关产品推荐
相关产品推荐

