当应用程序在后台时,使用 React Native 的静默 iOS 推送通知
Posted
技术标签:
【中文标题】当应用程序在后台时,使用 React Native 的静默 iOS 推送通知【英文标题】:Silent iOS Push Notification with React Native when app is in background 【发布时间】:2016-04-20 09:55:24 【问题描述】:我有一个 React Native 应用程序,我试图将静默 ios 推送通知发送到 javascript 中的处理程序。
我看到的行为是 AppDelegate
中的 didReceiveRemoteNotification
函数被调用,但我在 JavaScript 中的处理程序不会被调用,除非应用程序在前台或最近才关闭。
我感到困惑的是,应用程序显然被唤醒并调用了 didReceiveRemoteNotification
函数,但随后对 [RCTPushNotificationManager didReceiveRemoteNotification:notification]
的调用似乎没有做任何事情。
另外,如果我在收到通知后打开应用程序,我会看到 React Native 处理程序在此时被调用。
我的didReceiveRemoteNotification
函数如下所示:
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)notification
NSLog(@"didReceiveRemoteNotification");
[RCTPushNotificationManager didReceiveRemoteNotification:notification];
在我的 React Native 应用程序的根组件中,我有这个:
componentDidMount()
AppState.addEventListener('change', this.handleAppStateChange);
PushNotificationIOS.addEventListener('notification', (notification) =>
console.log("notification recieved");
)
handleAppStateChange(currentAppState)
console.log(currentAppState);
我正在使用 AWS SNS 发送带有以下消息的推送通知:
"APNS_SANDBOX":"\"aps\":\"content-available\":\"1\""
这是来自 XCode 的日志:
2016-04-20 10:38:01.255 [info][tid:com.facebook.React.JavaScript] inactive
2016-04-20 10:38:01.986 [info][tid:com.facebook.React.JavaScript] background
2016-04-20 10:38:17.279 test[4056:1383261] didReceiveRemoteNotification
2016-04-20 10:38:17.284 [info][tid:com.facebook.React.JavaScript] notification recieved
2016-04-20 10:44:56.330 test[4056:1383261] didReceiveRemoteNotification
2016-04-20 10:44:56.332 [info][tid:com.facebook.React.JavaScript] notification recieved
2016-04-20 10:46:07.091 test[4056:1383261] didReceiveRemoteNotification
2016-04-20 10:49:30.039 [info][tid:com.facebook.React.JavaScript] notification recieved
2016-04-20 10:49:30.639 [info][tid:com.facebook.React.JavaScript] active
在此日志中,发送了 3 个推送通知。 10:38 和 10:44 收到的都正确调用了 JavaScript。 但是,直到我在 10:49 打开应用程序之前,在 10:46 收到的那个并没有调用 JavaScript 中的处理程序。
我能做些什么来确保即使在应用未运行的情况下也能调用我的 React Native 代码?
【问题讨论】:
【参考方案1】:为了让通知在后台发送到您的应用程序,您还需要定义一个 fetchCompletionHandler,其完成处理函数如下所示。 aps:content-available:1
有效负载应该唤醒您的应用程序并在您的 AppDelegate 中触发此代码,然后在 RN 中访问您的 JavaScript。
// fetch notifications in the background and foreground
-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)notification
fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
[RCTPushNotificationManager didReceiveRemoteNotification:notification];
completionHandler(UIBackgroundFetchResultNewData);
NSLog(@"Notification Body %@", notification);
【讨论】:
我正在开发相同的功能,当我的应用程序被终止/不活动时,下次打开应用程序时不会收到静默通知。我做错了吗?或者这就是静默通知的工作方式,如果应用程序处于非活动状态则不会收到它? @BrienCrean 这确实应该在 react-native 文档中 知道如何区分通知是在前台还是后台收到的吗?以上是关于当应用程序在后台时,使用 React Native 的静默 iOS 推送通知的主要内容,如果未能解决你的问题,请参考以下文章
当应用程序未使用或处于后台模式时,React Native 是不是有函数生命周期正在运行?
当通知到达并且应用程序在后台没有用户交互时,如何在 React Native 中执行操作?