精华内容
下载资源
问答
  • 已实现项目开发钉钉向个人推送消息和与H5微应用操作步骤,内含代码,亲测有效。
  • 混合应用一般使用Cordova...对于混合应用的websocket消息推送,其基本原理如下:图1.Hybridappwebsocket工作流程而原生应用消息推送,其基本原理如下图:图2.原生app消息推送工作流程目前后者主要应用于原生app,而前
  • react-native消息推送

    2021-01-03 21:58:04
    jpush-react-native是极光推送官方开发的 React Native 版本插件,用于消息推送。 注意:如果项目里没有jcore-react-native,需要安装 npm install jpush-react-native --save npm install jcore-react-native --...
  • 现在的推送用的越来越频繁,几乎每个应用都开始用到了。这篇文章主要介绍了iOS点击推送消息跳到应用指定页面方法,有需要的可以了解一下。
  • 远程推送时 , 应用可能处于下列三种状态:  (1) . 应用开启时 , 应用在前台  (2) . 应用开启时 , 应用在后台  (3) . 应用未启动(应用被杀死) 从苹果APNS服务器远程推送时: 1 . 如果应用处于 (1) 状态 , 则不会...
  • 如果已有一个混合移动项目,可以跳到第2步。1.如果还未针对ApacheCordova设置您的环境,请进行相应的设置。下载ApacheCordova的节点打包模块。2.打开一个命令提示符。3.创建一个新项目:cordovacreatebluemixpushcom...
  • 今天,我将手把手教大家如何在你的应用里集成小米推送 目录 1. 官方Demo解析 首先,我们先对小米官方的推送Demo进行解析。 请先到官网下载官方Demo和SDK说明文档 1.1 Demo概况 目录说明: DemoApplication类 ...
  • 主要介绍了SpringBoot实现钉钉机器人消息推送的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 企业微信发送推送消息以及上传媒体文件完整代码及测试,jdk1.6+ecplise
  • 极光推送,使得开发者可以即时地向其应用程序的用户推送通知或者消息,与用户保持互动,从而有效地提高留存率,提升用户体验。平台提供整合了Android推送、iOS推送的统一推送服务。 产品特点 多种推送方式 Push ...
  • 这张图示意的很清晰,大致意思是这样:你的应用服务端将消息发送到apple的APNS服务器,APNS服务器将消息推送到指定的Iphone,最后由Iphone负责将消息推送至你的APP。在此先不说这个过程是如何实现的,仅仅看这个流程...
  • 应用消息推送push服务端开发

    千次阅读 2020-01-20 00:52:24
    文章目录快应用消息推送push开发一、设备信息保存1、设备id的生成1-1生成规则1-2生成弊端1-3更为简单的方式保证唯一性2、不合法regId的过滤3、上报更多设备信息4、程序实现逻辑4-1 程序流程图4-2 实现逻辑核心思想...

    文章目录

    快应用消息推送push开发

    一、设备信息保存

    1、设备id的生成

    1-1生成规则

    线上快应用设备id的生成规则:(总共36位)

    1、时间(13)+Android(16)+厂商(1)+随机(6)

    2、时间(13)+imei(16)+厂商(1)+随机(6)

    3、时间(13)+md5型号后随机取(16)+厂商(1)+随机(6)

    为了保证一个手机设备,快应用存在唯一的设备id采用以上的生成方式,依次当前规则不能生成则由下一个规则去生成设备Id。

    1-2生成弊端

    那么,以上生成方式存在的问题在于:快应用数据被清空(相当于卸载快应用),那么重新安装的时候设备id又重新生成。导致,设备id对手机设备不是唯一不变的标识。

    然而,快应用的数据清空操作复杂,一般清除桌面图标以及缓存清除不能是快应用真正卸载。因此,设备Id变更并不会在重新添加快应用图标到桌面时频繁发生。

    1-3更为简单的方式保证唯一性

    1、Android(16)

    2、imei(16)

    3、时间(13)+md5型号后随机取(16)+厂商(1)+随机(6)

    由于,基本品牌手机能够获取到andriodId,不能获取到,则在用户允许访问设备权限的情况下获取到imei,以上都无法获取才添加变化数值去生成作为deviceId。

    这样保证,用户就算熟练快应用清空数据(卸载)操作,那么,下一次安装快应用,基本上的手机设备id都不会发生改变。

    2、不合法regId的过滤

    regId即为注册Id,这个值为前端调用厂商接口获取该种快应用下的唯一标识,那么消息推送也是根据regId去调用对应厂商接口推送消息。

    不明原因,会出现test_id,3,regid-abdcef这种不合法的regId上报。那么,可以在设备id上报保存之前,对这些不合法的regId进行过滤,不存于数据库。

    3、上报更多设备信息

    快应用除了以上两种设备信息,还包括:自定义的厂商品牌编号provider,快应用版本号version。

    那么,更好的是上报将设备品牌、型号、imei 获取到的情况下,也一同上报数据库保存。

    其中,上报设备品牌可以将品牌编号的生成由后端维护。避免了,新品牌的发生导致快应用的重新发版厂商审核,更利于有效的维护。

    再者,上报更多的设备信息,发现打印设备信息错误的日志打印,那么根据imei可以更好的与厂商技术支持,协调沟通排查问题。

    4、程序实现逻辑

    4-1 程序流程图

    在这里插入图片描述

    4-2 实现逻辑核心思想描述

    1、保证数据库存储设备Id的唯一性

    2、保证数据库某个厂商下regId的唯一性

    3、保证deviceId与regId一对一的双向绑定:由deviceId更新regId,由regId与厂商编号provider更新deviceId。

    5、线上出错问题以及解决方式

    5-1设备信息索引重复

    问题描述:

    前端设备信息在网络不良情况下重复上报,且同时存入数据库导致数据库报错唯一索引deviceid重复。
    在这里插入图片描述在这里插入图片描述

    解决方式:

    对ConstraintViolationException进行异常捕捉,打印warn级别日志信息。

    5-2设备信息保存并发死锁

    问题描述:

    只出现过一次该异常,具体原因有待究查:

    org.springframework.dao.CannotAcquireLockException: could not execute statement; SQL [n/a]; nested exception is org.hibernate.exception.LockAcquisitionException: could not execute statement
    在这里插入图片描述

    二、消息推送

    1、厂商消息推送对比

    1-1厂商消息推送token的获取

    厂商对比
    OppoOppo不限制,但是每次单推都获取依次token,在每天5w单推批量下可能会出现几个网络链接错误。新token官方介绍存活24小时,旧token存活10分钟。(官方文档介绍)
    VivoVivo每天只能获取1w次token,单推每次推送获取token,上万数量下token会超出总限制数报错。(官方文档介绍)
    小米不需要获得token进行推送,详情可查看小米sdk快应用push源码(无官方文档介绍)
    华为Token的有效期为1小时,无次数限制。官方技术支持建议做缓存。(无官方文档介绍)

    vivo

    在这里插入图片描述在这里插入图片描述

    oppo
    在这里插入图片描述

    华为
    在这里插入图片描述

    处理的方式

    1、对华为、vivo的token进行redis缓存,大量级减少单推获取token对厂商服务的请求

    2、线上目前对oppo的token没做缓存,原因在于oppo的sdk存在只有有参构造且无无参构造,构造器内每次实例化都实现对token的获取。那么处理方式,是在oppo网络链接错误的时候,那么便休眠一段时间进行sender实例化获取token的重试。

    3、oppo线上如果确实需要token缓存才解决问题,可将oppo的sdk中像Sender,HttpClientTool等default类源码copy出来,对Sender的构造方法进行修改,进行token的缓存。

    1-2厂商消息推送的频率、每天推送总量

    厂商对比
    Oppo无频率限制,有推送消息数量限制为用户数量的2倍(详情查看官方文档)
    Vivo可发送的单推和群推消息指定的用户量不得超过每日限制的推送总量推送TPS根据SDK订阅数自动调整,默认最低值为500条/秒。(详情查看官方文档)
    小米目前无频率、数量限制。往后会做一些限制。(详情查看官方文档)
    华为无频率、总量限制(官方文档无介绍)

    1、Oppo链接地址:https://open.oppomobile.com/wiki/doc#id=10200 搜ctrl+f搜 技术问题
    在这里插入图片描述在这里插入图片描述
    2、vivo链接地址:https://dev.vivo.com.cn/documentCenter/doc/156
    在这里插入图片描述

    3、小米链接地址:https://dev.mi.com/console/doc/detail?pId=1292#_0_5
    在这里插入图片描述
    4、华为链接地址:
    https://developer.huawei.com/consumer/cn/service/hms/catalog/fastapp.html?page=fastapp_fastapp_faq#报表常见问题

    处理的方式

    1、oppo、vivo做推送总量超限后,将超限信息存储于redis。每次推送从redis查询是否存在超限信息,不超限则继续推送。

    2、对于厂商推送报网络错误等,小米有设置可重发次数,为了避免小米重发后手机收到几条相同的信息,必须对重发消息做id的标识,使客户端对消息去重。
    在这里插入图片描述
    其它厂商:oppo、vivo也有设置消息id标识进行消息重发的去重,而华为没有。那么设可以置标志id为uuid,Oppo、vivo厂商消息推送sdk的无重发策略,需要开发者捕捉网络异常实现重发,这边不做重发。

    Oppo为可选字段设置:
    在这里插入图片描述
    Vivo为必填字段设置:(然而,厂商push服务没有对这个字段进行去重处理,仅仅是有设置)

    在这里插入图片描述

    1-3消息推送时间的限制

    厂商对比
    Oppo无介绍
    Vivo有允许发送时间段,会返回推送异常错误码
    小米无介绍
    华为无介绍

    vivo
    在这里插入图片描述

    处理的方式

    1、设置消息可推送的时间范围,消息推送前进行可推送时间的校验

    2、将今天到达推送时间结束点未推送的消息顺延平移到到下个时间起始点推送。

    举个例子:今晚10点推送,那么顺延到明早8点推送。今晚11点推送,那么顺延到明早9点推送。

    1-4消息推送regid批次大小

    厂商对比
    Oppo1000个
    Vivo1000个
    小米1000个
    华为100个
    处理的方式

    1、特别注意华为快应用push的regid批次数量上限为100。而app push上限数量为1000。

    2、设置厂商统一批次推送regid数量大小:100

    2、java消息id的生成

    生成原因

    将消息的统计与php管理后台消息id传值进行依赖的解耦,即使不依赖外部消息id依然能对一类消息进行统计

    生成规则

    时间戳+消息url+随机数的md5加密成32位

    3、异步多线程分厂商推送

    原因:

    1、更便于统计:把所有厂商混在一起推送,去统计各厂商推送数量实现逻辑更为复杂。

    2、为厂商设置统一的分批推送量:每次批次推送各厂商的量都相同,不会有的推送很少有的很多。

    3、耦合性低:代码逻辑清晰,在调试代码中更好的去找到出错的位置进行调试。在新增厂商推送,只需要配置新增厂商编号与实现厂商推送公共接口,不需要对原有的推送判断逻辑做明显修改,扩展性更好。

    4、多线程提高发送效率。

    4、厂商推送程序实现(单推、群推、全推)

    2-1 程序流程图

    在这里插入图片描述

    2-2 程序UML类基础结构缩略图

    这里厂商举例两种:vivo、oppo
    在这里插入图片描述

    2-3 实现逻辑描述

    1、java生成维护消息id对同一种消息进行标识绑定。

    2、各厂商推送提供者实现共同的推送接口。

    3、异步分厂商进行消息推送。

    4、各厂商推送regid的获取:

    (1) 全量推送分页获取批次各厂商regids推送

    (2) 群推、单推根据传值regids,各厂商分别去获取属于自己

    部分的regids进行推送。

    5、阻塞式获取各厂商推送总数存库:

    (1) 全量推送直接新增记录存库

    (2) 单推、群推根据库内是否存在msgId的数据,是则更新推

    送数量,否则新增记录存库

    6、汇总计算各厂商推送数量总和。

    5、线上出错问题以及解决方式

    5-1数据库保存异常regid,导致推送异常报错

    问题描述:

    设备信息上报保存,会上报”test_id”、”regid-abcdef”等不合法regid存库。

    解决方式:

    1、在设备信息保存前过滤非法regid,避免存库。

    2、在厂商sdk本地校验regid出错时,catch异常。使用厂商过滤规则过滤非法regid后重新推送。

    5-2 vivo推送次数超出总用户限制

    问题描述:

    vivo日推送限制为用户SDK订阅数,可在vivo的push管理后台查看数值。

    当天进行两次分批次的全量推送,第二次推送超出限制数。返回异常码:10070
    在这里插入图片描述
    解决方式:

    1、产品人员每天全量推送条数设置不超过1条。

    2、对所有厂商的异常码进行检查。抽取各厂商正常的返回码,对于异常的返回码程序不执行后续的解析统计操作,直接返回全部推送失败的统计结果。

    3、oppo、vivo做推送总量超限的异常码时,将超限信息存储于redis。每次推送会从redis查询是否存在超限信息,不超限则继续推送。

    5-3 huawei批次regids大小不能超过100

    华为超限返回结果,异常码80300010:
    在这里插入图片描述
    线上批量超限的高频率的非法推送,华为直接限制推送,返回503服务不可用的text数据,导致json解析异常:
    在这里插入图片描述
    解决方式:

    1、捕捉JSONException进行解析异常日志打印。

    2、对所有厂商的异常码进行检查。抽取各厂商正常的返回码,对于异常的返回码程序不执行后续的解析统计操作,直接返回全部推送失败的统计结果。

    3、对厂商的返回结果以及取值属性做判空处理。

    4、将厂商推送批次大小设置为100。

    5-4 vivo服务端返回报文变更,空指针报错

    问题描述:

    vivo的invalidUsers字段,vivo服务校验全部为合法用户:从原来的返回invalidUsers空列表json字段,变更为不返回值。

    从如下报文格式:
    在这里插入图片描述
    变更为:
    在这里插入图片描述
    解决方式:

    1、对所有厂商的返回结果以及取值属性做判空处理。

    5-5 vivo权限认证失败

    问题描述:

    vivo的token获取次数超出1w次,返回异常码:10000
    在这里插入图片描述
    解决方式:

    1、vivo、华为的token设置失效时间存缓存,采用分布式锁实现并发场景下token失效后重新获取,只调用vivo、华为推送服务去获取一次token。

    5-6小米三次握手连接出错

    问题描述:

    小米push发送群推信息,一天6w次左右推送下,会发生10次左右。三次握手失败的网络连接失败IOException。
    在这里插入图片描述

    解决方式:

    1、设置小米sdk的网络连接失败重发次数为3,为避免重发导致消息重复。那么,需要每次调用厂商接口群推时都生成并设置一个8个字符的jobkey参数。

    生成规则为:当前时间戳秒的16进制字符串。

    5-6 oppo单推服务限流

    问题描述:

    一天5w次单推下,会返回4次左右,状态码为-2的限流结果。
    在这里插入图片描述
    解决方式:

    对单推限流不做重推处理,也暂时不做限制发送频率。打印warn日志,继续观察在更大推送次数下的推送情况。

    5-7 oppo非法appkey

    问题描述:

    怪异的异常,报错快应用appkey错误,问题只出现过一次,具体原因有待究查。

    get token error: {“reason”:“OK”,“returnCode”:{“code”:14,“message”:“Invalid App Key”},“statusCode”:200} at com.oppo.push.server.Auth.getAuthResultWithRetry(Auth.java:55) at com.oppo.push.server.Auth.getAuthResult(Auth.java:33) at com.oppo.push.server.Sender.setToken(Sender.java:56) at com.oppo.push.server.Sender.(Sender.java:49) at com.to8to.tbt.msc.service.push.impl.OppoQuickAppPushProvider.initMsgProvider(OppoQuickAppPushProvider.java:86) at com.to8to.tbt.msc.service.push.impl.OppoQuickAppPushProvider.singlePush(OppoQuickAppPushProvider.java:70) at com.to8to.tbt.msc.service.impl.QuickAppMsgPushServiceImpl.lambda$asyncSinglePush 8 ( Q u i c k A p p M s g P u s h S e r v i c e I m p l . j a v a : 113 ) a t c o m . t o 8 t o . t b t . m s c . s e r v i c e . i m p l . Q u i c k A p p M s g P u s h S e r v i c e I m p l 8(QuickAppMsgPushServiceImpl.java:113) at com.to8to.tbt.msc.service.impl.QuickAppMsgPushServiceImpl 8(QuickAppMsgPushServiceImpl.java:113)atcom.to8to.tbt.msc.service.impl.QuickAppMsgPushServiceImpl$Lambda$1073/1325208402.call(Unknown Source) at java.util.concurrent.FutureTask

    解决方式:

    获取token报错非法appKey。对异常进行捕捉,打印warn日志,抛出rpc业务异常。重现与oppo技术支持沟通

    三、消息推送结果统计

    1、回执与自主调用统计接口

    1-1厂商的统计方式分析

    oppo、vivo、小米均有callback回执接口以及可自定义回执参数进行回传,这样方便统计,以下是每个厂商推送获取统计数据方式以及特点:

    1、vivo单推不支持自主去获得消息的统计信息,只支持批量和全推去主动调厂商接口获得统计信息,单推支持回执,批量不支持回执。那么vivo的单推到达数统计采用回执方式,而批量全推可采取调用vivo统计接口自主统计的方式。

    2、oppo支持当天所有信息送达量的查询,但不支持不同的标识给予区分不同类型消息的送达量统计。oppo支持单推、群推的回执。

    3、小米需要维护厂商生成在返回结果中消息id与自己所生成消息id的关系,通过厂商生成在返回结果中消息id去查询统计信息。小米可以使用厂商回执统计单推、批量全推送达量与点击量。

    4、华为不支持消息回执以及自主去统计查询。那么华为推送总量替代华为送达量。

    1-2厂商的统计方式对比

    厂商回执
    厂商单推群推点击量统计送达量统计
    oppo支持支持不支持支持
    vivo支持不支持不支持支持
    小米支持支持支持支持
    华为不支持不支持不支持支持
    自主调用厂商统计接口
    厂商单推群推点击量统计送达量统计
    oppo不支持不支持不支持支持
    vivo支持支持支持支持
    小米支持支持支持支持
    华为不支持不支持不支持不支持

    1-3 push选择的统计方式

    厂商单推群推
    oppo回执统计(送达量)回执统计(送达量)
    vivo回执统计(送达量)自主调厂商接口统计(厂商点击量、送达量)
    小米回执统计(厂商点击量、送达量)回执统计(厂商点击量、送达量)
    华为推送总量替代送达量
    厂商实际点击量
    oppo、vivo小米、华为用户点击链接,前端调用java接口回传msgId参数进行统计

    2、推送结果统计的实现

    2-1消息统计时序图

    在这里插入图片描述

    2-2 实现逻辑描述

    1、php为全推(定时消息)或者单推(延迟消息)生成bizMsgId,

    传递给java后端。

    2、java生成维护msgId:

    2-1根据bizMsgId查询数据库是否存在记录,存在则取出关联的msgId。不存在记录,则根据(时间戳毫秒+厂商编号+url+随机数)的md5加密值。

    2-2 Java后端给各个厂商推送设置厂商回执url,以及将msgId绑定在厂商回执透传参数字段进行消息推送。

    3、Java推送完成后便在数据库表push_msg_result新增msgid、推送总量的

    每个厂商为一条记录。

    其中华为送达数设置为华为推送总量。

    在数据库表push_msg_reslut_key新增msgId_provider的4条记录代表

    4个厂商redis存储key的前缀,其中,vivo在表中provider_msg_mark存储taskId。

    4、各厂商回执到对应接口进行送达量、厂商点击量统计。(写入redis,适应单推一条msgId消息可能长时间推送,过期时间每次更新为消息离线时间3天)

    5、前端回执到对应接口进行对应厂商点击量统计。(写入redis,过期时间每次更新为消息离线时间3天,定时每一小时进行数据库表送达量的更新)

    6、定时任务调用vivo厂商统计接口,根据vivo全推消息构建的taskId去查询批量全推的统计值更新到redis,同时将redis各厂商点击数、到达数、实际点击数值更新到数据库。

    7、根据msgId将各厂商,点击量、送达量求和返回给php管理后台。

    2-3从redis更新到数据库逻辑描述

    1、push_msg_reslut_key表查找所有redis key的消息前缀记录。

    2、根据redis key前缀拼接厂商点击量、送达量、实际点击量后缀标识,查询redis是否存在记录 , 若实际点击量与送达量记录都不存在,则将该前缀从push_msg_reslut_key表中删除

    3、将redis中的值根据前缀(msgId与厂商编号标识provider),更新到厂商统计表中

    3、统计的数据结构使用

    3-1送达数统计

    对于送达数这种大数据量的统计实现。采用hyperloglog数据结构进行基数计数统计,特点为: 高级不精确去重的数据结构,(一般是超过一百个就开始不准确了)占用空间小(一个键最多12k,可以计算2^64个元素)。统计错误率约为0.81%。

    3-2点击数统计

    对于点击数这种数据量可观的统计实现。采用set集合,对点击内容链接的设备id设置到set集合保存实现去重。同时设置set的大小上限,对接口攻击刷数据的场景达到点击数统计上限后预警通知。

    展开全文
  • 好久没有写过博客啦,今天就由本菜鸟给大家做一个简单的IOSApp消息推送教程吧!一切从0开始,包括XCode6, IOS8, 以及苹果开发者中心最新如何注册应用...Provider是给你手机应用发出推送消息的服务器,而APNS(Apple Pu
  • 应用消息推送应用消息推送需要在企业微信中创建一个第三方应用, 群聊机器人消息推送:群聊机器人消息推送需要在你已有的企业群中添加一个机器人,然后获取相应的机器人key, Result 下面是部分项目演示效果: ...
  • 主要介绍了iOS 点击推送消息跳到应用指定页面的实例的相关资料,需要的朋友可以参考下
  • 一、消息推送原理: 在实现消息推送之前先提及几个于推送相关概念,如下图1-1: 1、Provider:就是为指定IOS设备应用程序提供Push的服务器,(如果IOS设备的应用程序是客户端的话,那么Provider可以理解为服务端...
  • 感觉实现第三方应用推送功能还是比较简单的.官方文档写的也非常的明确. 学习内容: 1.使用个推实现第三方应用推送. 所有的配置我最后会给一个源代码,内部有相关的配置和文档来帮助大家完成配置,在这里就不进行...
  • 只集成了极光消息推送(极光消息推送接入参考官方文档,经过跟需求沟通,采用消息推送调起通话接听界面。再集成腾讯实时音视频SDK(具体集成方式参考官方文档)。最终实现类似微信1对1通话功能。 3、技术实现: A:...
  • 为了适应实际应用中对信息获取及时性,耗电量,以及网络环境等方面的需求,需要用推送的方式取代传统拉取的方式来进行消息的传递,MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)就是专为这种情况所...
  • 主要介绍了Flutter应用集成极光推送的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 主要介绍了百度实时推送api接口应用示例,非常的实用,有需要的朋友可以参考下
  • java开发小程序和微信消息推送后台

    千人学习 2019-04-12 16:26:16
    本课程将带领大家使用java实现微信公号和小程序的推送功能。 本节课你能学到以下知识点 1, 实战入门java后台的开发 2,学会springboot 3,微信公号模版推送功能的实现 4,小程序推送的实现 5,入门小程序开发 6,...
  • 基于MQTT的安卓消息推送php服务端源码+安卓端源码
  • 基于腾讯云Serverless实现的企业微信应用消息推送服务 Serverless 云函数目前每月有免费资源使用量40万GBs、免费调用次数100万次 API网关目前开通即送时长12个月100万次免费额度 个人或者低频率使用完全够了,可以...
  • 在用安卓设备时,经常会应用到弹出推送消息。下面在此把我之前写的推送代码分享给大家,供大家参考,有不同见解的朋友欢迎提出,共同学习进步! 最近搜索看这个的朋友比较多。这个也只是单独的内置推送。时时推送与...
  • 消息推送应用场景与解决方案

    千次阅读 2019-03-15 13:27:20
    在用户未打开App时,App主动向用户推送服务器最新消息。如下图: 消息推送的本质是:App将服务器更新的信息推送给用户 2.作用 产品的角度:功能需要,比如说资讯类产品的新闻推送、工具类产品的公告推送...

    1.定义

    在用户未打开App时,App主动向用户推送服务器最新消息。如下图:

     

     

     

    消息推送的本质是:App将服务器更新的信息推送给用户

    2.作用

    • 产品的角度:功能需要,比如说资讯类产品的新闻推送、工具类产品的公告推送等等
    • 运营的角度:活动运营需要,比如说电商类产品的促销活动;召回用户 / 提高活跃度等等

    作为开发者,不要有需求就接,应该多思考、多理解用户 / 功能的使用场景,有助于我们更好地去选择合适的开发方式

    3.储备知识

    3.1 操作系统有自身的消息推送功能(系统级别)

    • 系统级别:任何时候都可以推送给用户,且不会被系统杀死
    • Android的消息推送服务称为:C2DM(Cloud to Device Messaging)

      将在下面详细描述

    3.2 推送的本质与原理

    • 消息推送的本质是:App将服务器更新的信息推送给用户,即App获取服务器信息,再推送给用户

    • App从服务器获取最新消息有两种基本方式(原理):Push和Pull

      1. 主动获取方式(Pull)
        客户端隔固定时间主动向服务器获取信息,看是否有更新的信息;若有更新信息,则发送到客户端

      2. 被动接受方式(Push)
        当服务器有更新信息时主动发送到客户端

    • 对比:Push方式比Pull方式更优越。因为采用Pull方式时客户端需要不停地去监测服务器的变化,更费客户端的资源(CPU资源、网络流量、系统电量)

    4. 解决方案

    经总结,Android中实现消息推送的有7种主流解决方案,接下来将一一介绍。

    4.1 C2DM

    • 定义:Cloud to Device Messaging,云端推送

      Android系统级别的消息推送服务-Google出品

    • 原理:基于Push方式,C2DM服务负责处理诸如消息排队等事务,并向运行于目标设备上的应用程序分发这些消息。如下图:

     

    C2DM原理

     

    • 优点:C2DM提供了一个简单的、轻量级的机制,允许服务器可以通知移动应用程序直接与服务器进行通信,以便于从服务器获取应用程序更新和用户数据。
    • 缺点:
      1. 依赖于Google官方提供的C2DM服务器,但在国内使用Google服务需要翻墙,成本较大;
      2. 需要用户手机安装Google服务。但由于Android机型、系统的碎片化 & 国内环境,国内的Android系统都自动去除Google服务,假如要使用C2DM服务,这意味着用户还得去安装Google服务,成本较大。

    4.2 轮询

    • 原理:基于Pull方式,应用程序隔固定时间主动与服务器进行连接并查询是否有新的消息
    • 缺点:
      1. 成本大,需要自己实现与服务器之间的通信,例如消息排队等;
      2. 到达率不确定,考虑轮询的频率:太低可能导致消息的延迟;太高,更费客户端的资源(CPU资源、网络流量、系统电量)和服务器资源(网络带宽)

    4.3 SMS

    • 定义:短信发送
    • 原理:基于Push方式,通过拦截SMS消息并且解析消息内容来了解服务器的意图,并获取其显示内容进行处理。
    • 优点:可实现完全的实时操作
    • 缺点:成本相对较高。因为目前来说,很难找到免费的短消息发送网关来实现这种方案,只能通过向运营商缴纳相应的短信费用

    4.4 MQTT协议

    • 定义:轻量级的消息发布/订阅协议
    • 原理:基于Push方式,wmqtt.jar 是IBM提供的MQTT协议的实现,原理如下图:

     

    MQTT协议原理

     

    更多关于MQTT协议:

    1. 项目实例源
    2. 一个采用PHP书写的服务器端
    3. Jar包下载地址,并加入自己的Android应用程序中。
    4. 拓展:RSMB是从MQTT协议引申出来的另外一种解决方案:简单的MQTT代理,详情请点击

    4.5 XMPP协议

    • 定义:Extensible Messageing and Presence Protocol,可扩展消息与存在协议,是基于可扩展标记语言(XML)的协议,是目前主流的四种IM协议之一

      其他三种:

      • 即时信息和空间协议(IMPP)
      • 空间和即时信息协议(PRIM)
      • 即时通讯和空间平衡扩充的进程开始协议SIP(SIMPLE)
    • 原理:XMPP中定义了三个角色,分别是客户端、服务器和网关
      客户端

      1. 通过 TCP/IP与XMPP 服务器连接,然后在之上传输与即时通讯相关的指令(XML);
      2. 解析组织好的 XML 信息包;
      3. 理解消息数据类型。
        • XMPP的核心:XML流传输协议(在网络上分片断发送XML的流协议),也是即时通讯指令的传递基础,即XMPP用TCP传的是XML流
        1. 与即时通讯相关的指令,在以前要么用2进制的形式发送(比如QQ),要么用纯文本指令加空格加参数加换行符的方式发送(比如MSN)。
        2. XMPP传输的即时通讯指令的逻辑与以往相仿,只是协议的形式变成了XML格式的纯文本。

      服务器

      1. 监听客户端连接,并直接与客户端应用程序通信(客户端信息记录)
      2. 与其他 XMPP 服务器通信;

      网关:与异构即时通信系统进行通信

      异构系统包括SMS(短信),MSN,ICQ等

    通信能够在这三者的任意两个之间双向发生。

    原理流程

     

    原理流程

     

    • 优点:

      1. 开源:可通过修改其源代码来适应我们的应用程序。
      2. 简单:XML易于解析和阅读;将复杂性从客户端转移到了服务器端
      3. 可拓展性强:继承了在XML环境中灵活的发展性,可进一步对协议进行扩展,实现更为完善的功能。

        GTalk、QQ、IM等都用这个协议

    • 缺点:如果将消息从服务器上推送出去,则不管消息是否成功到达客户端手机上。

    • 源码实例:有一个很棒的基于XMPP协议的java开源Android push notification:Androidpn项目地址,大家有兴趣可以去看看

    更多关于XMPP协议更加详细请点击

    4.6 使用第三方平台

    现今主流的推送平台分为

    1. 手机厂商类:小米推送、华为推送。
    2. 第三方平台类:友盟推送、极光推送、云巴(基于MQTT)
    3. BAT大厂的平台推送:阿里云移动推送、腾讯信鸽推送、百度云推送

    具体各推送平台的优缺点请看我写的文章:Android推送:第三方消息推送平台详细解析

    4.7 自己搭建

    如果你的产品对于消息推送具备较高的功能和性能要求,同时对安全性要求非常高的话,自己搭建可能是最好的方式,但这种方式无疑成本是最高的。

    5. 总结

    展开全文
  • 该实体类提供企业微信消息推送实体类,并提供可以转化为指定json格式的方法

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 259,583
精华内容 103,833
关键字:

如何关闭应用消息推送