2015-02-18 6 views
8

Istnieje wiele informacji na tej stronie o tym, jak obsługiwać błędy zwracane asynchronicznie z usługi Apple Push Notification Service w PHP. Wymyśliłem metodę w PHP, która wydaje się działać całkiem nieźle, ale chciałbym otrzymać jakąś informację zwrotną.Metoda przetwarzania tokenów urządzeń dla usługi powiadamiania Apple Push z PHP

  1. Czy użycie funkcji fflush() jest prawidłowe? Widziałem to w niektórych przykładach, ale nie wszystkie.
  2. Nie mogę uzyskać tego, aby podać błąd dla celowo złego tokena urządzenia. Czemu?
  3. Czy to rozwiązanie jest skalowalne dla tysięcy urządzeń (zakładając, że pamięć max max jest wystarczająco zwiększona)?
  4. Inne problemy?

Notatki:
- Żeton urządzenia dla powiadomienia jest przechowywany w tablicy na początku.
- To nie jest asynchroniczne, ale sprawdza błędy (przeszłe) po wysłaniu każdego powiadomienia i sprawdza jeszcze raz pełną sekundę po ostatnim powiadomieniu.
- Używa nowszego "nowoczesnego" formatu powiadomień, w przeciwieństwie do formatów oryginalnych lub rozszerzonych.
- Wysyła indeks tablicy znaczników jako identyfikator do APNS.
- Używa funkcji checkAppleErrorResponse(), która odczytuje pierwsze 6 bajtów i zwraca wartość false lub identyfikator (indeks), który się nie powiódł, aby można było utworzyć kopię zapasową i kontynuować z następnym tokenem. (Wszystkie tokeny wysłane po awarii są unieważniane.)

$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

Uwaga, niezwiązane z rzeczywistą pytanie: można zrobić wypunktowania umieszczając spacji przed każdym z myślnikami. Może sprawić, że będzie wyglądać trochę ładniej. –

+0

Kiedy spróbowałem, nie rozpoznałbym pierwszych tuzinów linii kodu jako kodu, więc zostawiłem w myślnikach ... – ScottyB

+0

... Huh. To dziwne. Prawdopodobnie dlatego, że Markdown myśli, że chcesz dodać kod jako część punktów. W każdym razie to naprawdę nie jest wielka sprawa. Pomyślałem, że wskażę to. –

Odpowiedz

0

Mam nadzieję, że są powiązane. Użyłem tego. To proste, ale solidne złoto. Przy odrobinie posypania lub bezpieczeństwa i trochę bardziej intensywnej obsłudze błędów, nie trwało długo, zanim wprowadziłem go do systemu, który poradziłby sobie z wszystkim, czego potrzebowałem.

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

+0

Ten link jest przykładem tego, jak napisać serwis internetowy PHP dla aplikacji na iOS, a nie jak wykonywać powiadomienia push w iOS. Na tej stronie jest też inny samouczek dotyczący powiadomień push na iOS, ale jest trochę przestarzały i niezbyt skalowalny. – ScottyB

Powiązane problemy