2012-06-08 12 views
5

Wiem, że istnieje wiele wpisów na SO, które rozwiązują ten problem, niestety nie jestem zaawansowany w programowaniu PHP i mam pytanie, na które nie udzielono odpowiedzi w innym miejscu:Stałe połączenie przez PHP do APNS

Wiele samouczków dla powiadomień Apple Push Notifications tworzy połączenie za pomocą funkcji stream_socket_client(). Ale większość z nich nie ma flagi "STREAM_CLIENT_PERSISTENT". Czy ta flaga sprawi, że połączenie będzie naprawdę trwałe? Jeśli tak, to kiedy byłaby zamknięta? Dokumentacja mówi, że pozostanie połączona również podczas przeładowywania strony. Czy to zależy od sesji?

Wersja bez tej flagi działa, ale obawiam się, że APNS zablokuje mnie, gdy tylko wprowadzę certyfikaty produkcyjne itp. (Opisane here). Z góry dzięki.

Odpowiedz

6

Zgodnie z dokumentacją PHP na Predefined Constants korzystając STREAM_CLIENT_PERSISTENT z połączenia APN powinny utrzymać aktywność połączenia między ładowaniem stron. Jest to wymagane w przypadku połączenia z APNS, ponieważ WILL będzie was dławić, gdy uzna jakiekolwiek rozłączenie po wysłaniu ładunku z potencjalnym atakiem Denial of Service.

Jeśli masz jakiekolwiek problemy z klientem poza głównymi połączeniami, możesz spróbować poniższych rozwiązań, ponieważ jest to najlepszy sposób, w jaki radziłem sobie z połączeniem APNS do tej pory w PHP. To używa klienta z PHPXMLRPC, więc będziesz musiał pobrać ten pakiet.

<?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"; 
} 

?> 

ŹRÓDŁO: How to get started with APNS for iPhone or iTouch

chciałbym poświęcić trochę czasu, aby podkreślić, że nie testowałem żadnej z tego kodu, nie mam aplikacji iPhone teraz przetestować to z, więc mogę powiedzieć, czy to faktycznie działa.

Jeśli jest to wykonalne, polecam zamiast tego używać Uban Airship, ponieważ zapewniają one 250 000 darmowych przeskoków miesięcznie do każdego z ich klientów i obsługują połączenie z serwerem APN dla ciebie, z tego miejsca używasz ich APIs do rozmowy z klientami.