2012-01-24 5 views
4

Я тестировал push-уведомление на своей локальной машине, он отлично работает. Затем я загрузил файлы на реальный сервер с тем же сертификатом (файл «.pem»), и я гарантирую, что порты 2195 и 2196 открыты.ios Push Notification не работает на сервере

Я проверил:

telnet gateway.sandbox.push.apple.com 2195 

Он работает ...

[email protected] ~ # telnet gateway.sandbox.push.apple.com 2195 

Trying 17.149.34.54... 

Connected to gateway.sandbox.push.apple.com. 

Escape character is '^]'. 

Но когда я тестирую из моего PHP скрипт, он возвращает:

Предупреждение: stream_socket_client() [function.stream-socket-client]: невозможно подключиться к ssl: //gateway.sandbox.push.apple.com: 2195 (Co ть соединение тайм-аут)

Внимание: stream_socket_client() [function.stream-сокет-клиент]: не может подключиться к SSL: //feedback.sandbox.push.apple.com: 2196

Любой предложения?


Это код PHP:

$ctx = stream_context_create(); 

stream_context_set_option($ctx, 'ssl', 'local_cert', 
    "path/to/certificate"); 

$fp = stream_socket_client("ssl://gateway.push.apple.com:2195", 
    $error, $errorString, 100, 
    (STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT), $ctx); 
+0

Просьба показать весь код PHP ... – powtac

+0

$ ctx = stream_context_create(); \t \t stream_context_set_option ($ ctx, 'ssl', 'local_cert', "путь/в/сертификат"); \t \t $ fp = stream_socket_client ("путь/в/сертификат", $ error, $ errorString, 100, (STREAM_CLIENT_CONNECT | STREAM_CLIENT_PERSISTENT), $ ctx); – yasserislam

+0

Лучше добавить это на свой вопрос, просто отредактируйте его. –

ответ

0

В функции stream_socket_client, вы не должны пройти путь сертификата, но гиперссылка APNS.

Этот метод открывает соединение и возвращает его:

public function connect(){ 

     $streamContext = stream_context_create(); 
     stream_context_set_option($streamContext, 'ssl', 'local_cert', '/your/cert/path'); 
     $apns = stream_socket_client('use.apns.url.here', $error, $errorString, 9, STREAM_CLIENT_CONNECT, $streamContext); 

     if (!$apns){ 
      $this->logger->error("Failed to connect to APNS: {$error} {$errorString}."); 
     } 

     return $apns; 
    } 

После того, как вы построили свой APNs сообщение, вы можете нажать его с помощью следующей

fwrite($apns, $apnsMessage); 

Вы можете читать этот учебник http://goo.gl/9Q0u если ваша цель заключается в том, чтобы реализовать свой собственный API-интерфейс push-уведомления.

Там также существующие PHP библиотеки:

И очень хорошая библиотека Java (я в настоящее время использовать его для массивных толчков):

+0

спасибо, я отредактировал код, и результат тот же – yasserislam

+0

Можете ли вы попробовать без STREAM_CLIENT_PERSISTENT – pgratton

+0

те же результаты ... – yasserislam

2

У меня была такая же проблема с получением «не удалось подключиться к ... (Время ожидания соединения)». Я могу подключиться к своей домашней машине, но не могу с сервера хостинга.

В моем случае порты 2195 и 2196 были не просто открыты с размещенного сервера. Мне пришлось обратиться в службу технической поддержки, чтобы открыть эти порты. Ping может работать, потому что он использует другой номер порта. Поэтому, пожалуйста, свяжитесь с вашей компанией, предоставляющей услуги хостинга, чтобы эти порты были открыты.

Успехов,

Kaz

5

Этот код будет работать нормально:

$device = 'sdfsdfsfsdffsd'; 
$payload['aps'] = array('alert' => 'Hello I am testing the server code ....', 'badge' => 1, 'sound' => 'default'); 
$payload = json_encode($payload); 

$options = array('ssl' => array(
    'local_cert' =>'ck.pem', 
    'passphrase' => 'abc123' 
)); 



$streamContext = stream_context_create(); 
stream_context_set_option($streamContext, $options); 
$apns = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $error, $errorString, 60, STREAM_CLIENT_CONNECT, $streamContext); 

$apnsMessage = chr(0) . chr(0) . chr(32) . pack('H*', str_replace(' ', '', $device)) . chr(0) . chr(strlen($payload)) . $payload; 
fwrite($apns, $apnsMessage); 
fclose($apns); 

только проверить путь PEM файл, а порт включен.

0

Вы должны установить свой брандмауэр, чтобы разрешить весь блок 17.0.0.0/8 (все это принадлежит Apple!). Проверить THIS ANSWER

И согласно Apple:

Серверы APNs использовать балансировку нагрузки, так что ваши устройства не всегда подключены к одному IP-адресу для уведомлений общественности. Лучше всего разрешить доступ к этим портам во всем блоке адресов 17.0.0.0/8, который назначен Apple.

Если вы используете брандмауэр CSF (как я), я бы рекомендовал, чтобы добавить эту строку в файл csf.allow:

tcp|out|d=2195|d=17.0.0.0/8

Используя это вместо того, чтобы просто «17.0.0.0/ 8 »позволит использовать только внешние соединения с Apple и, в частности, с портом 2195. NSA не понравится, но это намного точнее и безопаснее! ;)