我必须使用HTTP/2.0发送苹果推送通知吗?我可以使用libcurl吗?

10
这个问题,正如标题所示,实际上有两个问题。
第一个问题:我必须使用HTTP/2.0来发送苹果推送通知吗?
在由苹果提供的APNs提供者API文档中,开头的段落指定了:
提供者API基于HTTP/2网络协议。
还有几个其他关于HTTP/2.0的参考资料。然而,我没有看到(这并不是说没有)任何指定必须使用HTTP/2.0的内容。这是否意味着我可以使用任何HTTP版本?或者我实际上被限制为使用HTTP/2.0?
我非常熟悉HTTP/1.1,但我对HTTP/2.0几乎一无所知,因此如果我能够使用我熟悉的旧协议,我更喜欢那个。

第二个问题(基于第一个问题):我可以使用libcurl与APNs吗?

只有在第一个问题的回答是肯定的情况下,这个问题才是相关的。如果我不必使用HTTP/2.0与APNs,那么我已经知道我可以使用libcurl。

我将从一个已经很忙的服务器发送许多APNs,并且我希望能够本地化处理 - 因此,如果可能的话,我计划使用libcurl。然而,我了解到当涉及到HTTP/2.0时,libcurl有一定的局限性。

主要问题在于,当libcurl建立一个HTTP/2.0连接时,它实际上会从一个包含upgrade头的HTTP/1.1请求开始,并等待101 Switching Protocols状态行。这种行为是否支持APNs?或者我必须尝试使用类似nghttp2的东西?

我发现nghttp2有点复杂,目前文档非常不好。我担心如果不能使用libcurl,我可能最终不得不使用套接字自己实现HTTP/2.0(这将是最糟糕的情况)。

任何有关问题的帮助都将不胜感激!非常感谢大家!

curl命令行在这种情况下非常适用于HTTP/2。只需使用--http2选项和https://网址。所以,肯定有一种方法可以使libcurl也能够实现... - dsign
HTTP/2 在普通的 HTTP:// URL 上完成,我们不知道它使用的是哪个版本。这通常是通过 Upgrade: HTTPS:// 实现的,它与其他方式有所不同。libcurl 最终也将获得对于先前了解的 HTTP2 支持,并欢迎您帮助我们实施它。 - Daniel Stenberg
@DanielStenberg 我其实很有兴趣提供帮助。听起来很有趣。我该如何参与呢? - William Rosenbloom
非常欢迎您加入curl-library邮件列表,说明您想要提供哪方面的帮助,我们会从那里为您提供指导(并讨论解决方案)。同时,请阅读http://curl.haxx.se/dev/contribute.html或者是我即将出版的书中的这一章节:http://ec.haxx.se/sourcecode-contributing.html。 - Daniel Stenberg
自2020年11月起,苹果推送通知服务(APNs)将不再支持传统的二进制协议。详情请参见:https://developer.apple.com/news/?id=11042019a - zvi
4个回答

7

经过一段时间的努力,我终于找到了答案。是的,使用APNS必须使用HTTP/2

这归结于APNS文档中的一行内容

APNs要求使用HPACK(用于HTTP/2的头部压缩),以防止重复的头部键和值。

这意味着HTTP/2是协议的必要部分。


快速检查沙盒APN服务器:它使用HTTP/1.1传递推送通知... 我还没有测试过生产环境。 - Leo

4

使用curl发送http2推送消息的示例脚本。假设您从开发站点获得了认证密钥,并且您的curl版本编译支持http2。 p8文件应该与脚本文件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 "$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"\
   --http2 \
   --data "$payload" \
   $endpoint/3/device/$deviceToken

4
目前,苹果仍在支持其遗留的v2(二进制)API,该API通过HTTPS工作,因此只有想要使用最新API时才需要HTTP/2。
遗留API在附录中有文档记录,但是与HTTP/2 API相比,老API实在太糟糕了,我不能推荐使用它。
我可以肯定地说,遗留API得到了支持,因为我有正在使用它的生产代码(这也是我能说API很糟糕,并且我正在忙于将其迁移到HTTP/2的原因)。

你是否迁移到新的HTTP/2 API?如果是,那么请允许我问一些相关问题。我也在做同样的事情。 - Ramsha Omer
传统系统无法通过HTTPS工作。它根本不是HTTP,而是一种TLS加密的二进制协议,不遵循任何标准。 - nickdnk
二进制 API 将于 2021 年 3 月 31 日停止运行。 - Dan

1

2021年更新 是的,自2021年3月31日起,由于二进制协议将被停用,现在需要使用HTTP/2和JSON方法。

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

为了给您更多的准备时间,将APNs提供商API升级的截止日期延长至2021年3月31日。在此日期之后,APNs将不再支持旧的二进制协议。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接