Silent iOS Push Notification с React Native, когда приложение находится в фоновом режиме

У меня есть приложение React Native, где я пытаюсь получить тихое уведомление iOS push, отправленное обработчику в JavaScript.

Поведение, которое я вижу, это то, что функция didReceiveRemoteNotification в AppDelegate вызывается, но мой обработчик в 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);
}

Я отправляю push-уведомление с использованием 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 push-уведомления отправляются. Полученные в 10:38 и 10:44 оба правильно назвали JavaScript. Тем не менее, тот, который был получен в 10:46, не вызывал обработчика в JavaScript, пока я не открыл приложение в 10:49.

Есть ли что-нибудь, что я могу сделать, чтобы убедиться, что вызов моего собственного кода React встречается даже при не запущенном приложении?

Ответ 1

Чтобы уведомления попадали в ваше приложение в фоновом режиме, вам также нужно определить fetchCompletionHandler с функцией обработчика завершения, как показано ниже. Полезная нагрузка aps:{content-available:1} должна пробудить ваше приложение и запустить этот код в AppDelegate и, в свою очередь, поразить ваш JavaScript в RN.

// 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);

}