大家好,感谢邀请,今天来为大家分享一下深入苹果推送通知服务APNs:本地与远程通知编程攻略(第十篇)的问题,以及和的一些困惑,大家要是还不太明白的话,也没有关系,因为接下来将为大家分享,希望可以帮助到大家,解决大家的问题,下面就开始吧!
providerAPI 基于HTTP/2 网络协议。每次交互都从向您的提供商发出POST 请求开始,其中包含JSON 负载和设备令牌。 APN 将通知有效负载转发到由请求中包含的设备令牌标识的特定用户设备上的应用程序。
提供程序是您配置为使用APN 进行部署和管理的服务器。
Provider Authentication Tokens - provider认证令牌
要安全地连接到APN,您可以使用提供商身份验证令牌或提供商证书。本节介绍使用令牌的连接。
providerAPI 支持JSON Web 令牌(JWT) 规范,允许您通过每个推送通知将语句和元数据(称为声明)传递到APN。有关详细信息,请参阅https://tools.ietf.org/html/rfc7519 上的规范。有关JWT 的更多信息以及用于生成签名JWT 的可用库列表,请参阅https://jwt.io。
提供者身份验证令牌是您构造的JSON 对象,其标头必须包含:
用于加密令牌的加密算法(alg) 从您的开发者帐户获取的10 个字符的密钥标识符(kid) 密钥令牌的声明有效负载必须包括:
发布者(iss)注册的声明密钥,其值为您从开发者帐户获取的10 个字符的团队ID。已发布(iat) 注册的声明密钥,其值表示生成令牌的时间,以纪元(UTC) 以来的秒数表示。创建令牌后,您必须使用您的私钥对其进行签名。然后,您必须使用椭圆曲线数字签名算法(ECDSA) 以及P-256 曲线和SHA-256 哈希算法来加密令牌。在算法标头密钥(alg) 中指定值ES256。有关如何配置令牌的信息,请参阅Xcode 帮助中的配置推送通知。
APNs 的解码JWTprovider 身份验证令牌具有以下格式:
{
"alg": "ES256",
"孩子": "ABC123DEFG"
}
{
"iss": "DEF123GHIJ",
"iat": 1437179036
}注意:APN 仅支持使用ES256 算法签名的提供商身份验证令牌。不安全的JWT 或使用其他算法签名的JWT 将被拒绝,您的提供商将收到InvalidProviderToken (403) 响应。
为了保证安全,APNs需要定期生成token。新令牌在声明密钥上发布了更新,其中的值指示令牌的生成时间。如果令牌颁发的时间戳不在最近一小时内,APNs 将拒绝后续推送消息并返回ExpiredProviderToken (403) 错误。
如果您怀疑ProviderToken 签名密钥已被泄露,您可以从开发者帐户中撤销该密钥。您可以颁发新的密钥对,然后可以使用新的私钥生成新的密钥。为了获得最大的安全性,请使用用已用和已撤销的密钥签名的令牌关闭与所有APN 的连接,并在使用用新密钥签名的令牌之前重新连接。
APNs Provider Certificates - APNs Provider证书
按照Xcode 帮助中配置推送通知中的说明获取的APNs 提供商证书可以连接到APNs 生产和开发环境。
您可以使用APNs 证书向主应用程序发送通知,例如其捆绑包ID,以及与该应用程序关联的任何Apple Watch 复杂功能或备份VoIP 服务。使用证书中的(1.2.840.113635.100.6.3.6) 扩展名来标识推送通知的主题。例如,如果您为应用程序提供了捆绑ID com.yourcompany.yourexampleapp,则可以在证书中指定以下主题:
扩展( 1.2.840.113635.100.6.3.6 ) 严重NOData com.yourcompany.yourexampleappData appData com.yourcompany.yourexampleapp.voipData voipData com.yourcompany.yourexampleapp.complicationData 复杂性
APNs Connections - APNs连接
发送远程通知的第一步是联系相应的APN服务器建立连接:
开发服务器:api.development.push.apple.com:443 生产服务器:api.push.apple.com:443 注意:与APN 通信时,您还可以使用端口2197。例如,您可以执行此操作以允许APN 通过防火墙,但阻止其他HTTPS 流量。
连接到APN 时,您的提供商必须支持TLS 1.2 或更高版本。您可以使用从您的开发人员帐户获取的提供商客户端证书,如创建通用推送通知客户端SSL 证书中所述。
要在没有APNsprovider 证书的情况下进行连接,您必须创建一个提供程序身份验证令牌,并使用通过开发人员帐户配置的密钥进行签名(请参阅Xcode 帮助中的配置推送通知)。获得此令牌后,您就可以开始发送推送消息。然后,您必须定期更新令牌;每个APNsprovider 身份验证令牌的有效期为一小时。
APN 允许每个连接有多个并发流。确切的流量数量取决于您是否使用提供程序证书或身份验证令牌,并且根据服务器负载而变化。不要假设特定的流数量。
使用令牌而不是证书建立与APN 的连接时,在您使用有效的提供程序身份验证令牌发送推送消息之前,该连接上仅允许一个流。 APN 会忽略HTTP/2 PRIORITY 帧,因此不要在流中发送它们。
1. Best Practices for Managing Connections - 管理连接的最佳实践
通过多个通知保持与APN 的连接;不要重复打开和关闭连接。 APN 将快速连接和断开视为拒绝服务攻击。您应该保持连接打开,除非您知道它会空闲一段时间- 例如,如果您每天只向用户发送一次通知,则您可以接受每天使用新连接。
不要为您发送的每个推送请求生成新的提供者身份验证令牌。获取令牌后,在令牌有效期(一小时)内继续将其用于所有推送请求。
您可以与APNs 服务器建立多个连接以提高性能。发送大量远程通知时,将它们分布到多个服务器端点的连接上。与使用单个连接相比,这可以让您更快地发送远程通知并让APN 更快地传送通知,从而提高性能。
如果提供商证书被撤销,或者用于签署提供商令牌的密钥被撤销,请关闭与APN 的所有现有连接并打开新连接。
您可以使用HTTP/2 PING 框架检查连接的运行状况。
2. Terminating an APNs Connection - 终止APNs连接
如果APNs 决定终止已建立的HTTP/2 连接,它将发送GOAWAY 帧。 GOAWAY 帧包含JSON 数据,其负载中带有原因键,该值表示连接终止的原因。有关原因键的可能值列表,请参阅表8-6。
正常请求失败不会导致连接终止。
APNs Notification API - APNs 通知 API
APNs 提供商API 包含您使用HTTP/2 POST 命令配置和发送的请求和响应。您可以使用该请求向APNs 服务器发送推送通知,并使用响应来确定请求的结果。
1. HTTP/2 Request to APNs - HTTP/2 请求 APNs
使用请求向特定用户设备发送通知。
Table 8-1 HTTP/2 request fieldsNameValue:methodPOST:path/3/device/对于该参数,指定目标设备的设备令牌的十六进制字节。
APN 需要使用HPACK(HTTP/2 标头压缩),这可以防止重复的标头键和值。 APNs 为HPACK 维护一个小型动态表。为了避免填写APNs HPACK 表并不得不丢弃表数据,请按如下方式对标头进行编码- 特别是在发送大量流时:
:path 值应编码为文字标头字段,无需索引授权请求标头(如果存在)应编码为文字标头字段,无需对apns-id、apns-expiration 和apns-collapse-id 请求标头进行索引适当的编码根据它是初始操作还是后续POST 操作的一部分而有所不同,如下所示: 第一次发送这些标头时,它们使用增量索引进行编码,以允许将标头名称添加到动态表中。然后,您将发送这些标头,将它们编码为文字标头字段,而不进行索引编码。使用增量索引将所有其他标题编码到文本标题字段中。有关标头编码的更多信息,请参阅tools.ietf.org/html/rfc7541#section-6.2.1 和tools.ietf.org/html/rfc7541#section-6.2.2。
APNs 忽略表8-2 中列出的请求标头以外的请求标头。
Table 8-2 APNs request headers消息的正文内容是通知负载的JSON 字典对象。文本数据不得压缩,最大大小为4KB(4096 字节)。对于Internet 协议语音(VoIP) 通知,最大正文数据大小为5KB(5120 字节)。有关正文内容中包含的键和值的信息,请参阅有效负载键参考。
2. HTTP/2 Response from APNs - HTTP/2 响应APNs
对请求的响应具有表8-3 中列出的格式。
Table 8-3APNs response headers表8-4 列出了请求可能的状态代码。这些值包含在响应的:status 标头中。
Table 8-4Status codes for an APNs response对于成功的请求,响应正文为空。失败时,响应正文包含一个JSON 字典,其中包含表8-5 中列出的键。当连接终止时,此JSON 数据也可能包含在GOAWAY 帧中。
Table 8-5 APNs JSON data keys表8-6 列出了响应JSON 负载的原因键中包含的可能错误代码。
Table 8-6 Values for the APNs JSON reason key
3. HTTP/2 Request/Response Examples for APNs - HTTP/2 APNs 请求响应示例
清单8-1 显示了为提供者证书构造的示例请求
//清单8-1 具有单个主题的证书请求示例
标头
- END_STREAM
+ END_HEADERS
:方法=发布
:方案=https
:路径=/3/设备/00fc13adff785122b4ad28809a3420982341241421348097878e577c991de8f0
主机=api.development.push.apple.com
apns-id=eabeae54-14a8-11e5-b60b-1697f925ec7b
apns 过期=0
apns 优先级=10
数据
+ END_STREAM
{ "aps" : { "alert" : "Hello" } }清单8-2 显示了为提供者身份验证令牌构建的示例请求
//清单8-2 提供者身份验证令牌的示例请求
标头
- END_STREAM
+ END_HEADERS
:方法=发布
:方案=https
:路径=/3/设备/00fc13adff785122b4ad28809a3420982341241421348097878e577c991de8f0
主机=api.development.push.apple.com
apns-id=eabeae54-14a8-11e5-b60b-1697f925ec7b
apns 过期=0
apns 优先级=10
apns-主题=数据
+ END_STREAM
{ "aps" : { "警报" : "你好" } }
标头
- END_STREAM
+ END_HEADERS
:方法=发布
:方案=https
:路径=/3/设备/00fc13adff785122b4ad28809a3420982341241421348097878e577c991de8f0
主机=api.development.push.apple.com
授权=持有者eyAia2lkIjogIjhZTDNHM1JSWDciIH0.eyAiaXNzIjogIkM4Nk5WOUpYM0QiLCAiaWF0I
焦格IjE0NTkxNDM1ODA2NTAIIH0.MEYCIQDzqyahmH1rz1s-LFNkylXEa2lZ_aOCX4daxxTZkVEGzwIhALvkClnx5m5eAT6
Lxw7LZtEQch6JENhJTMArwLf3sXwi
apns-id=eabeae54-14a8-11e5-b60b-1697f925ec7b
apns 过期=0
apns 优先级=10
apns-主题=数据
+ END_STREAM
{ "aps" : { "alert" : "Hello" } }清单8-3 显示了为包含多个主题的证书构建的示例请求。
//清单8-3 具有多个主题的证书请求示例
标头
- END_STREAM
+ END_HEADERS
:方法=发布
:方案=https
:路径=/3/设备/00fc13adff785122b4ad28809a3420982341241421348097878e577c991de8f0
主机=api.development.push.apple.com
apns-id=eabeae54-14a8-11e5-b60b-1697f925ec7b
apns 过期=0
apns 优先级=10
apns-主题=数据
+ END_STREAM
{ "aps" : { "alert" : "Hello" } }清单8-4 显示了对成功推送请求的响应示例。
//清单8-4 成功请求的响应示例
标头
+ END_STREAM
+ END_HEADERS
apns-id=eabeae54-14a8-11e5-b60b-1697f925ec7b
:status=200清单8-5 显示了发生错误时的示例响应。
//清单8-5 遇到错误的请求的示例响应
标头
- END_STREAM
+ END_HEADERS
:状态=400
内容类型=应用程序/json
apns-id:DATA
+ END_STREAM
【深入苹果推送通知服务APNs:本地与远程通知编程攻略(第十篇)】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
终于来了!我一直想了解如何使用 APNs 进行本地和远程通知,这篇文章看起来很有帮助。
有13位网友表示赞同!
学习编程一直是我的目标,这个指南让我兴奋!
有12位网友表示赞同!
我对苹果的推送通知服务非常感兴趣,希望能从这篇教程中学到更多。
有15位网友表示赞同!
看标题感觉很专业,我需要好好仔细阅读一下。
有6位网友表示赞同!
以前没接触过 APNs,这次有机会了!
有18位网友表示赞同!
分享一篇关于远程通知编程指南的文章,这个系列终于更新了!
有17位网友表示赞同!
对想搞技术的朋友来说,这篇文章应该很有用,特别是苹果平台的开发人员。
有18位网友表示赞同!
集成本地和远程通知的功能确实很方便,期待学习一下具体的步骤。
有17位网友表示赞同!
感觉这个教程可以帮助我更好地掌握iOS APP 开发的相关知识点。
有13位网友表示赞同!
苹果推送服务看起来功能强大啊,希望这篇文章能教会我如何使用。
有12位网友表示赞同!
最近在研究移动APP开发,这块内容似乎很有用参考!
有11位网友表示赞同!
编程指南总是很宝贵的技术文档,收藏一下!
有10位网友表示赞同!
想做一款App的用户体验很棒,肯定要学习如何实现推送通知了!
有20位网友表示赞同!
系统的集成教程,看来可以让我了解到更多苹果平台的开发技巧。
有9位网友表示赞同!
苹果系统对开发者的限制比较多,期待作者能详细讲解如何绕过这些问题?
有20位网友表示赞同!
对于想在苹果平台上发布APP的用户来说,这篇文章很有实用价值吧?
有11位网友表示赞同!
这篇教程应该适合各种程度的开发者,从入门到进阶级都有所涉及!
有7位网友表示赞同!
学习APNs可以提升我的编程水平,这个系列教程很不错!
有8位网友表示赞同!