Отправка push-уведомления в приложение ios: Google cloud

Я разместил свой код 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;

1

Решение

Основная проблема, когда мы пытаемся отправить данные на серверы 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 сообщают вам, что происходит под капотом).

Зная всю эту информацию, я вижу, что у вас есть одна ошибка в вашем коде, а также вы должны проверить что-то еще:

  • Проверьте, есть ли у вас хорошее соединение с сервером APNS.
  • Проверьте, что ваш $payload переменная является строкой json.
  • Убедитесь, что у вас есть правильный $deviceToken,
  • Убедитесь, что вы используете правильный сертификат с соответствующей средой. В этом случае вы устанавливаете apns-dev.pem сертификат, и вы отправляете его на производство среда (я понимаю, что ваш производственный сертификат apns-prod.pem так что проверь)
  • Убедитесь, что ваш PHP-файл может найти ваш сертификат.
  • Один из Ваши проблемы, Вы не установили пароль для своего закрытого ключа. Вы должны добавить следующую строку после добавления сертификата:

stream_context_set_option($ctx, "ssl", "passphrase", "your_private_key");

Если у вас есть проблемы или сомнения, я следовал этот урок отправить мои первые APNS Push-уведомления.

1

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

Других решений пока нет …

По вопросам рекламы [email protected]