我必须使用 HTTP/2.0 发送 Apple 推送通知吗?我可以使用 libcurl 吗?
Must I use HTTP/2.0 to send Apple Push Notifications? May I use libcurl?
这道题,从题中你可能已经猜到,真的是两道题合二为一了。
第一个问题:我必须使用 HTTP/2.0 发送 Apple 推送通知吗?
在Apple提供的APNs Provider API documentation上,开头段落指定:
The provider API is based on the HTTP/2 network protocol.
整个文档中还有其他几个对 HTTP/2.0 的引用。但是我没有看到(这并不是说它不存在)任何指定必须使用 HTTP/2.0 must 的内容。这是否意味着我可以使用任何 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
header,然后等待 101 Switching Protocols
状态行。 APNs 支持这种行为吗?或者我必须尝试使用类似 nghttp2?
的东西
我发现 nghttp2 有点复杂,目前 非常 的文档很少。我担心如果我不能使用 libcurl,我可能最终不得不使用套接字自行实现 HTTP/2.0(这将是最糟糕的)。
任何问题的任何帮助都将不胜感激!谢谢大家!
好的,经过很长一段时间我终于找到了答案。 是的,HTTP/2需要才能使用 APNS。
归结为 the APNS docs 中的一行
APNs requires the use of HPACK (header compression for HTTP/2), which prevents repeated header keys and values.
这意味着 HTTP/2 是协议的必需部分。
就目前而言,Apple 仍支持其旧版 v2(二进制)API,它通过 HTTPS 运行,因此仅当您想使用最新的 API.
遗留的 API 记录在附录中,但老实说,与 HTTP/2 API 相比,它太可怕了,我不推荐使用它。
我可以肯定地说旧的 API 是受支持的,因为我现在有生产代码正在使用它(这也是为什么我可以说 API 很糟糕,而且我我正忙着将它迁移到 HTTP/2)。
使用 curl 发送 http2 推送消息的示例脚本。鉴于您拥有来自开发站点的身份验证密钥,并且您的 curl 版本是使用 http2 支持编译的。 p8 file
应该在脚本的同一文件夹中,比如 apns.sh
文件。 运行>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 ""| 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"\
--http2 \
--data "$payload" \
$endpoint/3/device/$deviceToken
2021 年更新
是的,现在需要 HTTP/2 和 JSON 方法,因为二进制协议将于 2021 年 3 月 31 日停用。
https://developer.apple.com/news/?id=c88acm2b
To give you additional time to prepare, the deadline to upgrade to the
APNs provider API has been extended to March 31, 2021. APNs will no
longer support the legacy binary protocol after this date.
这道题,从题中你可能已经猜到,真的是两道题合二为一了。
第一个问题:我必须使用 HTTP/2.0 发送 Apple 推送通知吗?
在Apple提供的APNs Provider API documentation上,开头段落指定:
The provider API is based on the HTTP/2 network protocol.
整个文档中还有其他几个对 HTTP/2.0 的引用。但是我没有看到(这并不是说它不存在)任何指定必须使用 HTTP/2.0 must 的内容。这是否意味着我可以使用任何 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
header,然后等待 101 Switching Protocols
状态行。 APNs 支持这种行为吗?或者我必须尝试使用类似 nghttp2?
我发现 nghttp2 有点复杂,目前 非常 的文档很少。我担心如果我不能使用 libcurl,我可能最终不得不使用套接字自行实现 HTTP/2.0(这将是最糟糕的)。
任何问题的任何帮助都将不胜感激!谢谢大家!
好的,经过很长一段时间我终于找到了答案。 是的,HTTP/2需要才能使用 APNS。
归结为 the APNS docs 中的一行
APNs requires the use of HPACK (header compression for HTTP/2), which prevents repeated header keys and values.
这意味着 HTTP/2 是协议的必需部分。
就目前而言,Apple 仍支持其旧版 v2(二进制)API,它通过 HTTPS 运行,因此仅当您想使用最新的 API.
遗留的 API 记录在附录中,但老实说,与 HTTP/2 API 相比,它太可怕了,我不推荐使用它。
我可以肯定地说旧的 API 是受支持的,因为我现在有生产代码正在使用它(这也是为什么我可以说 API 很糟糕,而且我我正忙着将它迁移到 HTTP/2)。
使用 curl 发送 http2 推送消息的示例脚本。鉴于您拥有来自开发站点的身份验证密钥,并且您的 curl 版本是使用 http2 支持编译的。 p8 file
应该在脚本的同一文件夹中,比如 apns.sh
文件。 运行>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 ""| 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"\
--http2 \
--data "$payload" \
$endpoint/3/device/$deviceToken
2021 年更新 是的,现在需要 HTTP/2 和 JSON 方法,因为二进制协议将于 2021 年 3 月 31 日停用。
https://developer.apple.com/news/?id=c88acm2b
To give you additional time to prepare, the deadline to upgrade to the APNs provider API has been extended to March 31, 2021. APNs will no longer support the legacy binary protocol after this date.