5

Ich bin erfolgreich Apple APNS Feedback-Daten über PHP abrufen. Die Struktur, die ich erhalte (nach einiger Verarbeitung) sieht in etwa wie folgt aus:HOWTO Geräte Token von Apple APNS erhalten Feedback

Zeitstempel

Gerät Token

Meine Frage ist, wie die der Geräte-Tokens zu wissen, sollte ich von meiner Datenbank zu entfernen und stoppen Senden von Benachrichtigungen an sie.

Regardz,

Mladjo

Antwort

10

Alle durch Feedback gegeben Geräte sind 'nicht bestanden' und sollte entfernt werden. Keine Rückmeldung bedeutet, dass keine Geräte entfernt werden sollten. Es ist auf der Apple-Dokumentation abgedeckt:

Apple APN Documentation

+1

APNS-Feedback gibt Geräte-Tokens zurück, wenn die Zustellung der Benachrichtigung fehlgeschlagen ist. Dies bedeutet nicht, dass die Anwendung von dem Gerät deinstalliert wurde, es kann einfach sein, dass der Benutzer momentan keine persistente WLAN-Verbindung hat. – Mladen

+1

Das ist nicht, was die Dokumentation sagt. "Wenn ein Provider versucht, eine Push-Benachrichtigung an eine Anwendung zu senden, die Anwendung jedoch nicht mehr auf dem Gerät vorhanden ist, meldet das Gerät dies dem Apple Push Notification Service. Diese Situation tritt häufig auf, wenn der Benutzer die Anwendung deinstalliert hat Ein Gerät meldet fehlgeschlagene Zustellversuche für eine Anwendung. APNs benötigt eine Möglichkeit, den Anbieter zu informieren, sodass er keine Benachrichtigungen an dieses Gerät senden kann. " – Lee

+5

@Mladen. Falsch. Wenn das Gerät keine WLAN- oder 3/4G-Verbindung hat, sendet Apple die Push-Benachrichtigung später, wenn es eine Verbindung hat. – midspace

-1

Sie sollten speichern Geräte mit ihrem Gerät Token-Daten, und dann können Sie diese Geräte entsprechend ihrer Geräte-Tokens finden. Sie könnten Geräte-Token zur Identifizierung jedes Geräts verwenden. Dann wäre es einfach zu finden und ihre Status in Ihre Datenbank zu ändern.

11

Der Zeitstempel ist hier das entscheidende Element. Der von Apple gesendete Zeitstempel gibt an, wann der Push-Dienst zum letzten Mal versucht hat, eine Nachricht an das Gerät zu senden, und dass die App deinstalliert wurde. Wenn sich das Gerät seither wieder bei Ihrem Dienst registriert hat, müssen Sie es nicht löschen.

Daher sollten Sie jedes Mal, wenn Ihre App das Token lädt und an Ihren Dienst sendet, die Zeit in Ihrem Datenspeicher protokollieren. Wenn Sie Feedback geben, sollten Sie die Uhrzeit von Apple überprüfen und sie mit der Zeit vergleichen, zu der Sie zuletzt ein Update von der App auf dem Gerät erhalten haben. Wenn die Zeit, die Apple sendet, neuer ist als die Zeit, zu der Sie eine Aktualisierung erhalten haben, sollten Sie das Gerät löschen (oder deaktivieren). Wenn die Zeit von Apple früher ist, müssen Sie sie nicht löschen, da der Benutzer das Gerät seit der letzten Zustellung von Apple neu installiert hat.

0

saubere Erklärung @argon, aber ich habe eine andere Frage über den Zeitstempel.

Jedes Mal, wenn eine App Push-Benachrichtigungen aktiviert, wird das Geräte-Token an den Server gesendet. Sollte ich den Zeitstempel von meinem Server nehmen, um zusammen mit Geräte-Token beibehalten zu werden, hat dedRegisterForRemoteNotificationsWithDeviceToken nur deviceToken und nicht die Zeit angegeben. Wenn mein Server in einer anderen Zeitzone läuft und der APNS in einer anderen Zeitzone läuft, kann die gespeicherte Registrierungszeit (zusammen mit dem Geräte-Token) nicht mit dem von der APNS-Rückmeldung empfangenen Zeitstempel verglichen werden, um die Reihenfolge von Register -> Deinstallieren -> Registrierung zu überprüfen.

Ich nehme an, der APNS-Feedback-Zeitstempel ist in UTC und der Zeitstempel, den der Server zusammen mit dem Geräte-Token speichert, muss vor dem Speichern des ISO-Zeitstempels in UTC konvertiert werden. Auf diese Weise ist der Zeitstempel in der gleichen Zeitzone und die Diff-Prüfung wird konsistent sein.

bitte klären

+0

Das ist richtig, es ist ein UTC Timestamp, also sollten Sie UTC-Werte in Ihrem Geschäft speichern. Referenz: [Letzte Tabelle unter "Feedback Service"] (https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/CommunicatingWIthAPS.html#//apple_ref/doc/uid/ TP40008194-CH101-SW3) – argon

0

@fyasar,

So ist Ihre Empfehlung das Gerät Token gegen Geräte-ID zu speichern (oder eine Taste). Wenn eine Rückmeldung für ein Geräte-Token empfangen wird, entfernen Sie diese Geräte-Token-Zeile aus der DB, richtig? Wenn das richtig verstanden wurde, würde das in einem Szenario nicht funktionieren, in dem ein Benutzer eine App installiert, deinstalliert und dann alles in kurzer Zeit neu installiert und der Feedback-Dienst erst nach all dem abgefragt wird.Wenn in diesem Fall der Zeitstempel in der Rückmeldung nicht berücksichtigt wird, wird das Geräte-Token entfernt, was inkorrekt ist, da der Benutzer die App erneut installiert und sich erneut für die Push-Benachrichtigung registriert hat.

Meine Frage ist dies, wie in Apple Doc und vielen Blogs vorgeschlagen, bei der Registrierung, wenn Gerät Token beibehalten wird, muss Zeitstempel mit ihm beharrt werden. Die ISO-Zeit der Zeitzone sollte beibehalten werden oder die Zeitzone, in der der Feedback-Dienst den Zeitstempel zurückgibt.

0

Ein Zeitstempel (als ein Vier-Byte-Wert Time_t) anzeigt, wenn APNs bestimmt, dass die Anwendung nicht mehr existiert, auf dem Gerät. Dieser Wert, , der sich in der Netzwerkreihenfolge befindet, repräsentiert die Sekunden seit 00:00 Uhr Mitternacht am 1. Januar 1970 UTC.

Sie es mit Ihrem Tisch des letzten Einsatzzeit vergleichen und dann die ungültigen Token von db entfernen, die ich in meinem Fall bin mit MySQL und PHP für Sever Seite

$sql="SELECT insert_time from device_tokens ORDER BY insert_time DESC LIMIT 1"; 

es Zeit, letzte Aktualisierung wird zurückkehren von db und dann wandle ich es nur in Unix-Zeitstempel von

$sql1="SELECT UNIX_TIMESTAMP(' $timestamp')"; 

mit und schließlich i vergleichen sie es nur mit APNs Feedback Zeitstempeln wie diese

if($inactive_Timestamp>$dbTime_stamp) 
    { 
foreach ($apnsfeedback_tokens as $key => $value) { 
    # code... 

    $inactive_Token=$value['devtoken']; 

$sql= "DELETE FROM device_tokens WHERE device_token='$inactive_Token'"; 


if ($conn->query($sql) === TRUE) { 
    echo "Record deleted successfully"; 
} else { 
    echo "Error deleting record: " . $conn->error; 
} 
Verwandte Themen