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

Posted

技术标签:

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

【问题讨论】:

【参考方案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 文档中 知道如何区分通知是在前台还是后台收到的吗?

以上是关于当应用程序在后台时,使用 React Native 的静默 iOS 推送通知的主要内容,如果未能解决你的问题,请参考以下文章

当应用程序在后台时,React Native JS 不执行

当应用程序未使用或处于后台模式时,React Native 是不是有函数生命周期正在运行?

当通知到达并且应用程序在后台没有用户交互时,如何在 React Native 中执行操作?

从后台打开 React Native 深层链接应用程序

使用 React native 从后台激活应用程序时如何显示 PIN 码屏幕?

是否有使用 react native expo 执行后台任务的技巧?