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

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

据我所知,PushNotificationIOS.getInitialNotification 返回一个 promise ;当没有通知等待用户时,这个 promise 应该用 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

最佳答案

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

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

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

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

更新 :问题已在 0.31 中修复 - 有关更多详细信息,请参阅 Github issue

关于javascript - 如何使用 react-native 的 PushNotificationIOS.getInitialNotification,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38645181/

10-12 02:32