ios — APNS + PHP «stream_socket_client (): не удалось включить шифрование & quot;

У меня проблемы с использованием APNS с PHP и получением следующего сообщения:

stream_socket_client(): Failed to enable crypto

Проблема возникает только иногда, а в других случаях это может привести к толчку.

Поскольку у меня есть тестовый скрипт в цикле из 10 итераций, я иногда получаю это:

stream_socket_client(): SSL: Connection reset by peer

Я тестирую с помощью сервера песочницы tls://gateway.sandbox.push.apple.com:2195

Вот что я попробовал:

  • Я попытался переиздать PEM и все сертификаты с ним.
  • Я играл с протоколом запроса sslv3:// а также tls://,
  • Я играл с парольной фразой (push работал без парольной фразы, кстати)
  • Я попытался поиск решения для stackoverflow, но ничего не получилось.
  • Проверено разрешение файла pem 644
  • Проверены разрешения родительских каталогов pem 755

Кажется, что все решения, которые я нашел в Google и SO, — это люди, у которых вообще есть проблемы.

Я чувствую, что обслуживание ограничено тарифом, может быть? Потому что мы подождали некоторое время (около 15 минут), а затем попробовали снова, и смогли успешно отправить около 100 сообщений, пока я не начал получать это сообщение снова.

17

Решение

Услуга push sandbox ограничена по ставке. Я испытал это сам при тестировании, но никогда не сталкивался с таким ограничением при использовании производственного API.

Вы также можете поразить их другие средства защиты.

Вы открываете соединение, отправляете сообщение, закрываете соединение, а затем зацикливаетесь и делаете все заново?

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

Лучшие практики для управления соединениями

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

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

Из Apple Docs @ https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/CommunicatingWIthAPS.html

14

Другие решения

Мой код PHP генерировал следующую ошибку:

PHP Warning:  stream_socket_client(): Failed to enable crypto in /private/tmp/t.php on line 12
PHP Warning:  stream_socket_client(): unable to connect to ssl://gateway.sandbox.push.apple.com:2195 (Unknown error) in /private/tmp/t.php on line 12
PHP Warning:  fclose() expects parameter 1 to be resource, boolean given in /private/tmp/t.php on line 24

Проблема была, чертов сертификат, истек позавчера! 🙂 Вы можете в это поверить?

Итак, мне нужно пересоздать мой файл PEM.

5

Нет необходимости воссоздавать ваш файл pem

эта ошибка возникает, когда вы используете неверный пароль

С уважением
Эмилиано

1

У меня была эта проблема. Исчез после предоставления разрешения на запись всем пользователям для файла .pem.

0

У меня есть эта проблема, потому что я по глупости забыл включить расширение файла (.pem) при указании пути к файлу для local_cert.

0

несколько проверок :

  1. токен устройства должен быть — без spaces и без < или же >
  2. убедитесь, что путь к сертификату указан верно, и срок его действия истек.
  3. убедитесь, что вы используете пароль, который вы используете для создания сертификата
0

В моем случае проблема была с моим Mac (OSX Sierra). Я загрузил php и cert на свой сервер, запустил его, и уведомление было доставлено.

0