Проблема с push-уведомлением iPhone

У меня проблема с push-уведомлением в моем приложении. Я только начал работать с push-уведомлениями, поэтому не знаю, в чем причина моей проблемы, и не могу найти решение в гугле. Итак, я использовал этот учебник http://www.raywenderlich.com/3443/apple-push-notification-services-tutorial-part-12 как пример программирования push-уведомлений. Когда я запускаю «php simplepush.php» на своем терминале, все в порядке, и я получаю уведомление на своем устройстве. Но когда я загружаю этот скрипт на сервер и пытаюсь запустить его оттуда, никаких действий не выполняется. всего 30 секунд ожидания и сообщение "Не удалось подключиться: 110 Время ожидания подключения истекло"

Вот код моего скрипта

<?php 
Put your device token here (without spaces):
$deviceToken = '***************';

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

// Put your alert message here:
$message = 'My first push notification!';

////////////////////////////////////////////////////////////////////////////////

$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;

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

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

// Build the binary notification
$msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . 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;

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

person NewObjective    schedule 24.10.2012    source источник
comment
Терминал и сервер находятся на одном хосте? Вы убедились, что хост может подключиться к gateway.sandbox.push.apple.com с помощью SSL с хоста? Возможно, вам потребуется установить сертификат SSL на хост.   -  person Peter Gluck    schedule 24.10.2012
comment
Извините, но я не совсем понимаю, как проверить, установлен ли сертификат SSL на хосте. Как я могу это проверить? Кстати, наш хост поддерживается bluehost, и bluehost предлагает установить один из SSL-сертификатов за деньги? Это тот самый сертификат, о котором вы говорите? Еще одна вещь: если я удалю песочницу из «ssl://gateway.sandbox.push.apple.com:2195», уведомления не будут доставляться на устройство, даже с моего Mac, с терминала. Но все равно появляется сообщение "Сообщение успешно доставлено"   -  person NewObjective    schedule 25.10.2012
comment
Если вы решили это, можете ли вы опубликовать решение ниже? Это может помочь другим в похожей ситуации. Спасибо.   -  person Bill the Lizard    schedule 01.11.2012
comment
Проблема заключалась в том, что порт 2195 был закрыт. Когда я открыл порт для своего домена (с помощью службы поддержки bluehost), все стало отлично   -  person NewObjective    schedule 01.11.2012


Ответы (1)


Да, как пояснил NewObjective, порты 2195 и 2196 должны быть открыты. Чтобы открыть эти порты, вы можете обратиться в службу технической поддержки Bluehost (тикет/чат), но перед этим у вас должен быть выделенный IP-адрес.

Но есть еще одна проблема. Если вы попытаетесь отправить push-уведомление сразу после установки выделенного IP-адреса и открытия обоих портов, вы можете получить ту же ошибку «Время ожидания подключения истекло». Вы можете проверить эту проблему, войдя на свой сервер через SSH и выполнив команду «telnet gateway.sandbox.push.apple.com 2195». Если вы получаете сообщение об ошибке «Время ожидания подключения истекло» - вы можете попытаться связаться со службой поддержки Bluehost, но они не могут решить эту проблему.

Если вы попытаетесь подключиться через телнет к любому другому серверу с открытым портом 2195, вы также получите эту ошибку. У меня было около 10 чатов со службой поддержки Bluehost, я открыл около 10 тикетов, но они действительно не могли мне помочь. Но через две недели все стало работать. Я думаю, это потому, что включение выделенного IP занимает некоторое время, но я не уверен. В любом случае, очень интересно, что служба поддержки Bluehost всегда отвечает, что проблема на стороне Apple, даже если вы говорите им, что любой другой сервер с открытым портом 2195 тоже недоступен)

person Amoneron    schedule 06.05.2013