2011-10-27 10 views
7

tengo este script PHP:Enviar notificación de inserción de fichas para muchos dispositivos

$q = mysql_query("SELECT `token` FROM `tokens`"); 

$ctx = stream_context_create(); 
stream_context_set_option($ctx, 'ssl', 'local_cert', 'apns.pem'); 
$fp = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx); 


while($token = mysql_fetch_array($q)) 
{ 
    $deviceToken = $token[0]; 
    echo $deviceToken.": "; 
    $payload['aps'] = array('alert' => $message, 'sound' => 'Completed.wav'); 
    $payload = json_encode($payload); 

    if (!$fp) 
    { 
     echo "Failed to connect {$err} {$errstrn}<br />"; 
    } 
    else 
    { 
     echo "Connection OK<br />"; 
    } 

    $msg = chr(0) . pack("n", 32) . pack('H*', $deviceToken) . pack("n", strlen($payload)) . $payload; 

    if (fwrite($fp, $msg, strlen($msg)) === FALSE) 
    { 
     echo "can't write to socket!<br />"; 
    } 
} 

fclose($fp); 

resultado para todo símbolo - Conexión correcta! ¡Pero la Notificación Push es recibida solo por un dispositivo! Probé el envío de mensajes diferentes, pero el resultado no cambió :(

+0

wow !!! ideas! ?? –

+1

Solo una idea (potencialmente estúpida): ¿la pasarela APN admite varias PN en una sola conexión? Quizás deberías intentar mover la abrir/cerrar secuencia dentro del ciclo. – mkilmanas

+0

no, no funciona. pero encontré clase en el código de google, en esta clase implementé este ID único para mensajes, pero sobre identificación única en la documentación de Apple nada sobre esta identificación ... –

Respuesta

3

probar mi código. Lo prueba con 4 dispositivos.

Lo siento por los comentarios que están en español.

<?php 
include("../conectar.php"); 

if (isset($_GET['msj']) and isset($_GET['cupon']) and $_GET['msj'] != '' and $_GET['cupon'] != '') { 

    $msj = $_GET['msj']; 
    $cupon = $_GET['cupon']; 

    echo '<textarea name="textarea" id="textarea" cols="70" rows="10">'; 

    // Le mandamos el msj a todos los tokens registradosdevice_token 
    $sql = "SELECT * FROM active_users"; 
    $resultSql = mysql_query($sql) or die (mysql_error()); 

    echo "Se enviaran: ".mysql_num_rows($resultSql)." notificaciones" . PHP_EOL; 
    ob_flush(); 
    flush(); 

    $i = 0; 
    while($row = mysql_fetch_array($resultSql)) { 

     $deviceToken[$i] = $row['token']; 
     $i++; 
    } 

     // Put your private key's passphrase here: 
     $passphrase = '****'; 

     // Put your alert message here: 
     $message = $msj; 

     ////////////////////////////////////////////////////////////////////////////////  
     $ctx = stream_context_create(); 
     stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem'); 
     stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase); 

     // Open a connection to the APNS server 
     $fp = stream_socket_client(
      'ssl://gateway.sandbox.push.apple.com:2195', $err, 
      $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx); 

     if (!$fp) 
      exit("Failed to connect: $err $errstr" . PHP_EOL); 

     echo 'Connected to APNS' . PHP_EOL; 
     ob_flush(); 
     flush(); 

     // Create the payload body 
     $body['aps'] = array(
      'alert' => $message, 
      'sound' => 'default', 
      'badge' => '+1' 
     ); 
     $body['tags'] = array(
      'cupon' => $cupon 
     ); 

     // Encode the payload as JSON 
     $payload = json_encode($body); 

     for($i = 0; $i<count($deviceToken); $i++) { 

      // Build the binary notification 
      $msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken[$i]) . pack('n', strlen($payload)) . $payload; 

      // Send it to the server 
      $result = fwrite($fp, $msg, strlen($msg)); 

      if (!$result) 
       echo 'Message not delivered' . PHP_EOL; 
      else 
       echo 'Message successfully delivered' . PHP_EOL; 
      ob_flush(); 
      flush(); 

     } 

     // Close the connection to the server 
     fclose($fp); 

    echo '</textarea>'; 
}else{ 
    echo 'error #2'; 
} 
?> 

En mi active_users DB Tengo todos los tokens. Espero que ayude

+0

a poco tarde ... pero esto funciona para mí – spankmaster79

+0

Este código no es diferente del de la pregunta (con respecto a la conexión y fwrites) – jptsetung

Cuestiones relacionadas