2012-06-08 24 views
5

Sé que hay muchas publicaciones en SO que abordan este problema, desafortunadamente no soy tan avanzado en programación PHP y tengo una pregunta que no ha sido respondida en otro lugar:Conexión persistente vía PHP a APNS

Muchos de los tutoriales para notificaciones push de Apple crean una conexión a través de stream_socket_client(). Pero a la mayoría de ellos les falta la bandera "STREAM_CLIENT_PERSISTENT". ¿Esta bandera haría la conexión realmente persistente? Si es así, ¿cuándo se cerraría? La documentación dice que permanecerá conectado también en las recargas de página. ¿Esto depende de las sesiones?

La versión sin este indicador funciona, pero me temo que el APNS me bloqueará tan pronto como coloque los certificados de producción, etc. (descrito here). Gracias de antemano.

Respuesta

6

De acuerdo con la documentación de PHP en Predefined Constants, utilizando STREAM_CLIENT_PERSISTENT con la conexión APN debe mantener la conexión activa entre la carga de la página. Este es un requisito para la conexión APNS, ya que WILL lo estrangulará ya que considera cualquier desconexión después de enviar una carga útil a un posible ataque de denegación de servicio.

Si tiene algún problema con el cliente fuera de las conexiones actuales, puede intentar lo siguiente, ya que es la mejor manera que he visto para manejar una conexión APNS hasta el momento en PHP. Esto utiliza el cliente de PHPXMLRPC, por lo que tendrá que descargar ese paquete.

<?php 

include '../vendors/xmlrpc.inc'; 

$hostName = 'localhost'; # Your services endpoint here. 
$rpcPath = ''; 
$port = 7077; 

if($_GET['action'] == 'provisioning') 
{ 
    $echoString = new xmlrpcmsg(
     'provision', 
     array(
      php_xmlrpc_encode('appid'), 
      php_xmlrpc_encode('/path/to/certificate.pem'), 
      php_xmlrpc_encode('sandbox'), 
      php_xmlrpc_encode(100) 
     ) 
    ); 
    $continue = TRUE; 
} 

if($_GET['action'] == 'notify') 
{ 
    $echoString = new xmlrpcmsg(
     'notify', 
     array(
      php_xmlrpc_encode('paparazzme'), 
      php_xmlrpc_encode(array('6bcda...', '7c008...')), 
      php_xmlrpc_encode(array(array("aps" => array("alert" => "Hello User 1")), array("aps" => array("alert" => "Hello User 2")))) 
     ) 
    ); 
    $continue = TRUE; 
} 

if($continue == true) 
{ 
    # Create a client handle and send request 
    $client = new xmlrpc_client($rpcPath, $hostName, $port); 

    # A little verbose debug 
    $client->setDebug(2); 

    # The response 
    $response = &$client->send($echoString); 

    # Check if response is good 
    if (! $response->faultCode()) 
     print "\nReturned string is: " . php_xmlrpc_decode($response->value()) . "\n"; 
    else 
     print "An error occurred: \nCode: " . $response->faultCode() . " Reason: '" . htmlspecialchars($response->faultString()) . "'\n"; 
} 

?> 

FUENTE: How to get started with APNS for iPhone or iTouch

me gustaría tomar el tiempo, señalar que, yo no he probado ninguna de este código, que no tienen una aplicación de iPhone en este momento para poner a prueba esto con, así que puedo decirte si esto realmente funciona.

Si es posible para usted, le recomiendo que use el Uban Airship, ya que proporcionan 250,000 empujones gratis al mes a cada uno de sus clientes, y que manejan la conexión con el servidor APN para usted, desde allí usa su APIs para hablar con sus clientes.