背景
自从开始用起了iPhone之后,在接收微信或者其它一些通知的的时候,总是会出现一个现象——明明通知栏已经显示了有新消息通知,但是点击唤起App之后head部分总是要显示连接中,很久才能显示出具体消息。当时就很气啊!就寻思:这啥破玩意?Android所有用过的手机三星、华为、OnePlus都没这问题,应该不是我山猪吃不惯细糠吧🤔,然后心里开始问候Apple(我相信很多人都和我一个想法🐶)。直到前两周和我兄弟讨论起这个事情,我发现它里边有一些因果关系在里边,可能并不像表现形式那么简单。于是乎查阅了一些相关资料,仔细琢磨和思考了一下,接下来就说明一下其中的一些原理。
简介
简单来说就是Android和IOS两个系统的消息推送机制就完全不一样,当然本质都是需要建立一个长连接,以此完成消息的上行下放
ios
微信消息在ios是是用的完整一套消息推送机制,即微信服务器消息是给到APNS(Apple Push Notification Service,苹果推送服务器),APNS会通过device token以及AppID等通知到对应设备,然后iphone显示在通知栏,当我们点击通知栏唤起app的时候,出现的连接中,就是我们的iphone向apns拉取消息的过程等待时间。这种情况下,只需要手机和服务器建立一个长连接,就能完成所有消息的推送。
android
本来android的生态机制也有推送服务器这么个玩意,Google的FCM(Firebase Cloud Messaging),但是在国内被阉割了。然后国内各大厂商自己有自己的推送服务器,华为、小米、vivo、oppo都是有的,包括腾讯的TPNS(信鸽)、阿里移动推送(Alibaba Cloud Mobile Push),问题就来了,不统一就乱啊,各玩各的标准,那app厂商就不愿接啊。完了我看好几年前工信部组织的安卓统一推送联盟,根本就被人遗忘在角落了。。。微信消息在android用得则是最简单的C/S架构(实际肯定复杂一些),入上图,即微信服务器直接和app通信,这当然快啊,中间省略了那些流程,但是每有一个app需要消息推送都需要建立一个长连接,需要app在后台驻留,也就意味着极度消耗内存。这也是为什么一般安卓机内存都会比iphone大,另外容易产生内存碎片,也就导致安卓用一段时间时候会更卡顿,这就是这种架构相应的巨大代价。
我也和我老师确认了一下,app中push相关的业务,ios接的就是apple的apns的api,至于安卓则大厂商接得是华米ov的api推送,小的手机厂商则直接使用自研长连接完成push(效率会偏低一些)。
总结
从单个App用户体验角度来说,安卓的做法更胜一筹,这也是apple挨骂的原因;但是从技术和手机使用寿命的长期角度,ios的做法才是合理的,不过因为apple的生态闭环以及坚持,应该不会出现劣币驱逐良币这种现象吧?当然啦,大家现在换手机的频率都在两三年,所以其实没有那么care几年后安卓机会变卡,反而能成为换新机的好理由~~~
最后讲个有意思的事情,据数据统计iphone用户抢微信红包抢不过Android用户(大概率是因为推送机制的不同)