【问题标题】:Silent iOS Push Notification with React Native when app is in background当应用程序在后台时,使用 React Native 的静默 iOS 推送通知
【发布时间】: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 代码?

【问题讨论】:

    标签: ios push-notification 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 文档中
    • 知道如何区分通知是在前台还是后台收到的吗?
    猜你喜欢
    • 1970-01-01
    • 2018-01-23
    • 2015-12-08
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-16
    相关资源
    最近更新 更多