2016-07-28 10 views
2

Ich versuche zu erkennen, ob meine reagierende native App durch den Benutzer gestartet wurde, der auf ein Push-Notification-Banner klopft (siehe this excellent SO answer zum Thema).Wie man mit react-native funktioniert PushNotificationIOS.getInitialNotification

Ich habe das Muster Mark beschrieben implementiert, und festgestellt, dass die "Benachrichtigung" -Objekte, die von PushNotificationIOS.getInitialNotification zur Verfügung gestellt werden, wirklich bizarr sind, zumindest in Fällen, wenn es keine Benachrichtigung zum Abrufen gibt. Das Erkennen dieses Falles war ein PITA, und ich bin eigentlich ziemlich verwirrt.

Von dem, was ich sagen kann, gibt PushNotificationIOS.getInitialNotification ein Versprechen zurück; Dieses Versprechen soll entweder mit null oder einem tatsächlichen Benachrichtigungsobjekt - null - gelöst werden, wenn keine Benachrichtigung auf den Benutzer wartet. Dies ist das Szenario, das ich versuche zu erkennen und zu unterstützen.

Hier ist warum so ein Schmerz zu erkennen ist; Die folgenden Tests wurden alle ausgeführt, wenn keine Benachrichtigung zu finden ist:

// tell me about the object 
JSON.stringify(notification); 
//=> {} 

// what keys does it have? 
Object.keys(notification); 
//=> [ '_data', '_badgeCount', '_sound', '_alert' ] 

So stringt es leer, aber es hat vier Schlüssel? K ...

// tell me about the data, then 
JSON.stringify(notification._data); 
//=> undefined 
// wtf? 

Diese bizarren Fakten vereiteln sowohl mein Verständnis und meine Fähigkeit, zwischen den Fällen zu unterscheiden, wo gibt es eine aktuelle Meldung zu vs. Fällen, in denen das Postfach leer zu reagieren. Basierend auf diesen Fakten, nahm ich mich für die Mitglieder testen konnte ich will, aber auch die sorgfältigste Sondierung produziert Fehlalarme 100% der Zeit:

PushNotificationIOS.getInitialNotification() 
.then((notification) => { 

    // usually there is no notification; don't act in those scenarios 
    if(!notification || notification === null || !notification.hasOwnProperty('_data')) { 
     return; 
    } 

    // is a real notification; grab the data and act. 

    let payload = notification._data.appName; // TODO: use correct accessor method, probably note.data() -- which doesn't exist 
    Store.dispatch(Actions.receivePushNotification(payload, true /* true = app was awaked by note */)) 
}); 

Jedes Mal, wenn ich diesen Code ausführen, schlägt es das auslösen Escape Luke und wirft auf let payload, weil undefined is not an object (evaluating 'notification._data.appName').

Kann jemand erklären, was hier vor sich geht? Ist PushNotificationIOS.getInitialNotification kaputt oder veraltet? Wie in JS ist es möglich, einen Schlüssel zu haben, der zu undefiniert auswertet? Wie kann ich dieses Szenario erkennen?

Erfahrener Javascripter, ziemlich verwirrt hier. Danke für jede Hilfe.

BTW: using reagieren-native v0.29.0

Antwort

2

Die notification ist an instance ofPushNotification, nicht ein einfaches Objekt, das ist, warum es in ein leeres Objekt stringifies da keine benutzerdefinierten toString wurde es umgesetzt.

Es klingt wie ein Fehler für mich (der gemeldet werden sollte, wenn nicht bereits), dass das Objekt erstellt wird, wenn keine Benachrichtigung verfügbar ist.

Wie dem auch sei, dieses Problem zu umgehen, sollte Ihr Scheck tatsächlich:

if(!notification || !notification.getData()) { 
     return; 
} 

aktualisieren: Ausgabe in 0.31 behoben wurde - siehe Github issue für weitere Details.

+0

Danke für die Erklärung! Ich bin gespannt, wie Sie wissen, dass es für 'PushNotification' keinen' toString' gibt. – Tom

Verwandte Themen