2016-04-20 16 views
10

JavaScriptのハンドラにサイレントなiOSプッシュ通知を送信しようとしているReactネイティブアプリがあります。アプリがバックグラウンドにあるときにネイティブで反応するサイレントiOSプッシュ通知

私が見ている動作は、のAppDelegateの機能が呼び出されますが、アプリケーションがフォアグラウンドにあるか、最近閉じられていない限り、JavaScriptのハンドラは呼び出されません。

私が混乱していることは、明らかにアプリケーションが目覚めて、それがdidReceiveRemoteNotification関数を呼び出すことですが、[RCTPushNotificationManager didReceiveRemoteNotification:notification]への呼び出しは何もしていないようです。

また、通知を受け取った後にアプリを開くと、その時点でReact Nativeハンドラが呼び出されているのが見えます。

マイdidReceiveRemoteNotification関数は次のようになります。

componentDidMount() { 
    AppState.addEventListener('change', this.handleAppStateChange); 

    PushNotificationIOS.addEventListener('notification', (notification) => { 
     console.log("notification recieved"); 
    }) 
} 
handleAppStateChange(currentAppState) { 
    console.log(currentAppState); 
} 

私は次のようにAWS SNSを利用してプッシュ通知を送信しています:私の私はこれを持っているネイティブアプリに反応のルートコンポーネント

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)notification 
{ 
    NSLog(@"didReceiveRemoteNotification"); 

    [RCTPushNotificationManager didReceiveRemoteNotification:notification]; 
} 

メッセージ:

{ 
"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ネイティブコードへの呼び出しがアプリが実行されていなくても確実に行うためにできることはありますか?

答えて

5

アプリがバックグラウンドでヒットするようにするには、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); 

} 
+0

偉大な、それはそれを解決したようだ! – DownChapel

関連する問題