分类: 云计算
2022-08-31 15:20:25
本文要分享的消息推送指的是当iOS端APP被关闭或者处于后台时,还能收到消息/信息/指令的能力。
这种在APP处于后台或关闭情况下的消息推送能力,通常在以下场景下非常有用:
1)IM即时通讯聊天应用:聊天消息通知、音视频聊天呼叫等;
2)新闻资讯应用:最新资讯通知等,典型代码有:网易新闻客户端、腾讯新闻客户端;
3)SNS社交应用:转发/关注/赞等通知,典型代表有:微博、知乎;
4)邮箱客户端:新邮件通知等,典型代表有:QQ邮箱客户端、Foxmail客户端、网易邮箱大师;
5)金融支付应用:收款通知、转账通知等,典型代表有:支付宝、各大银行的手机银行等;
.... ....
除了以上典型场景下,消息推送这种能力已经被越来越多的APP作为基础能力之一,因为移动互联网时代下,用户的“全时在线”能力非常诱人和强大,能随时随地即时地将各种重要信息推送给用户,无疑是非常有意义的。
众所周之,iOS端的这项消息推送能力就是使用苹果提供的APNs服务来实现(有些iOS小白开发者可能看到各种第3方的iOS端消息推送SDK,总会习惯性地认为这是完全由第3方提供的能力,实际上同样是使用APNs,只是封装了一下而已)。目前介绍APNs消息推送的文章多讨论的是手机端的实现,而服务端的消息要怎么“推”出来这样的文章,要么太老,要么只是介绍如何调用第3方的服务端SDK接口而已(如极光推广、友盟推送、腾讯信鸽推送等)。所以本文趁着最近对项目组的老苹果iOS推送进行升级修改机会,详细查阅了最新苹果的APNs接口文档,同时为了避免重复造轮子(懒),在调研了一些开源常用的库之后,选择了Turo团队开发和维护的pushy开源工程来实现在Java服务端调用苹果最新的APNs HTTP/2接口进行消息推送,并借此文对Pushy的使用方法进行了总结和记录,希望对你用。
补充说明:网上目前能查到的有关iOS端APNs消息推送的Java服务端代码实现,多是介绍如何使用Java-APNS这个工程,但这个工程以及类似的其它工程都很久没有维护了,跟最新的苹果APNs服务已经很难匹配了。相较而言puhsy这个工程一直比较活跃,也对苹果的最新APNs跟进的比较及时,因而本文作者在公司的项目进行升级和重构过程中,毫不犹豫的使用了pushy。
目前主流的iOS第3方推送SDK有:友盟推送、极光推送、信鸽推送等。
使用第3方推送的优点主要是:
1)简单:开箱即用,无需关注技术细节;
2)统计:提供了推送数据的统计能力等;
3)性能:无需关注性能负载,因为第3方都帮你实现好了,你只要调用它的接口即可。
使用第3方推送的缺点也很明显:
1)到达率:虽然第3方移动端消息推送产品都宣传到达率能够达到 90%及以上,但是实际使用起来,发现远远达不到;
2)实时性:第3方移动端消息推送产品的推送通道是共用的,会面向多个推送客户,如果某一个客户PUSH推送量特别大,那么其他的移动端消息推送消息实时性可能就会受到影响;
3)不可控:虽然各种技术细节无需你关注是个优点,但它也同时是个缺点——因为你不可控的东西太多了,想要做一个定制化的需求就力不从心了;
4)被限流:因为第3方的推送服务多是免费提供,所以接口调用等都是有限制要求的(即使纸面上没有说出来),限流是一定要做的,不然这些成本谁抗的住?
更为关键的是,如果是实现iOS的消息推送,苹果官方提供的APNs服务已经足够简单,如果不是为了项目赶进度或偷懒,自已来实现是更靠谱的选择,简单的事情没有必要复杂化,这也正是本文作者的选择。
好了,言归正传,继续聊回使用pushy实现iOS高性能推送这个话题。
APNs和Pushy
苹果设备的消息推送是依靠苹果的APNs(Apple Push Notification service)服务的,APNs的官方简介如下:
Apple Push Notification service (APNs) is the centerpiece of the remote notifications feature. It is a robust, secure, and highly efficient service for app developers to propagate information to iOS (and, indirectly, watchOS), tvOS, and macOS devices.
IOS设备(tvOS、macOS)上的所有消息推送都需要经过APNs,APNs服务确实非常厉害,每天需要推送上百亿的消息,可靠、安全、高效。就算是微信和QQ这种用户级别的即时通讯app在程序没有启动或者后台运行过程中也是需要使用APNs的(当程序启动时,使用自己建立的长连接),只不过腾讯优化了整条从他们服务器到苹果服务器的线路而已,所以觉得推送要快(参考知乎)。
项目组老的苹果推送服务使用的是苹果以前的基于二进制socket的APNs,同时使用的是一个javapns的开源库,这个javapns貌似效果不是很好,在网上也有人有过讨论。javapns现在也停止维护DEPRECATED掉了。作者建议转向基于苹果新APNs服务的库。即时通讯聊天软件app开发可以加蔚可云的v:weikeyun24咨询
苹果新APNs基于HTTP/2,通过连接复用,更加高效,当然还有其它方面的优化和改善,可以参考APNs的一篇介绍,讲解的比较清楚。
再说一下我们使用的Pushy,官方简介如下:
Pushy is a Java library for sending APNs (iOS, macOS, and Safari) push notifications. It is written and maintained by the engineers at Turo......We believe that Pushy is already the best tool for sending APNs push notifications from Java applications, and we hope you'll help us make it even better via bug reports and pull requests.
Pushy的文档和说明很全,讨论也很活跃,作者基本有问必答,大部分疑问都可以找到答案,使用难度也不大。
苹果APNs一直在更新优化,一直在拥抱新技术(HTTP/2,JWT等),是一个非常了不起的服务。
自己来直接调用APNs服务来达到生成环境要求还是有点困难。Turo给我们提供了一个很好的Java库:Pushy。Pushy还有一些其他的功能与用法(Metrics、proxy、Logging...),总体来说还是非常不错的。