Java推送IOS通知消息
公司需要做IOS消息推送,我负责后台代码的实现。写这篇文章也是将我踩坑得来的结果记录一下,分享一下。
APN介绍
Apple 推送通知服务(APNs) 是远程通知功能的核心。它是一种强大、安全且高效的服务,可供应用程序开发人员将信息传播到 iOS(以及间接的 watchOS)、tvOS 和 macOS 设备。
在用户设备上首次启动您的应用程序时,系统会自动在您的应用程序和 APN 之间建立经过认证、加密且持久的 IP 连接。此连接允许您的应用程序执行设置以使其能够接收通知,如配置远程通知支持中所述。
用于发送通知的另一半连接——提供者服务器和 APNs 之间持久、安全的通道——需要在你的在线开发者帐户中进行配置并使用 Apple 提供的加密证书。一个供应商是一个服务器,您部署和管理,您配置工作与的APN。
Pushy框架
Pushy 是一个用于发送APN(iOS、macOS 和 Safari)推送通知的 Java 库。
Pushy 使用 Apple 的基于 HTTP/2 的 APNs 协议发送推送通知,并支持 TLS 和基于令牌的身份验证。它与其他推送通知库不同,它侧重于完整的文档、异步操作和工业规模操作的设计。使用 Pushy,可以轻松高效地维护与 APNs 网关的多个并行连接,以向许多不同的应用程序(“主题”)发送大量通知。
我们相信 Pushy 已经是从 Java 应用程序发送 APNs 推送通知的最佳工具,我们希望您能通过错误报告和拉取请求帮助我们做得更好。 git地址:https://github.com/jchambers/pushy 完全可以根据git的说明文档进行修改代码。
IOS推送
推送流程
- 首先ios端开发需要去申请Apple的加密证书 (p8或p12)
- iOS端开发需要提供手机的唯一token
- 服务端加密证书验证通过后,调用pushy的api进行消息推送
代码示例
- 首先项目导入maven依赖
<dependency>
<groupId>com.eatthepath</groupId>
<artifactId>pushy</artifactId>
<version>0.15.0</version>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-tcnative-boringssl-static</artifactId>
<version>2.0.41.Final</version>
<scope>runtime</scope>
</dependency>
获取apple证书方法:https://developer.apple.com/documentation/usernotifications/registering_your_app_with_apns 因为我们项目使用的是p12证书,所以验证代码是基于p12证书编写的
final ApnsClient apnsClient = new ApnsClientBuilder()
.setApnsServer(ApnsClientBuilder.DEVELOPMENT_APNS_HOST) //沙盒地址,生产地址是另一个
.setClientCredentials(new File("/path/to/certificate.p12"), "p12-file-password") //p12证书的存放位置和p12证书的验证密码
.build();
因为一些不可抗因素 我这边做了端口转发,如果没有端口限制,直接用默认端口443即可
final ApnsClient apnsClient = new ApnsClientBuilder()
.setApnsServer(ApnsClientBuilder.DEVELOPMENT_APNS_HOST)
.setSigningKey(ApnsSigningKey.loadFromPkcs8File(new File("/path/to/key.p8"),
"TEAMID1234", "KEYID67890"))
.build();
这是 github上提供的p8证书的apns客户端方法(未尝试) 2. 推送 具体代码就粘在上面了,亲测好使。
总结一下会发生的坑… 因为网上有很多 pushy推送的相关代码,但是发现用的和我这个依赖并不是一个依赖,里面的服务器地址并不对,所以一直推送报错。 还有一个致命的问题,如果你的项目pom的parent集成了netty相关的依赖,而且版本过低。会导致在apns连接时报错…提示的报错也很坑。java.lang.exception: not support using BoringSSL 还以为是证书有问题,和ios那边确认了好久…
|