很多朋友对于苹果推送通知服务APNs:本地与远程通知编程指南(第10篇)和不太懂,今天就由小编来为大家分享,希望可以帮助到大家,下面一起来看看吧!
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
{ "reason" : "BadDeviceToken" }
后记
本文主要讲的是与APNs通信。有兴趣的话就点个赞或者关注吧~~~
OK,关于苹果推送通知服务APNs:本地与远程通知编程指南(第10篇)和的内容到此结束了,希望对大家有所帮助。
【苹果推送通知服务APNs:本地与远程通知编程指南(第10篇)】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
这个标题好专业啊,我要赶紧学习一下苹果推送通知服务!
有7位网友表示赞同!
听起来很高级,我的程序终于可以用来推送提示消息了!
有17位网友表示赞同!
集成苹果推送通知,能让我的app更方便用户使用吧?
有9位网友表示赞同!
本地和远程通知编程指南,这要好好看看,才能更懂怎么用APNs!
有8位网友表示赞同!
一直想学习怎么做手机应用的通知,看来这个标题很合适!
有10位网友表示赞同!
苹果推送服务我一直想了解一下,这个系列文章看起来很有深度啊!
有18位网友表示赞同!
系统推送集成十?那这篇文章应该涵盖很多知识了吧?
有18位网友表示赞同!
远程通知编程指南,听着就好懂,一定能学会怎么用它!
有10位网友表示赞同!
我的app现在还在早期阶段,但未来要实现推送功能,这个教程太合适了!
有18位网友表示赞同!
看来苹果的推送服务还挺强大的,可以让用户的体验更好。
有15位网友表示赞同!
系统推送集成系列,终于到了第十篇!期待能详细了解如何使用APNs!
有11位网友表示赞同!
这篇文章应该对想开发iOS应用的同学很有用吧?
有5位网友表示赞同!
学习编程确实需要多积累知识和经验,这个指南看起来很不错!
有6位网友表示赞同!
推送通知设计很重要吧?才能抓住用户的注意力。
有10位网友表示赞同!
看来苹果推送服务有很多细节需要注意,要好好研究一下!
有20位网友表示赞同!
有没有其他类似的文章或教程,可以一起学习一下APNs吗?
有13位网友表示赞同!