我有一个React Native应用程序,我试图在JavaScript中将一个静默的iOS推送通知发送给处理程序。
我看到的行为是调用了didReceiveRemoteNotification
中的AppDelegate
函数,但是除非应用程序位于前台或最近才关闭,否则我的JavaScript处理程序不会被调用。 / p>
我很困惑的事情显然是应用程序被唤醒并且调用了didReceiveRemoteNotification
函数,但是对[RCTPushNotificationManager didReceiveRemoteNotification:notification]
的调用似乎没有做任何事情。
此外,如果我在收到通知后打开应用程序,那么我会看到此时调用了React Native处理程序。
我的didReceiveRemoteNotification
函数如下所示:
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)notification
{
NSLog(@"didReceiveRemoteNotification");
[RCTPushNotificationManager didReceiveRemoteNotification:notification];
}
在我的React Native应用程序的Root组件中,我有:
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打开应用程序。
我能做些什么来确保即使app没有运行也会调用我的React Native代码吗?
答案 0 :(得分:6)
为了让通知在后台点击您的应用,您还需要定义一个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);
}