2015-02-18 4 views
8

Auf dieser Website finden Sie viele Informationen zur Behandlung von Fehlern, die asynchron vom Apple Push Notification Service in PHP zurückgegeben werden. Ich habe eine Methode in PHP entwickelt, die ziemlich gut zu funktionieren scheint, aber ich hätte gerne ein Feedback.Methode zur Verarbeitung von Geräte-Tokens für den Apple Push Notification Service mit PHP

  1. Ist die Verwendung von fflush() korrekt? Ich habe es in einigen Beispielen gesehen, aber nicht in allen.
  2. Ich kann es nicht erhalten, um einen Fehler für ein absichtlich schlechtes Gerät Token zu geben. Warum?
  3. Ist diese Lösung auf Tausende von Geräten skalierbar (angenommen, der maximale PHP-Speicher ist ausreichend erhöht)?
  4. Andere Probleme?

Anmerkungen:
- Geräte-Tokens für die Meldung in einem Feld am Anfang gespeichert.
- Es ist nicht asynchron, aber es prüft nach dem Senden jeder Benachrichtigung auf (vergangene) Fehler und prüft eine weitere Sekunde nach der letzten Benachrichtigung eine volle Sekunde.
- Es verwendet das neuere "moderne" Benachrichtigungsformat im Gegensatz zu den ursprünglichen oder erweiterten Formaten.
- Es sendet den Index des Token-Arrays als Kennung an APNS.
- Es verwendet eine checkAppleErrorResponse() - Funktion, die die ersten 6 Bytes liest und entweder false oder den Bezeichner (index) zurückgibt, der fehlgeschlagen ist, so dass sie sichern und mit dem nächsten Token fortfahren kann. (Alle nach einem Fehler gesendeten Token werden ungültig gemacht.)

$ctx = stream_context_create(); 
stream_context_set_option($ctx, 'ssl', 'passphrase', $iosCertPassphrase); 
stream_context_set_option($ctx, "ssl", "local_cert", $iosCertKey); 
$fp = NULL; 
$errno = NULL; 
$errstr = NULL; 

// same payload for all 
$item2 = chr(2) . pack("n", strlen($payload)) . $payload; // payload item has id 2, a 2-byte length ("n") containing length of payload, then payload 

$errorID = -1; 

while ($errorID !== false) { 
    $fp = stream_socket_client($iosHost . ':' . $iosPort, $errno, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);   

    if ($fp === FALSE) { 
     echo('Failed to create socket'); 
     break; 
    } 

    stream_set_blocking($fp, 0); 

    for ($id = $errorID + 1 ; $id < sizeof($iosTokens); $id++) { 
     $errorID = false; 
     $item1 = chr(1) . pack('n', 32) . pack("H*", $iosTokens[$id]['device_token']); // device token item has 1-byte id 1, 2-byte length ("n") containing 32, then 32-byte device token 

     $item3 = chr(3) . pack('n', 4) . pack('N', $id); // notification identifier has 1-byte id 3, 2-byte length ("n") containing 4, then 4-byte identifier 

     $frame = $item1 . $item2 . $item3; 

     $msg = chr(2) . pack("N", strlen($frame)) . $frame; // for "modern" push notification format, msg has 1-byte id 2, 4-byte length ("N") containing the length of the frame, then frame 

     fwrite($fp, $msg); 

     $errorID = checkAppleErrorResponse($fp); 
     fflush($fp); 

     if ($errorID !== false) // if there's an error, stop now 
      break; 
    } 

    // if done with for loop and no errors, pause for a sec and check one last time 
    if ($errorID === false) { 
     $read = array($fp); 
     $null = null; 
     $changedStreams = stream_select($read, $null, $null, 0, 1000000); 

     //check if it is actually false 
     if ($changedStreams === false) 
      {  
      //close stream when done. 
      socket_close($fp); 
      fclose($fp); 
      } 
     elseif ($changedStreams > 0) 
      { 
      // set the error and redo starting after errorID index 
      $errorID = checkAppleErrorResponse($fp); 
      } 
     } 
    } 
} 
+0

Hinweis, in keinem Zusammenhang mit Ihrer eigentlichen Frage: Sie Aufzählungszeichen durch ein Leerzeichen setzt vor jedem Ihres Strich machen. Es könnte es ein bisschen schöner aussehen lassen. –

+0

Wenn ich das versuchte, würde es die ersten Dutzend Zeilen Code nicht als Code erkennen, also bin ich in den Bindestrichen gegangen ... – ScottyB

+0

... Huh. Das ist seltsam. Wahrscheinlich, weil Markdown denkt, dass Sie den Code als Teil der Aufzählungspunkte hinzufügen möchten. Es ist sowieso keine große Sache. Ich dachte nur, ich würde darauf hinweisen. –

Antwort

0

Hoffentlich verwandt. Ich habe das benutzt. Es ist einfach, aber solides Gold. Mit ein wenig Streusel oder Sicherheit und einer intensiveren Fehlerbehandlung, dauerte es nicht lange, bis ich es zu einem System entwickelt hatte, das alles verarbeiten konnte, was ich brauchte.

http://www.raywenderlich.com/2941/how-to-write-a-simple-phpmysql-web-service-for-an-ios-app

+0

Der Link zeigt ein Beispiel zum Schreiben eines PHP-Webdienstes für eine iOS-App und nicht zum Ausführen von iOS-Pushbenachrichtigungen. Es gibt ein weiteres Tutorial auf dieser Website für iOS-Push-Benachrichtigungen, aber es ist ein wenig veraltet und nicht sehr skalierbar. – ScottyB

Verwandte Themen