iOS 和 Android 推送功能实现

122 篇文章 0 订阅
39 篇文章 0 订阅
作者:郝培强
链接:https://www.zhihu.com/question/20049505/answer/13807306
来源:知乎
著作权归作者所有,转载请联系作者获得授权。

基本逻辑是这样的,苹果发现如果程序都保持一个后台进程和网络连接的话,有几个坏处:
1、费电,后台进程浪费Cpu和内存
2、网络连接,浪费流量和费电
3、很多开发者写出来的代码不够优化,会带来很多问题
4、界面无法统一
5、开发者其实很难搭建可以支持大量用户的通知服务器(需要的性能很夸张)

所以实际上苹果的做法是:
1、整个系统就一个后台的进程管理推动。
2、所有app都把自己的通知发到苹果的服务器

作者:天光
链接:https://www.zhihu.com/question/20049505/answer/13814637
来源:知乎
著作权归作者所有,转载请联系作者获得授权。

坦率得说,@郝培强 的回答是回答了IOS为啥要做统一的push机制,而非说明push是怎么做的,这点很重要,但是也很容易理解,统一的push机制有助于大大节省系统开销

至于手机的push机制,基本上有3种做法:
1. 采用socket常连接机制(郝培强答案的评论里有人用到了http常连接这个词,是不恰当的,因为http协议本身,是一个典型的请求-返回的偶连接模式,所有http下的推送基本都是依赖轮询实现)。采用这种方式,其实要求TCP/IP一直处在连通的方式,对于3G来说的话,耗电开销太大。同时,要处理关于断线重连以及IP注册的问题(手机端得是socket server),所以这种方式采用的比较少,我个人所做过或者见过的案例中,只有我在顺丰做的项目里采用了这种方式,因为他们是效率和服务质量第一的要求,快递员随身携带多块备用电池(他们还只是使用GPRS,没有3G耗电厉害) 多数情况下,是一个所谓的push-alert机制以保证push协议的可复用性

2. 轮询机制:这种方式是主流,包括IOS采用的也是一样,轮询有两个要点,第一是服务器负荷问题,第二是轮询间隔决定推送的及时性,两者基本处在一个矛盾体中。当然,轮询间隔可以不是固定的数值,可以通过算法形成动态值,以期达到最优

3. 控制信道push:不利用tcpip,而是利用底层的移动通信的控制信道进行push(就是呈现我们手机是哪家信号,是否有电话呼入,是否注册在网的那个信道),短信也是走的这个信道,我们通常可以看到的通过短信push-alert机制,或者BB的push机制都是这样的机制。而BB这样的做法,是一定要和运营商深度合作才能够实现的,这也是BB目前销售运营模式的要点。

===========================
@钟锟 既然很多人提及,我就加以小段,说说轮询
轮询不一定是定时定周期的轮询,可以和特定的算法,操作,结合,在一些应用的情况下,可以让人感觉到是及时的更新,这并不难。好的轮询一定是掌控网络联接控制,系统消息捕获的,例如屏幕解锁时插入一次轮询,使用WIFI时降低轮询周期等等,这些东西都是第三方开发者无法做到的,所以IOS的推送一定是要apple自己来提供比较好。

而云服务相比推送通知来说,要相对简单一些,因为云服务的推送的内容,很多是在特定应用启动以后才需要使用的,可以在应用内部做文章,所以轮询可以做得更方便一些(拿通讯录为例,可以在启动通讯录的时候插入一个云端轮询同步,甚至可以在手指滑动或者搜索的时候加入云端查询同步),这样会让人感觉及时性很高。而通知通常是在应用执行之前到达,用户的行为更不好判断,情况更多,所以麻烦一些。
简单说个轮询算法的思路:
设定一个最小的轮询间隔,例如5秒,也就是说不能无休止的添加轮询密度,这个数字一般感觉是用户在此系统和使用环境下2~3次正常单次操作-响应过程的时间,这样对于一般的用户体验来说会比较能够接受。
再设定一个基本轮询周期,例如15分钟
然后可以开始设定一堆的rule,用来插入轮询,降低或升高轮询周期
例如解锁屏幕,插入一次轮询,
手机处在使用状态,轮询周期降到3分钟一次
1分钟内发生过3次高密度推送的,暂时降低轮询周期到30秒
启动特定应用(例如注册了推送的应用),插入一次轮询

等等,只要不违反最小轮询间隔即可,这些RULE需要很长一段时间根据应用的实际情况进行优化,以最大程度提升用户感受,新的RULE可以加入,老的RULE可以去除,RULE的参数可以调整。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值