当app在后台时,使用React Native进行无提示iOS推送通知

时间:2016-04-20 09:55:25

标签: ios push-notification react-native

我有一个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代码吗?

1 个答案:

答案 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);

}