iPhone SDK Push-уведомление случайно не удается - PullRequest
3 голосов
/ 17 марта 2010

У меня есть PHP-файл со следующим содержимым, который отлично работает с сертификатами разработки, но когда я переключаюсь на производственный сертификат, PHP выдает ошибки и выдает следующее сообщение, но это происходит только в 50% случаев. Остальные 50% это работает. Кто-нибудь знает, почему это может происходить?

<?php
// masked for security reason 
$deviceToken = 'xxxxxx'; // jq

$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', dirname(__FILE__)."/prod.pem");

$number = 5;

$fp = stream_socket_client('ssl://gateway.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);
if (!$fp) {
  print "Failed to connect $err $errstr\n";
}
else {
  print "Connection OK\n";
  $msg = $_GET['msg'];
    $payload['aps'] = array('alert' => $msg, 'badge' => 1, 'sound' => 'default');
    $payload = json_encode($payload);

  $msg = chr(0) . pack("n",32) . pack('H*', str_replace(' ', '', $deviceToken)) . pack("n",strlen($payload)) . $payload;
  print "sending message :" . $payload . "\n";
  fwrite($fp, $msg);
  fclose($fp);
}
?>

Ошибка PHP:

Предупреждение: stream_socket_client () [function.stream-socket-client]: невозможно установить локальный файл цепочки сертификатов `/var/www/vhosts/thissite.com/httpdocs/prod.pem '; Убедитесь, что настройки вашего кафе / capath содержат сведения о вашем сертификате и его эмитенте в /var/www/vhosts/thissite.com/httpdocs/pushMessageLive.php в строке 19

Предупреждение: stream_socket_client () [function.stream-socket-client]: не удалось создать дескриптор SSL в /var/www/vhosts/thissite.com/httpdocs/pushMessageLive.php в строке 19

Предупреждение: stream_socket_client () [function.stream-socket-client]: не удалось включить шифрование в /var/www/vhosts/thissite.com/httpdocs/pushMessageLive.php в строке 19

Предупреждение: stream_socket_client () [function.stream-socket-client]: невозможно подключиться к ssl: //gateway.sandbox.push.apple.com: 2195 (неизвестная ошибка) в / var / www / vhosts / thissite .com / httpdocs / pushMessageLive.php в строке 19 Не удалось подключиться 0

Ответы [ 4 ]

3 голосов
/ 31 мая 2010

У меня была такая же проблема. Вы должны установить постоянное сокетное соединение с сервером push-уведомлений Apple. Я написал учебник для демона python под названием pyapns (http://github.com/samuraisam/pyapns), который очень хорошо работал для меня:

http://www.how2s.org/index.php/How_to_get_started_with_Apple_Push_Notifications_for_iPhone_or_iPhone_Touch

Это работает, если вы работаете в Debian и имеете права суперпользователя для установки необходимых пакетов, таких как python-twisted, libcurl4-openssl-dev и т. Д.

1 голос
/ 11 мая 2010

Похоже, слишком много подключений. В документации Apple говорится, что вам нужно держать соединение открытым и отправлять столько, сколько вы можете одновременно. Повторное открытие считается DOS-атакой. Поэтому попробуйте сделать его постоянным и посмотрите, не появляется ли такая же ошибка.

0 голосов
/ 09 июня 2010

У меня была та же проблема, и сертификат был ошибочным. Вы можете увидеть решения здесь Как я могу установить SSL-соединение с PHP и здесь Ошибка при использовании SSL-сертификата с PHP .

Надеюсь, это поможет вам.

И для записи вы не обязаны устанавливать постоянную связь с APNS. Хотя лучше отправлять все свои сообщения одновременно, вы можете подключаться и отключаться несколько раз. Я цитирую сайт Apple:

Вы также должны сохранить соединения с APN через несколько уведомления. APN могут рассмотреть соединения, которые быстро и неоднократно установлен и снесен как атака отказа в обслуживании. на ошибка, APNs закрывает соединение который произошла ошибка.

Если вы не создаете сотню соединений одновременно, проблем быть не должно.

0 голосов
/ 12 мая 2010

Я не знаю, является ли ошибка, с которой вы сталкиваетесь, из-за слишком большого количества подключений к push-серверам ... По моему опыту, эти пределы немного сложно достичь.

Но PHP, с другой стороны, вел себя странно, когда я пытался отправлять пакеты push-уведомлений. Я не уверен из вашего примера кода, но я думаю, что вы делаете stream_socket_client() и fclose() для каждого сообщения? Используя эту технику с сокетами SSL в PHP, единственное, что я лично выполнил, это сбой ...

Я не уверен, есть ли у вас возможность запустить Ruby на вашем сервере, но если вы можете, я рекомендую переключиться на ruby-apns-daemon для обработки разговора с серверами Apple. Это легкий и простой в реализации PHP (вы практически создаете тот же полезный JSON-файл, но отправляете его в ruby-apns-daemon, а не через сокет).

...