получить ошибку SSL Broken pipe при попытке сделать push-уведомление - PullRequest
18 голосов
/ 13 апреля 2010

Мы разрабатываем приложение для iPhone, и у нас есть push-уведомление для разработки и специальная версия, работающая должным образом. Но когда мы пытаемся отправить push-уведомление на реальные пользовательские устройства в нашей базе данных, мы получим сброс SSL-соединения, а затем ошибку Broken pipe. Мы думаем, что в нашей базе данных слишком много устройств (более 70000), поэтому не удалось отправить все сообщения одновременно. Таким образом, мы пытаемся отправить сообщения на 1000 устройств один раз, но все еще получаю эту ошибку «Сломанный канал» для примерно 100 сообщений. И мы не уверены, были ли отправлены сообщения. Любое предложение?

Ответы [ 3 ]

20 голосов
/ 29 мая 2010

Мы решили эту проблему. Он сломан из-за недопустимых токенов в нашей таблице базы данных. И сервис apple apns отключит нас, если будет недействительный токен. Поскольку соединение разорвано, при повторной отправке сообщений будет возникать ошибка «Broken Pipe». Основное решение состоит в том, чтобы определить, успешна ли запись в канал, если нет, просто отключите и снова подключите через некоторое время.

11 голосов
/ 10 октября 2012

emagic верен, одна из причин ошибки «сломанная труба» может быть связана с неверными токенами. Есть несколько других причин, по которым это может произойти. Следующее от Техническое примечание Apple TN2265 :

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

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

Другие возможные проблемы могут быть при отправке полезной нагрузки более 256 байт, ваша полезная нагрузка может быть отформатирована неправильно, или, возможно, ваш Словарь JSON имеет неверный синтаксис.

Случайное отключение, когда ваш провайдер не работает обеспокоен; Просто восстановите соединение и продолжайте. Если один из push-серверов не работает, механизм балансировки нагрузки будет прозрачно перенаправить ваше новое соединение на другой сервер, предполагая, Вы подключаетесь по имени хоста, а не по статическому IP-адресу.

2 голосов
/ 08 марта 2016

Продолжая ответ emagic, это мой фрагмент php-кода:

private $fp;

private function connect(){ 
    $apnsHost      = 'gateway.push.apple.com'; 
    $apnsCert      = 'certs/cert.pem';
    $apnsPort      = 2195;
    $pass          = "blah";
    $streamContext = stream_context_create();

    stream_context_set_option($streamContext, 'ssl', 'local_cert', $apnsCert);
    stream_context_set_option($streamContext, 'ssl', 'passphrase', $pass);
    $this->fp = stream_socket_client('ssl://' . $apnsHost . ':' . $apnsPort, $err, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $streamContext);
    if (!$this->fp) return("Failed to connect: $err $errstr<br>");
    echo 'Connected to APNS<hr />'; 
  }

private function send(){
  $this->connect();
  foreach($pushes as $push) {
    $payload['aps'] = array('alert' => $push->text, 'badge' => 0, 'sound' => 'default');
    $payload2 = json_encode($payload);
    $msg = chr(0) . pack('n', 32) . pack('H*', $push->token) . pack('n', strlen($payload2)) . $payload2;
    try {
      $result = fwrite($this->fp, $msg, strlen($msg));
    } 
    catch (\Exception $e) {
      fclose($this->fp);
      echo('Error sending payload: ' . $e->getMessage());
      sleep(5);
      $this->connect();
    }
  }
}
...