React Native 59下PushNotificationIOS.getInitialNotification()死亡态返回null问题排查
我之前在RN 59版本开发时也碰到过一模一样的问题,结合当时的排查经验和官方文档细节,整理了几个最可能的原因,你可以逐一验证:
APNs原生配置未正确完成
死亡态下获取初始通知完全依赖原生端的APNs配置和数据传递。如果Xcode里的推送能力没开、证书配置错误,或者AppDelegate里的处理逻辑缺失,JS层根本拿不到通知数据。
检查点:- 确认Xcode项目已开启
Push Notifications能力,entitlements文件中的APS Environment和当前环境(开发/生产)匹配; - 检查
AppDelegate.m的didFinishLaunchingWithOptions方法里,是否调用了[RCTPushNotificationManager didFinishLaunchingWithOptions:launchOptions];,这一步是把启动时的通知数据传递给RN的PushNotificationIOS模块。
- 确认Xcode项目已开启
推送Payload格式不符合要求
APNs的Payload必须包含特定字段,才能被RN 59的PushNotificationIOS正确识别并传递。如果Payload结构不对,哪怕推送成功了,JS层也解析不到数据。
检查点:- 确保Payload包含
alert字段(可以是字符串或字典格式),如果是需要用户点击的推送,这个字段是必须的; - 自定义数据建议放在
custom这样的独立字段下,不要和APNs的标准字段混在一起,避免被过滤; - 静默推送(带
content-available:1)在死亡态下不会触发getInitialNotification,只有用户主动点击的推送才会触发。
- 确保Payload包含
getInitialNotification调用时机太晚
在RN 59中,初始通知的缓存是在App启动初期就生成的,如果你的调用时机太晚(比如放在某个异步请求之后、或者页面跳转完成后),可能已经错过了获取缓存的时机,导致返回null。
解决建议:在App启动后尽早调用这个方法,比如在index.js的入口处、或者Root组件的componentDidMount生命周期里立即执行,不要延迟调用。RN 59版本PushNotificationIOS的已知bug
RN 59属于比较老旧的版本,PushNotificationIOS模块存在一些未修复的bug,比如当推送带有mutable-content字段触发Service Extension时,可能会导致初始通知数据无法传递到JS层。
解决方向:- 尝试升级到RN 59的最新小版本(比如59.10),部分bug在后续小版本里有修复;
- 如果暂时无法升级,可以在原生端
AppDelegate的didFinishLaunchingWithOptions里手动提取launchOptions中的通知数据,通过自定义NativeModule传递给JS层。
用户打开App的方式不对
划重点:getInitialNotification()只有在用户点击推送通知打开死亡态的App时才会返回对应的通知对象。如果用户是直接点击App图标启动,不管之前有没有收到推送,这个方法都会返回null。测试的时候一定要注意打开方式!
内容的提问来源于stack exchange,提问作者Mohammad

