Push-уведомления о прохождении кошелька APN

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

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

Это журнал, который я получил от жрать изо всех сил.

  • Пробуем 17.188.136.150:443 ... * TCP_NODELAY set * Подключен к api.push.apple.com (17.188.136.150) порт 443 (# 0) * ALPN, предлагает h2 * ALPN, предлагает http / 1.1 * успешно установить проверку сертификата расположение: * CAfile: /usr/local/etc/openssl/cert.pem CApath: /usr/local/etc/[email protected]/certs * SSL-соединение с использованием TLSv1.2 / ECDHE-RSA-CHACHA20-POLY1305 * ALPN, сервер принято использовать h2 * Сертификат сервера: * subject: CN = api.push.apple.com; OU = управление: idms.group.533599; O = Apple Inc .; ST = Калифорния; C = US * Дата начала: 14 марта, 17:50:10 2019 GMT * Дата истечения: 12 апреля 17:50:10 2021 GMT * subjectAltName: host "api.push.apple.com" соответствует api.push.apple сертификата .com "* эмитент: CN = Apple IST CA 2 - G1; OU = Центр сертификации; O = Apple Inc .; C = US * Подтверждение сертификата SSL в порядке. * Используя HTTP2, сервер поддерживает многоразовое использование * Состояние подключения изменено (HTTP / 2 подтверждено) * Копирование данных HTTP / 2 из буфера потока в буфер подключения после обновления: len = 0 * Ошибка отправки HTTP-запроса POST * Подключение # 0 к хосту api .push.apple.com оставлен без изменений

Я использую тот же сертификат, что и для прохода, который пытаюсь обновить, и отправляю токен устройства, полученный при регистрации прохода. Это мой код php.

$client = new Client();
  try {
    $result = $client->post('https://api.push.apple.com:443', [
    'headers' => ['apns-id' => <pass_type_id> , ':path' => '/3/device/<device_id_received_upon_registration>'],
    'json' => ['apns'=>''],
    'debug'=>true,
    'version'=>2.0,
    'ssl_key'   => [<path_to_key>, <key_password>],
    'cert'      => [<path_to_certificate (same one used for signing pass)>, <certificate_password>]]);
    }
    catch (GuzzleHttp\Exception\ClientException $e) {
        dd($e);
    }

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


person Simone Neil-Jones Non    schedule 14.10.2019    source источник


Ответы (1)


У меня работает, с небольшими изменениями:

$pem_file       = '<path_to_your_pem_file_including_private_key>';
$pem_secret     = '<private_key_password>';

$url = "https://api.push.apple.com/3/device/" . $device_push_token;

$response = $client->post($url, [
    'headers' => ['apns-topic' => $pass_type_id],
    'json' => json_decode('{}'),
    'debug' => true,
    'version' => 2.0,
    'cert' => [$pem_file, $pem_secret]
]);

var_dump($response->getStatusCode());
var_dump($response->getReasonPhrase());

Что изменилось, так это полезная нагрузка, которая должна быть пустым объектом JSON (но присутствовать), и имя заголовка для темы, это apns-topic, а не apns-id. Я также создал URL-адрес напрямую, а не через заголовки, и использовал файл pem с включенным в него закрытым ключом, не уверен, что это имеет значение.

Возможно, вам также следует проверить, что вы передаете в конце URL-адреса, это не device_id, а device_push_token.

NB: не забывайте всегда отправлять push-уведомление кошелька на рабочую конечную точку Apple, а не в песочницу!

person Razvan Grigore    schedule 24.11.2019