Heim > Artikel > Backend-Entwicklung > Kann bei Push-Nachrichten zwischen der Deaktivierung von Benachrichtigungen und der Deinstallation unterschieden werden?
Für den Nachrichten-Push verwendet iOS APNS und Android GCM. Wenn der Push fehlschlägt, wird ein ungültiges Token zurückgegeben. Können wir jedoch unterscheiden, welche ungültigen Token Benachrichtigungen sind und welche durch die Deinstallation der App verursacht werden?
1 APNS PHP Push-Return-Fehlerbehandlung
Push.php
if (!empty($aMessage['ERRORS'])) { foreach($aMessage['ERRORS'] as $aError) { if ($aError['statusCode'] == 0) { $this->_log("INFO: Message ID {$k} {$sCustomIdentifier} has no error ({$aError['statusCode']}), removing from queue..."); $this->_removeMessageFromQueue($k); continue 2; } else if ($aError['statusCode'] > 1 && $aError['statusCode'] <= 8) { $this->_log("WARNING: Message ID {$k} {$sCustomIdentifier} has an unrecoverable error ({$aError['statusCode']}), removing from queue without retrying..."); $this->_removeMessageFromQueue($k, true); continue 2; } } if (($nErrors = count($aMessage['ERRORS'])) >= $this->_nSendRetryTimes) { $this->_log( "WARNING: Message ID {$k} {$sCustomIdentifier} has {$nErrors} errors, removing from queue..." ); $this->_removeMessageFromQueue($k, true); continue; } }
Durch Deaktivieren von Benachrichtigungen meldet APNS keinen Fehler und betrachtet dieses Token nicht als ungültiges oder falsches Token .
Die Deinstallation der App führt zu folgender Beurteilung: StatusCode ist gleich 8
if ($aError['statusCode'] > 1 && $aError['statusCode'] <= 8) { $this->_log("WARNING: Message ID {$k} {$sCustomIdentifier} has an unrecoverable error ({$aError['statusCode']}), removing from queue without retrying..."); $this->_removeMessageFromQueue($k, true); continue 2; }
Daher sollten APNS in der Lage sein, durch die Deinstallation verursachte Push-Fehler zu unterscheiden, aber Deaktivierungsbenachrichtigungen reagieren nicht
2 Analyse des GCM-Fehlerbeurteilungscodes:
Response.class.php
/** * Returns an array containing invalid registration ids * They must be removed from DB because the application was uninstalled from the device. * * @return array */ public function getInvalidRegistrationIds() { if ($this->getFailureCount() == 0) { return array(); } $filteredResults = array_filter($this->results, function($result) { return (isset($result['error']) && (($result['error'] == "NotRegistered") || ($result['error'] == "InvalidRegistration"))); }); return array_keys($filteredResults); } /** * Returns an array of registration ids for which you must resend a message (?), * cause devices aren't available now. * * @TODO: check if it be auto sended later * * @return array */ public function getUnavailableRegistrationIds() { if ($this->getFailureCount() == 0) { return array(); } $filteredResults = array_filter($this->results, function($result) { return ( isset($result['error']) && ($result['error'] == "Unavailable") ); }); return array_keys($filteredResults); }
Wenn Benachrichtigungen verboten sind, schreiben die beiden oben genannten Methoden das Fehlertoken nicht, was bedeutet, dass Benachrichtigungen und Token sind verboten, ist ebenfalls gültig und gibt keinen Fehler zurück.
Wenn die App deinstalliert wird, wird getInvalidRegistrationIds ausgeführt und $result['error']==NotRegistered
Wenn GCM auf diese Weise NotRegistered zurückgibt, bedeutet dies, dass es sich um eine von generierte Fehlermeldung handelt Deinstallation und Benachrichtigungen sind verboten und GCM stellt sie als normale Token aus.
Der obige Test zeigt, dass apns und gcm Sperrbenachrichtigungen als normale Token behandeln, während die Deinstallation der App sie als ungültige Token behandelt. (Wenn Sie deinstallieren und neu installieren, wird ein neues Token generiert)