2016-04-20 19 views
10

Mam aplikację React Native, w której próbuję uzyskać ciche powiadomienie push iOS wysłane do programu obsługi w języku JavaScript.Ciche powiadomienie push w systemie iOS z React Native, gdy aplikacja jest w tle

Zachowanie, które widzę, polega na tym, że wywoływana jest funkcja didReceiveRemoteNotification w nazwie, ale mój program obsługi JavaScript nie zostaje wywołany, chyba że aplikacja znajduje się na pierwszym planie lub została niedawno zamknięta.

Chodzi mi o to, że jestem zdezorientowany, jest to oczywiście, że aplikacja jest budzona i ma funkcję didReceiveRemoteNotification, ale wtedy połączenie z [RCTPushNotificationManager didReceiveRemoteNotification:notification] nie wydaje się nic.

Ponadto, jeśli otworzę aplikację po otrzymaniu powiadomienia, widzę w tym miejscu wywołanie funkcji React Native.

Moja didReceiveRemoteNotification funkcja wygląda tak:

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

    [RCTPushNotificationManager didReceiveRemoteNotification:notification]; 
} 

W składnik główny Moje React Native app mam to:

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

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

przesyłam powiadomienia push przy użyciu AWS SNS z następujących wiadomość:

{ 
"APNS_SANDBOX":"{\"aps\":{\"content-available\":\"1\"}}" 
} 

Oto dziennik z 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 

W tym dzienniku są wysyłane 3 powiadomienia push, które zostały wysłane. Te, które otrzymałem o 10:38 i 10:44, obydwa nazywają się poprawnie. Jednak ten, który został odebrany o 10:46, nie wywołał obsługi w JavaScript, dopóki nie otworzyłem aplikacji o 10:49.

Czy jest coś, co mogę zrobić, aby zapewnić, że połączenie z moim React Native Code będzie miało miejsce, nawet jeśli aplikacja nie działa?

Odpowiedz

5

Aby powiadomienia trafiały w aplikację w tle, należy również zdefiniować polecenie pobierania, z funkcją zakończenia procesu, jak poniżej. Ładunek aps:{content-available:1} powinien obudzić twoją aplikację i wywołać ten kod w AppDelegate, i z kolei uderzył twój JavaScript w 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); 

} 
+0

Świetnie, wydaje się, że udało się to rozwiązać! – DownChapel

Powiązane problemy