1:消息推送平台集成IOS推送和Android推送,对外提供一致的接口服务
IOS推送和Android推送的实现途径完全不一样。IOS推送是将消息发送到Apple的推送服务器(APNS),由APNS负责将消息发送到手机并在通知栏显示。从APNS到手机这一段完全在消息平台的控制之外,甚至在消息发送到APNS后,一般情况下APNS也不会给任何响应和反馈。
Android推送则由我们自己建立了一套推送服务(CPNS),CPNS推送服务器直接接受手机上的推送客户端(一个后台service)的TCP长连接。
2:在推送消息到客户端(手机)时,需要能唯一地定位到手机的设备标识(DeviceToken)。
对IOS系统,Devicetoken是由Apple提供的一个64位 的token。对Android推送,携程旅行主APP用20位的ClientID作为DeviceToken,而对于其它独立APP,由该APP自行确定并通过SDK注册到CPNS。
根据以上描述,在使用推送SOA接口时,理论上需要提供DeviceToken,才能将消息推送到手机。但是为了方便主APP上的业务方使用,推送平台提供了按UID进行消息推送的接口。推送平台根据调用方传入的UID,到MobileDB中根据UID查到对应的DeviceToken。对于独立APP,因为其业务和数据是完全独立的,推送系统不能提供按UID推送的接口。
3:关于推送到达率
IOS推送的到达率不在消息平台控制之内,消息平台只能保证把消息发送到APNS服务器。最后是否能推送到手机,取决于APNS,以及是否在IPhone上的通知中心开放了携程APP(或相应的独立APP)。
当前的Android推送机制是,如果在消息推送时,手机在线(后台service能成功连接到推送服务器),消息将立即被(PUSH)推送到手机。如果手机不在线,则消息将被保存在推送系统,在消息指定的过期时间前,如果手机上线时会将消息取(PULL)下去。这个机制结合了PUSH和PULL,理论上在消息过期前,只要手机能上线,消息都能成功推送下去。
但是实际情况比较复杂。在手机休眠时,WIFI或移动的网络连接可能会被关闭,手机无法在线。如果经常后台唤醒手机,会涉及到电量等问题。Android上的系统生态也很复杂,手机上的推送后台service可能因为各种非技术性因素无法正常运行。比如有些xx管家之类的APP,会经常干掉、甚至选择性干掉后台Service。小米之类的系统,也会默认禁止、或者在资源紧张时干掉后台service。根据业内的一些交流,Android推送的总体到达率在50%-60%左右,我们自己的推送也大致在这个水平。但是如果消息过期时间设置过短(比如几分钟)的话,推送到达率会低一些,因为时间越短,手机在这段时间内正好在线或上线的可能性就更低。
我们的消息推送到达率经常被拿来和微信对比。首先,微信做得确实更成熟,我们还在不断改进中。其次,微信也有漏消息、或者消息延迟到达,只不过发生较少,也不太引人注意。第三,微信的渠道能力很强大,几乎没有rom或管理软件敢对微信做手脚。比如小米系统上有一个应用白名单,这个名单上的应用,后台服务不会被禁用或干掉,微信和QQ就在其列。而不在白名单的应用,后台服务容易被干掉。
另外,和短信相比,消息推送在及时性和可靠性上是有所差距的。这源于二者背后使用的通信通道和通信方式不一样,短信是系统底层的应用,使用的是手机基带处理芯片,只要有移动信号,短信通路就畅通,这是由移动运营商保证的。消息推送则是基于IP的数据通信,由手机CPU处理。使用方须评估自己的业务是否适合使用推送平台,或者考虑在消息推送失败时是否要自行实现额外的补偿机制。
4:其它注意事项
对于Android消息推送,同样内容(指将在消息通知栏显示的内容,对应SOA接口中Payload参数的body部分)的消息每个客户端每天只接收显示一条。一天内重复内容的消息将被过滤。
对于IOS推送,需有Apple颁发的证书,才能对相应的APP进行消息推送。对主APP,在生产/堡垒环境,用的是市场标准包的证书。在UAT/FAT测试环境,用的是免签包的证书。测试人员在测试期间,需要格外注意是在什么环境测试,用的是什么包,否则会导致消息无法成功推送。对其它APP,须提供证书给开发团队,进行配置后,才能进行推送。
对于独立APP,推送系统提供了客户端推送SDK供接入方集成。SDK负责接收Android推送消息并向上抛出,APP开发方须自行开发代码,处理SDK抛出的推送消息。详情参见 客户端推送SDK
对于主APP上的各业务接入方,主APP有缺省的处理逻辑处理SDK抛出的消息(比如弹通知栏、根据指定的url进行跳转等)。如果业务方希望有自己特有的消息处理逻辑,需要在APP端自行开发处理代码。
消息推送逻辑比较复杂,有很多细节都可能会影响到推送的成功。接入方在接入消息推送平台时,须安排好端对端的测试,保证自己的整个流程能正常工作。包括服务端的接口接入,APP端的消息展示、跳转、埋点等。