wake-up-neo.net

Welches sind die möglichen Gründe für APNs-Antworten wie BadDeviceToken oder Unregistriert?

Beim Senden von Benachrichtigungen an iOS-Benutzer erhalte ich bei einigen Benutzern den Antwortstatuscode 400 (BadDeviceToken) oder den Code 410 (nicht registriert).

Aus der Apple-Dokumentation zu "BadDeviceToken":

Das angegebene Gerätetoken war fehlerhaft. Stellen Sie sicher, dass die Anforderung ein gültiges Token enthält und dass das Token der Umgebung entspricht.

Was bedeutet "schlecht"? Ich weiß sicher, dass das Gerätetoken zu einem früheren Zeitpunkt gültig war. Was tut ein Benutzer, um sein Geräte-Token schlecht zu machen? 

Aus der Dokumentation zu "Nicht registriert":

Das Gerätetoken ist für das angegebene Thema inaktiv.

Bedeutet dies zwangsläufig, dass die App gelöscht wurde? Oder es kann andere Gründe für diese Antwort geben. 

8
Shai Givati

Wie Sie aus Tabelle 8-6 in der APNS-Dokumentation zitiert haben, gibt es zwei mögliche Ursachen für den Fehler:

  1. Das Geräte-Token ist ungültig
  2. Dass das Geräte-Token nicht zur Umgebung passt

Wenn dies der erste Fall ist, stellen Sie sicher, dass die iOS-App das Gerät für Remotebenachrichtigungen registriert bei jedem Start der App, da es viele Gründe gibt, warum sich das Geräte-Token bei jedem Start ändert (siehe Beschreibung) in Konfigurieren der Remote-Benachrichtigungsunterstützung .

Wenn es der zweite Fall ist, müssen Sie sicherstellen, dass:

  • Das Backend verwendet Entwicklung Konfigurationen, wenn Ihr App-Build mit Entwicklung APNS-Berechtigungen signiert wurde, und
  • Das Backend verwendet production Konfigurationen, wenn Ihr App-Build mit production APNS-Berechtigungen signiert wurde.

Glücklicherweise müssen Sie als iOS-Entwickler die APNS-Berechtigungen nicht direkt selbst ändern. Es befindet sich immer in der Entwicklung und wird von Xcode nur dann automatisch in die Produktion geändert, wenn Sie den Build und Export für den App Store oder die Unternehmensdistribution generieren. Für das Backend sollte Ihr Backend-Entwickler wissen, wie das Backend für Entwicklungs- und Produktionsumgebungen konfiguriert wird. Bei einigen Frameworks muss ein boolescher Wert namens isProduction umgeschaltet werden. Letztendlich laut Kommunikation mit APNs unter dem Abschnitt APNs Connections, Push-Benachrichtigungen werden an verschiedene APNS-Endpunkte gesendet, je nachdem, ob es sich um eine Produktions- oder Entwicklungsumgebung handelt.

Angenommen, der Fehler BadDeviceToken ist auf den zweiten Fall zurückzuführen - dass das von der App registrierte Gerätetoken nicht mit der ordnungsgemäß konfigurierten Entwicklungsumgebung des Backends übereinstimmt. Überprüfen Sie zunächst in Ihrem Xcode-Projekt Ihr .entitlements Datei und überprüfen Sie, dass die APS Environment Der Wert des Schlüssels ist development. Es sollte so aussehen:

enter image description here

Nachdem Sie ein Archiv erstellt haben, öffnen Sie den Organizer (über das Menü Window> Organizer), wählen Sie das Archiv aus und klicken Sie auf Export... rechts. Sie sollten vier Verteilungsmethoden sehen:

enter image description here

Wenn Sie App Store oder Enterprise auswählen, werden Sie in den späteren Dialogen sehen, dass Xcode die APNS-Berechtigungen in Production ändert (siehe Tipp des roten Pfeils):

enter image description here

Wenn Sie Ad-hoc oder Entwicklung auswählen, lautet der Text unter aps-environment ​​development, was dann mit den Konfigurationen des Backends übereinstimmen sollte.

27
Matthew Quiros

Statuscode '400': Diese Fehlermeldung wird angezeigt, wenn Sie versuchen, die Benachrichtigung mit einem falschen Zertifikat zu senden. Stellen Sie sicher, dass Sie ein Produktionszertifikat für die Produktionsumgebung verwenden. Es ist schlecht, weil Sie schlechte Konfigurationen verwenden.

Statuscode '410': Ja, mit diesem Code können wir verstehen, dass App gelöscht wurde. Wenn wir in unserer App diesen Statuscode erhalten, löschen wir dieses Token von db. Das andere Szenario könnte sein, dass der Benutzer die App erneut installiert hat, wodurch sein Token geändert werden kann. Es ist also besser, Sie entfernen dieses Token.

5
Suhaib Affan

Fehlercode 404: BadDevice-Token

Mögliche Gründe:

  1. Ihr .pem-Zertifikat ist möglicherweise falsch.
  2. Ihre BundleId ist möglicherweise falsch.
  3. Ihre Geräte-ID ist möglicherweise falsch.

Hinweis: Fügen Sie .voip zusammen mit Ihrem Bundleid zum Senden einer VoIP-Push-Benachrichtigung hinzu (Beispiel: bundleid.voip).

Hier ist ein praktikables Beispiel für eine VoIP-Push-Benachrichtigung: 

<?php
$token = $_REQUEST['tok'];
if (!defined('CURL_HTTP_VERSION_2_0')) {
  define('CURL_HTTP_VERSION_2_0', 3);
}
// open connection 
$http2ch = curl_init();
curl_setopt($http2ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
// send Push
$Apple_cert = 'certificate_name.pem';
$message = '{"aps":{"action":"message","title":"your_title","body":"your_message_body"}}';
$http2_server = 'https://api.development.Push.Apple.com'; // or 'api.Push.Apple.com' if production
$app_bundle_id = 'your bundle id';
$status = sendHTTP2Push($http2ch, $http2_server, $Apple_cert, $app_bundle_id, $message, $token);
echo $status;
// close connection
curl_close($http2ch);
function sendHTTP2Push($http2ch, $http2_server, $Apple_cert, $app_bundle_id, $message, $token) 
{
    // url (endpoint)
    $url = "{$http2_server}/3/device/{$token}";
    $cert = realpath($Apple_cert);
    // headers
    $headers = array(
        "apns-topic: {$app_bundle_id}",
        "User-Agent: My Sender"
    );
    curl_setopt_array($http2ch, array(
        CURLOPT_URL => $url,
        CURLOPT_PORT => 443,
        CURLOPT_HTTPHEADER => $headers,
        CURLOPT_POST => TRUE,
        CURLOPT_POSTFIELDS => $message,
        CURLOPT_RETURNTRANSFER => TRUE,
        CURLOPT_TIMEOUT => 30,
        CURLOPT_SSL_VERIFYPEER => false,
        CURLOPT_SSLCERT => $cert,
        CURLOPT_HEADER => 1
    ));
    $result = curl_exec($http2ch);
    if ($result === FALSE) {
      throw new Exception("Curl failed: " .  curl_error($http2ch));
    }
    // get response
    $status = curl_getinfo($http2ch, CURLINFO_HTTP_CODE);
    if($status=="200")
    echo "SENT|NA";
    else
    echo "FAILED|$status";
}
?> 
1

Bei Verwendung von node-apn. Ich fand die Antworten hier ziemlich verwirrend, da APN Token verwendet, die entweder für Sandbox- oder für Produktionsmodi funktionieren. Ich war auch verwirrt, weil ich ein einmaliges Skript geschrieben habe, um eine Benachrichtigung zu senden, die in der Produktion funktioniert hat.

Erst als ich zu vermuten begann, dass mein Service nicht process.env.NODE_ENV === 'production' Erhielt. Also habe ich das zu meiner Startprotokollnachricht hinzugefügt und siehe da, mein Service-Runner forever hat keine Umgebungsvariablen abgerufen. Aus diesem Grund wurde versucht, Produktionsgeräte-IDs für die Sandbox-URL zu ermitteln.

0
Kyle Parisi