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
Danke für die Erklärung! Ich bin gespannt, wie Sie wissen, dass es für 'PushNotification' keinen' toString' gibt. – Tom