powered by simpleCommunicator - 2.0.18     © 2024 Programmizd 02
Map
Форумы / iOS [игнор отключен] [закрыт для гостей] / отправка PUSH Уведомления с сервера PHP 5.6
2 сообщений из 2, страница 1 из 1
отправка PUSH Уведомления с сервера PHP 5.6
    #39398291
KarelinT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте. Возникла необходимость реализовать PUSH уведомления для мобильного приложения, однако, пока не получыается отправить ни одного уведомления.
С клиентской частью я вроде-бы закончил: Добавил в манифест необходимые опции, вызвал registerForRemoteNotifications, получил токен в application:didRegisterForRemoteNotificationsWithDeviceToken: (32 байта, которые я передал на свой сервер).
Дальше хуже. На сервере будет приложение на PHP5 5.6, которое должно производить рассылку PUSH уведомлений. Сейчас я работаю с curl 7.52, но на самом сервере в данный момент есть только 5.19, который планируется впоследствии обновить (если предложите вариант без curl то это ещё лучше). Мне нужно выполнить запрос к APNs серверу по протоколу HTTP/2 и передать ему уведомление. Для проверки подлинности я выбрал вариант JWT токена, в котором я указал необходимые параметры: заголовок alg:ES256, kid:xxxxxxxxxx (Это ведь key ID из ключа APNs Auth Key?) тело iss:xxxxxxxxxx (Это token моего сертификата разработчика?) iat: (текущий timestamp). Подписал всё это своим закрытым ключом (действовал через библиотеку Namshi\JOSE). После этого я устанавливаю следующие параметры для cURL:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
	$payload = "\"aps\":{\"alert\":{\"title\":\"$notification->alert_title\",\"body\":\"$notification->alert_body\"}}"; // JSON с самым простым alert'ом
        $url = "https://api.development.push.apple.com/3/device/$notification->token"; // строка из HEX последовательности, полученной в мобильном приложении, 64 символа.
	$ch = curl_init($url);
	curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0); // Пробовал ещё значения 4 и 5 из curl.h, они должны соответствовать CURL_HTTP_VERSION_2TLS и CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE, см. ниже
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
	curl_setopt($ch, CURLOPT_HTTPHEADER, array("apns-topic: $apns_topic", "authorization: bearer $jwt"));
	curl_setopt($ch, CURLOPT_POST, TRUE);
	curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
	curl_setopt($ch, CURLINFO_HEADER_OUT, TRUE); // Только для отладки


Если этот запрос отправить на выполнение, то я получу от APNs следующий ответ:
Код: plaintext
1.
{"reason":"BadDeviceToken"}
Как видно, сервер жалуется на Device Token. сейчас я использую токен 218ad5c73c86bb8a6f24a843cb501d10d1ed5d2098cc6c17efdb522e9ffbf70, hex запись тех байтов, что я получил на клиенте. Что с ними не так?
Apple описывает ошибку следующим образом:
The specified device token was bad. Verify that the request contains a valid token and that the token matches the environment.
Как я могу проверить, что токен правильный? Что за среда? Я использую development сертификат для разработки, возможно, в настройках разрабатываемого приложения нужно что-то изменить? Или формат токена неправильный?

Но это половина беды. Меня беспокоит, что curl для передачи запроса не использует HTTP/2 (или при каждом запросе делает upgrade протокола, но не сообщает уже мне об этом). Вот выхлоп заголовков:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
array (size=1)
  '' => 
    array (size=27)
      'url' => string 'https://api.development.push.apple.com/3/device/218ad5c73c86bb8a6f24a843cb501d10d1ed5d2098cc6c17efdb522e9ffbf70' (length=111)
      'content_type' => null
      'http_code' => int 400
      'header_size' => int 62
      'request_size' => int 474
      'filetime' => int -1
      'ssl_verify_result' => int 0
      'redirect_count' => int 0
      'total_time' => float 0.78166
      'namelookup_time' => float 0.000497
      'connect_time' => float 0.189369
      'pretransfer_time' => float 0.579865
      'size_upload' => float 88
      'size_download' => float 27
      'speed_download' => float 34
      'speed_upload' => float 112
      'download_content_length' => float -1
      'upload_content_length' => float 88
      'starttransfer_time' => float 0.579886
      'redirect_time' => float 0
      'redirect_url' => string '' (length=0)
      'primary_ip' => string '17.188.138.73' (length=13)
      'certinfo' => 
        array (size=0)
          empty
      'primary_port' => int 443
      'local_ip' => string '192.168.11.58' (length=13)
      'local_port' => int 59792
      'request_header' => string 'POST /3/device/218ad5c73c86bb8a6f24a843cb501d10d1ed5d2098cc6c17efdb522e9ffbf70 HTTP/1.1

Host: api.development.push.apple.com

Accept: */*

apns-topic: com.bolid.ubolidproductcatalogue

authorization: bearer eyJhbGciOiJFUzI1NiIsImtpZCI6IkxZNFNRMllKRVgifQ.eyJpc3MiOiIzWFY3Mks5Rko5IiwiaWF0IjoxNDg2MTE4OTY4fQ.MEUCIQCF7KbV_Kot9l5dqfBgl9mtt3LlSFCPq6z7_Iuz4uUMeAIgSBUBFqFgsHPvsAAApOyCFmnE-vWnaFPDDp-ZpoYAaCw

Content-Length: 88

Content-Type: application/x-www-form-urlencoded



' (length=474)

Это только вывод результата запроса и заголовки самого запроса (не тело). Получить в более детальную информацию я не могу, потому как общение происходит через https и получить декодированные HTTP/2 запросы не получится. Как видно, используется версия протокола HTTP/1.1 (по крайней мере для отправки первого запроса). Можно ли на PHP 5.6 сразу отправить запрос по протоколу HTTP/2? Я смотрел в сторону сторонних библиотек вроде guzzle/guzzle, но они работают поверх curl и в них просто выполняется проверка на наличие PHP 7.1 для отправки HTTP/2 без повышения версии протокола.
Ещё раз напомню, что вопросов два: Как обойти ошибку BadDeviceToken и начать общение с сервером по протоколу HTTP/2? Если последнее невозможно, то нужно ли переживать, будут ли проблемы при работе с production сервером APNs?
...
Рейтинг: 0 / 0
отправка PUSH Уведомления с сервера PHP 5.6
    #39402069
KarelinT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проблема с device token была в том, что я неверно формировал строку токена, потерял несколько нулей в ней.
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / iOS [игнор отключен] [закрыт для гостей] / отправка PUSH Уведомления с сервера PHP 5.6
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (1): Анонимы (1)
Читали форум (1): Анонимы (1)
Пользователи онлайн (9): Анонимы (6), Yandex Bot, Bing Bot, RePredeclared 2 мин.
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]