Должен ли я использовать HTTP/2.0 для отправки Apple Push-уведомлений? Могу ли я использовать libcurl?

Этот вопрос, как вы, возможно, поняли из названия, на самом деле представляет собой два вопроса в одном.

Первый вопрос: должен ли я использовать HTTP/2.0 для отправки Apple Push-уведомлений?

В документации API провайдера APNs, предоставленной Apple, во вступительных абзацах указано:

API провайдера основан на сетевом протоколе HTTP / 2.

В документации есть несколько других ссылок на HTTP/2.0. Однако я не вижу (что не означает, что его там нет) ничего, указывающего, что HTTP/2.0 должен использоваться. Означает ли это, что мне разрешено использовать любую версию HTTP? Или я на самом деле ограничен HTTP/2.0?

Я очень знаком с HTTP/1.1, но я почти ничего не знаю о HTTP/2.0, поэтому, если я смогу использовать свой старый знакомый протокол, я бы предпочел это.

Второй вопрос (основанный на первом вопросе): могу ли я использовать libcurl с APN?

Этот вопрос имеет отношение только к положительному ответу на первый вопрос. Если это неправда, что я должен использовать HTTP/2.0 с APN, то я уже знаю, что могу использовать libcurl.

Я буду отправлять много APN с уже занятого сервера, и я бы предпочел сделать это изначально - поэтому я планирую использовать libcurl, если это возможно. Однако я понимаю, что libcurl несколько ограничен, когда дело доходит до HTTP/2.0.

Основная проблема заключается в том, что когда libcurl устанавливает соединение HTTP/2.0, оно фактически начинается с запроса HTTP/1.1, который включает upgrade заголовок, а затем ждет 101 Switching Protocols строка состояния. Поддерживается ли такое поведение с APN? Или я должен попытаться использовать что-то вроде nghttp2?

Я обнаружил, что nghttp2 несколько сложен и очень плохо документирован на данный момент. Я боюсь, что если я не смогу использовать libcurl, мне может понадобиться реализовать HTTP/2.0 самостоятельно, используя сокеты (что было бы ХУДОЖЕСТВЕННО).

Любая помощь ценится за любой вопрос! Спасибо всем!

4 ответа

Решение

Хорошо, через много времени я наконец нашел ответ. Да, HTTP/2 требуется для использования APNS.

Это сводится к одной строке в APNS документах, которая говорит

APN требует использования HPACK (сжатие заголовка для HTTP/2), что предотвращает повторные ключи и значения заголовка.

что подразумевает, что HTTP / 2 является обязательной частью протокола.

На данный момент Apple по-прежнему поддерживает устаревший (двоичный) API v2, который работает по протоколу HTTPS, поэтому HTTP/2 требуется только в том случае, если вы хотите использовать новейший API.

Устаревший API документирован в приложении, но, честно говоря, по сравнению с HTTP/2 API, он настолько ужасен, что я не могу рекомендовать его использовать.

Я могу с уверенностью сказать, что унаследованный API поддерживается, потому что у меня есть производственный код, который использует его прямо сейчас (поэтому я также могу сказать, что API ужасен, и я занят его миграцией в HTTP/2).

Пример сценария с использованием curl для отправки push-сообщения http2. Учитывая, что у вас есть ключ аутентификации с сайта разработчика. p8 file должно быть в той же папке сценария сказать apns.sh файл. Run>bash apns.sh

#!/bin/bash

deviceToken=96951ABACECA47F34C2F93D8E58591054E6F2B42691B4EADA6935C19A107A524

authKey="./AuthKey_SLDFJSDLB.p8"
authKeyId=SLDFJSDLB
teamId=ABCDET
bundleId=com.mycompany.myapp
endpoint=https://api.development.push.apple.com
apns_collapse_id="score_update"

read -r -d '' payload <<-'EOF'
{
   "aps": {
      "badge": 2,
      "category": "mycategory",
      "alert": {
         "title": "my title",
         "subtitle": "my subtitle",
         "body": "my body text message 103"
      }
   },
   "custom": {
      "mykey": "myvalue"
   }
}
EOF

# --------------------------------------------------------------------------

base64() {
   openssl base64 -e -A | tr -- '+/' '-_' | tr -d =
}

sign() {
   printf "$1"| openssl dgst -binary -sha256 -sign "$authKey" | base64
}

time=$(date +%s)
header=$(printf '{ "alg": "ES256", "kid": "%s" }' "$authKeyId" | base64)
claims=$(printf '{ "iss": "%s", "iat": %d }' "$teamId" "$time" | base64)
jwt="$header.$claims.$(sign $header.$claims)"

curl --verbose \
   --header "content-type: application/json" \
   --header "authorization: bearer $jwt" \
   --header "apns-topic: $bundleId" \
   --header "apns-collapse-id: $apns_collapse_id"\
   --data "$payload" \
   $endpoint/3/device/$deviceToken

Обновление 2021 года ДА, теперь требуются методы HTTP / 2 и JSON, так как двоичный протокол прекращается с 31 марта 2021 года.

https://developer.apple.com/news/?id=c88acm2b

Чтобы дать вам дополнительное время на подготовку, крайний срок для обновления API поставщика APNs был продлен до 31 марта 2021 года. После этой даты APN больше не будут поддерживать устаревший двоичный протокол.

Другие вопросы по тегам