Подтвердить что ты не робот

Получить ошибку SSL Broken pipe при попытке сделать push-уведомление

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

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

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

Ответ 3

Расширяя эмагический ответ, это мой snpplet php code:

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();
    }
  }
}