React Native下的iOS静默推送通知,当应用程序在后台运行时。

13

我有一个 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接收到的通知直到我在10:49打开应用程序之前才调用JavaScript处理程序。

有什么方法可以确保即使应用程序未运行,也能调用我的React Native代码吗?

1个回答

7

为了让后台通知能够到达应用程序,您还需要定义一个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 - Shahzaib Qureshi
这个应该真的写在React Native的文档里。 - JackDev
有什么想法可以区分通知是在前台还是后台接收的吗? - JackDev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接