React Native 0.44 PushNotifcationIOS.scheduleLocalNotification处理模拟器中的JavaScript Date对象,而不是设备

时间:2017-09-07 20:15:18

标签: javascript date react-native push-notification apple-push-notifications

react-native:0.44.3

目标平台:iOS

开发操作系统:macOS Sierra 10.12.4

构建工具:XCode

这种行为会导致一个非常令人困惑的错误,即计划通知在模拟器上按预期工作,但在设备上以非常神秘的方式失败。

要重现:

将来安排本地通知一分钟:

PushNotificationIOS.scheduleLocalNotification({ 
  fireDate: new Date(Date.now() + 60 * 1000), 
  alertBody: 'message'
});

在模拟器中运行此构建(默认情况下,这是一个Debug构建,除非你搞乱设置,我相信)

观察您的通知按预期进行安排。

通过XCode在您的设备上运行此构建作为Debug构建(编辑您的方案,以便Run使用Debug而不是Release)

在您尝试安排通知时观察崩溃

在您的设备上将其作为发布版本运行。

观察通知立即触发(请注意,如果为预定通知指定了空日期或已经过的日期,则这是预期的iOS行为。)

请注意,为了观察立即触发的通知,您必须设置一个侦听器来处理它并提供反馈。如果其关联的应用程序位于前台(AppState:'active'),则iOS上似乎不会显示本地通知。

1 个答案:

答案 0 :(得分:2)

为了解决这个问题,请将Date对象转换为Unix时间。此示例将fireDate设置为将来一分钟:

let fireDate = new Date(Date.now() + 60 * 1000).getTime();

日期对象无法通过RCT桥传递,必须转换为字符串或数字。

但是,请注意,在Date对象上调用toString()也不起作用。建议的解决方案是使用getTime()来获取Unix时间戳。