2015-02-18 11 views
8

Esiste un sacco di informazioni su questo sito su come gestire gli errori restituiti in modo asincrono dal servizio di notifica push di Apple in PHP. Ho trovato un metodo in PHP che sembra funzionare abbastanza bene, ma vorrei un feedback.Metodo per l'elaborazione di token dispositivo per Apple Push Notification Service con PHP

  1. L'uso di fflush() è corretto? L'ho visto in alcuni esempi ma non tutti.
  2. Non riesco a ottenere un errore per un token dispositivo volutamente negativo. Perché?
  3. Questa soluzione è scalabile su migliaia di dispositivi (supponiamo che la memoria massima di PHP sia sufficientemente aumentata)?
  4. Altri problemi?

Note:
- gettoni di dispositivo per la notifica sono memorizzati in un array in partenza.
- Non è asincrono ma controlla gli errori (passati) dopo l'invio di ogni notifica e controlla ancora una volta un secondo dopo l'ultima notifica.
- Utilizza il formato di notifica "moderno" più recente rispetto ai formati originali o estesi.
- Invia l'indice della serie di token come identificatore in APNS.
- Utilizza una funzione checkAppleErrorResponse() che legge i primi 6 byte e restituisce falso o l'identificatore (indice) non riuscito, in modo che possa eseguire il backup e continuare con il token successivo. (Tutti i token inviati dopo un errore sono invalidati.)

$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

nota, non correlato alla tua domanda reale: si può fare elenchi puntati mettendo uno spazio di fronte a ciascuno dei vostri trattini. Potrebbe far sembrare un po 'più bello. –

+0

Quando l'ho provato, non riconosceva la prima dozzina di righe di codice come codice, quindi l'ho lasciato nei trattini ... – ScottyB

+0

... Huh. È strano. Probabilmente perché Markdown pensa di voler aggiungere il codice come parte dei punti elenco. Comunque non è un grosso problema. Ho pensato di farcelo notare. –

risposta

0

Si spera in relazione. L'ho usato. È semplice ma solido. Con un po 'di asprezza o sicurezza e un po' più intenso di gestione degli errori, non passò molto tempo prima che lo avessi anticipato in un sistema in grado di gestire tutto ciò di cui avevo bisogno.

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

+0

Il collegamento è un esempio di come scrivere un servizio Web PHP per un'app iOS, non come eseguire le notifiche push iOS. C'è un altro tutorial su quel sito per le notifiche push di iOS, ma è un po 'obsoleto e non molto scalabile. – ScottyB