如何使用 react-native 的 PushNotificationIOS.getInitialNotification

Posted

技术标签:

【中文标题】如何使用 react-native 的 PushNotificationIOS.getInitialNotification【英文标题】:how to work with react-native's PushNotificationIOS.getInitialNotification 【发布时间】:2016-07-28 19:29:07 【问题描述】:

我正在尝试检测我的 react-native 应用程序是否是由用户点击推送通知横幅启动的(有关该主题,请参阅 this excellent SO answer)。

我已经实现了 Mark 描述的模式,并且发现PushNotificationios.getInitialNotification 提供的“通知”对象确实很奇怪,至少在没有通知可检索的情况下是这样。检测这个案例一直是PITA,我其实很困惑。

据我所知,PushNotificationIOS.getInitialNotification 返回了一个承诺;当没有通知等待用户时,这个承诺应该通过null 或实际的通知对象——null 来解决。这是我试图检测和支持的场景。

这就是为什么检测起来如此痛苦的原因;以下测试都是在没有发现通知时运行的:

// tell me about the object
JSON.stringify(notification);
//=> 

// what keys does it have?
Object.keys(notification);
//=> [ '_data', '_badgeCount', '_sound', '_alert' ]

所以它字符串化为空,但它有四个键?克...

// tell me about the data, then
JSON.stringify(notification._data);
//=> undefined
// wtf?

这些奇怪的事实使我的理解和区分实际通知需要响应的情况与邮箱为空的情况的能力都令人沮丧。基于这些事实,我假设我可以测试我想要的成员,但即使是最仔细的探测也会在 100% 的情况下产生误报:

PushNotificationIOS.getInitialNotification()
.then((notification) => 

    // usually there is no notification; don't act in those scenarios
    if(!notification || notification === null || !notification.hasOwnProperty('_data')) 
        return;
    

    // is a real notification; grab the data and act.

    let payload = notification._data.appName; // TODO: use correct accessor method, probably note.data() -- which doesn't exist
    Store.dispatch(Actions.receivePushNotification(payload, true /* true = app was awaked by note */))
);

每次我运行此代码时,它都无法触发逃生舱并抛出let payload,因为undefined is not an object (evaluating 'notification._data.appName')

有人能解释一下这里发生了什么吗? PushNotificationIOS.getInitialNotification 是否已损坏或已弃用?在 JS 中如何可能有一个评估为未定义的键?如何检测这种情况?

经验丰富的javascripter,在这里很困惑。感谢您的帮助。

顺便说一句:使用 react-native v0.29.0

【问题讨论】:

【参考方案1】:

notification 是 an instance of PushNotification,不是普通对象,这就是为什么它字符串化为空对象,因为没有为它实现自定义 toString。

在没有通知可用时创建对象,这听起来像是一个错误(如果尚未报告,则应报告)。

无论如何,要解决此问题,您的检查实际上应该是:

if(!notification || !notification.getData()) 
        return;

更新:问题已在 0.31 中修复 - 请参阅 Github issue 了解更多详情。

【讨论】:

感谢您的解释!我很好奇你怎么知道PushNotification 没有toString

以上是关于如何使用 react-native 的 PushNotificationIOS.getInitialNotification的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 react-native 设计字段集图例

如何在 react-native 中使用 FormData?

如何使用 react-native 的 TextInput 的 `selectionState` 属性?

如何使用 expo 实现带有 react-native 的条带? [关闭]

React-Native:如何在真实的 iOS 设备上使用“Remote JS Debugger”?

如何缩小 React-Native 地图