静音 iOS 当应用程序在后台时使用 React Native 推送通知
Silent iOS Push Notification with React Native when app is in background
我有一个 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:46 收到的那个在 JavaScript 没有调用处理程序,直到我在 10:49 打开应用程序。
我能做些什么来确保即使应用程序不是 运行 也会调用我的 React Native 代码?
为了让通知在后台到达您的应用程序,您还需要定义一个 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);
}
我有一个 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:46 收到的那个在 JavaScript 没有调用处理程序,直到我在 10:49 打开应用程序。
我能做些什么来确保即使应用程序不是 运行 也会调用我的 React Native 代码?
为了让通知在后台到达您的应用程序,您还需要定义一个 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);
}