APP推送系统工作原理

APP推送系统工作原理一、传统APP架构下的信息传送APP主动向服务器请求数据,服务器被动的提供数据。步骤如下:然而,如果此时服务器又有了新的新闻,在用户没有主动刷新的情况下,服务器是不会主动推送给用户的。推送解决了这个困境,它让服务器主动连接APP,通知APP有了新的新闻,可以再请求。收到推送的APP(即使已关闭)又去服务器请求最新的新闻,用户就能看到了。二、实现推送的方法实现一个推送系统需要服务器端和…

大家好,又见面了,我是你们的朋友全栈君。

一、传统APP架构下的信息传送

APP主动向服务器请求数据,服务器被动的提供数据。

步骤如下:
在这里插入图片描述

然而,如果此时服务器又有了新的新闻,在用户没有主动刷新的情况下,服务器是不会主动推送给用户的。
推送解决了这个困境,它让服务器主动连接APP,通知APP有了新的新闻,可以再请求。收到推送的APP(即使已关闭)又去服务器请求最新的新闻,用户就能看到了。
二、实现推送的方法
实现一个推送系统需要服务器端和终端的配合。
方法一:轮询
即不停地向服务器发送请求(既然不知道什么时候会发生,那就一遍一遍的问吧)。
缺点:手机消耗电量、流量大;服务器也要处理大量的请求,压力大。

方法二:APP和服务器建立长时间连接通道
通过这个通道,APP可以向服务器请求数据,服务器也可以向APP发送数据。
android系统中,如果APP被关闭,APP可以启动一个后台服务来维持通道继续运行。(ios的解决方法见下)
如何维护这个长时间连接的通道?
APP会每隔段时间向服务器报告自己还活着,服务器收到后,即可知道这个通道可以继续使用。(代价是增加电量消耗)
如果手机中装了多个带有推送功能的APP,如何解决多个通道的问题?
android解决方案:GCM(系统提供)、开发各自的专用通道(国内方法)
Android系统提供的 GCM 只能在 Android2.2 以上才能使用,3.0 以下必须要安装 Googleplay 并登陆了 Google 账号才能支持。而国内发行的手机大多是阉割掉了 google 服务的。
因此,对于 Android 系统来说,各家 app 只能开发自己的专用长连接通道了。然而这时候他们遇到了 app 的天敌:管家和卫士们。前文说了,app 想要及时收到服务器推送的消息,关键在于自己与服务器的长连接通道不被关闭,也就是自己的后台服务可以一直在后台运行,而管家和卫士们的一键清理功能就是专治这种 “毒瘤” 的。道高一尺魔高一丈,app 在与管家和斗士们的长期斗争中,总结了一系列躲避被清理掉的方法,什么定时自启能力、什么相互唤醒、什么前台进程等等。
IOS解决方案:APNS
ios开通了一条系统级别的长连接通道,通道的一端是手机的所有APP,另一端是苹果的服务器。
APP的服务器如果有消息需要推送,先把消息发送到苹果服务器上,再利用苹果的服务器通过长连接通道发送到用户手机,最后通知具体的APP。这样,即使安装了100款APP,也只需要向一条通道里发送推送。

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/137324.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Webstorm的一些常用快捷键

    Webstorm的一些常用快捷键下面是Webstorm的一些常用快捷键:1.ctrl+shift+n:打开工程中的文件,目的是打开当前工程下任意目录的文件。2.ctrl+j:输出模板3.ctrl+b:跳到变量申明处4.ctrl+alt+T:围绕包裹代码(包括zencoding的WrapwithAbbreviation)5.ctrl+[]:匹配{}[]6

    2022年6月12日
    28
  • electron调用go_opencv scalar

    electron调用go_opencv scalarglub一般都是很轻量的编译。go太重了,改一小个部分,就编译的话,多数是编译失败。而且很消耗性能,还没想到完美的优化办法。暂时用个定时器监听2秒,停止1秒,如此循环,会减少些“无效”的编译varwatch=require(‘glob-watcher’);varexec=require(‘child_process’).exec;varsys…

    2025年7月28日
    3
  • layui弹出层提交表单![通俗易懂]

    layui弹出层提交表单![通俗易懂]本文章使用layui框架,提交表单,如果使用其他的框架请右上角!首先设置弹出层如下图:layer.open({ type:2, title:"信息編輯", area:[‘45%’,’35%’], shade:0, sha…

    2022年5月6日
    590
  • Java高并发秒杀API(四)之高并发优化

    Java高并发秒杀API(四)之高并发优化Java高并发秒杀API(四)之高并发优化1.高并发优化分析关于并发并发性上不去是因为当多个线程同时访问一行数据时,产生了事务,因此产生写锁,每当一个获取了事务的线程把锁释放,另一个排队线程才能拿到写锁,QPS(QueryPerSecond每秒查询率)和事务执行的时间有密切关系,事务执行时间越短,并发性越高,这也是要将费时的I/O操作移出事务的原因。在本项目中高并发发生在哪?在

    2022年5月12日
    36
  • uniapp 复制粘贴_小程序封装键盘输入框

    uniapp 复制粘贴_小程序封装键盘输入框本篇没啥营养,就是告诉不熟悉uniapp的开发者怎么完成长按复制,懂得朋友别浪费时间1.给text组件设置对应平台的对应属性,在安卓手机上的效果2.直接设置剪切板的内容uni.setClipboardData(OBJECT)<textstyle=”@longpress=’copyText’>长按触发longpress事件</text>//对应事件copyText(){ uni.setClipboardData({ dat…

    2022年9月1日
    3
  • 什么是泛型?为什么要用泛型?什么是泛型擦除?泛型擦除的过程?

    什么是泛型?为什么要用泛型?什么是泛型擦除?泛型擦除的过程?泛型:本质是参数化类型。为什么要使用?创建集合的时候,往集合里面添加数据,再次取出时,集合会忘记这数据类型,该对象的编译类型就会变成Object类型,否则如果想要变回原来的数据类型的时候,就要强制进行转换。创建集合的时候,我们就指定集合类型,避免这个过程。泛型擦除?Java的泛型处理过程都是在编译器中进行的,编译器首先会生成bytecode码,这个过程是不包括泛型类型,泛型类型在编译的时候是

    2022年6月18日
    36

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号