Я разместил свой код PHP в облаке Google.
Я хочу отправлять push-уведомления в приложение ios. Я включил порт 2195 и 2196.
При отправке push-уведомления я получил следующую ошибку:
Предупреждение: stream_socket_client (): SSL: сброс соединения по пиру
Предупреждение: stream_socket_client (): не удалось включить шифрование
Предупреждение: stream_socket_client (): невозможно подключиться к
ssl: //gateway.push.apple.com: 2195 (неизвестная ошибка)
Я не очень знаком с Google Cloud. Что я должен сделать, чтобы это работало?
Вот код:
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', PEM_FILE_PATH . 'apns-dev.pem');
$fp = stream_socket_client("ssl://gateway.push.apple.com:2195", $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);
if (!$fp) {
$data['msgs'] = "Failed to connect $err $errstr \n";
} else {
$payload = json_encode($body);
$msg = chr(0) . pack("n", 32) . pack("H*", str_replace(" ", "", $deviceToken)) . pack("n", strlen($payload)) . $payload;
$result = fwrite($fp, $msg);
if (!$result) {
$data['msgs'] = 'Message not delivered'; //. PHP_EOL;
} else {
$data['msgs'] = 'Success'; //. PHP_EOL;
}
fclose($fp);
}
return $data;
Основная проблема, когда мы пытаемся отправить данные на серверы APNS (Apple Push Notification Service), заключается в SSL сертификаты.
APNS использует эту технологию для обеспечения более безопасного соединения со своими пользователями.
Как сказано в APNS документация: «Каждый сертификат ограничен одним приложением, а также одной из двух сред разработки, каждая из которых имеет собственное имя хоста.«. Таким образом, вы можете использовать две среды
развитие (среда тестирования): ssl://gateway.sandbox.push.apple.com:2195
производство (после запуска приложения): ssl://gateway.push.apple.com:2195
Если вы хотите проверить, можете ли вы подключиться к серверу APNS, просто попробуйте следующую команду:
$ telnet gateway.sandbox.push.apple.com 2195
Trying 17.172.232.226...
Connected to gateway.sandbox.push-apple.com.akadns.net.
Escape character is '^]'.
Если вы получили ошибку, убедитесь, что ваш брандмауэр разрешает исходящие соединения через порт 2195.
Затем вы можете проверить работоспособность вашего SSL-сертификата и закрытого ключа и установить безопасное соединение:
$ openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert YourDevCert.pem -key YourPrivateKey.pem
Enter pass phrase for YourPrivateKey.pem: ******
Если это работает, это означает, что ваши сертификаты настроены правильно (вы должны увидеть целую кучу выходных данных, которые openssl сообщают вам, что происходит под капотом).
Зная всю эту информацию, я вижу, что у вас есть одна ошибка в вашем коде, а также вы должны проверить что-то еще:
$payload
переменная является строкой json.$deviceToken
,apns-dev.pem
сертификат, и вы отправляете его на производство среда (я понимаю, что ваш производственный сертификат apns-prod.pem
так что проверь)stream_context_set_option($ctx, "ssl", "passphrase", "your_private_key");
Если у вас есть проблемы или сомнения, я следовал этот урок отправить мои первые APNS Push-уведомления.
Других решений пока нет …