1.前言

  • 作为一个非原生App的开发者,对于手机系统的推送机制了解是是非有限的,只有了解清楚这些机制,后期的开发才会少踩很多坑,本文将对推送机制逻辑进行一个简单的梳理与记录

2.推送流程

  • 推送流程1.0:后台服务器 -> 推送服务器(第三方) -> 手机App
  • 推送流程2.0:后台服务器 -> uni-cloud -> 推送服务器(第三方) -> 手机App

3.推送服务器

  • 为什么后台不直接推送消息给手机App,而是要转交给第三方推送服务器呢?这里举两个例子:
  • 1.假设有一条消息需要同时推送给10000个人,那么这条消息就有10000个状态,推送成功的人将不再推送,而推送失败的人将会一直持续推送,直到成功为准,所以需要写一套专门的算法来处理这套逻辑
  • 2.消息需要推送给具体的某台手机,那么每个人就需要为每台手机分配一个独一无二的标识,根据这个标识定位到目标手机,然后才能进行推送,而给每台手机分配一个独一无二的标识,也需要一套算法
  • 3.手机App想要实时接受消息,必须开启一个专门的进程实时在线,这个内嵌在App内部的进程也需要进行开发
  • 就像淘宝卖家不会自己组建一个物流团队一样,一般的软件开发者也没必要去开发这套逻辑,第三方软件推送服务商提供专门的推送服务,无论研发能力,产品功能与稳定性都远超自己开发,需要推送时直接选择他们即可

4.推送进程

  • 想要接收推送信息,必须让对应的进程保持运行状态,这种进程分两种:App推送进程和系统进程
  • App推送进程:App集成推送功能后,就自带这个进程,这个进程会随着App的关闭而关闭,所以他能否生效取决于App是否在线运行,也就所说的"在线推送"。因为是软件内部的进程,所以他接收到信息之后,可以自由处理推送消息,例如,他可以自动创建通知栏(通知消息),也可以在软件内部无声无息的对消息进行处理(透传消息),推送的SDK可以根据消息的数据格式来区分是哪种消息(通知消息,透传消息)
  • 系统进程:集成到系统底层,由手机厂家提供,理论上手机是开机状态就不会被关闭,所以这个进程是24小时在线的,当App自己的推送进程关闭后,可以借助他进行推送,也就是所谓的离线推送,但是厂家对推送有要求(需要审核上架,一天只能推送3条等),系统进程只能通过创建通知栏的方式来通知用户有新消息,他无法与App内部直接对接,所以他只支持"推送消息",不支持"透传消息"

5.App的运行状态

  • App在线状态:第三方推送服务商的消息能正常推送
  • App离线状态:第三方推送服务商无法推送,此时再想推送必须依靠系统进程,手机厂商像小米,华为等都完成了系统级别的推送支持,但是他们各自为阵,需要每个厂家进行对接适配(框架在技术层面已经完成适配,开发者需要自己完成审核,上架等操作)
  • App现状1:为了省电,手机系统会对通常后台程序进行清理查杀,很少有App能常驻后台
  • App现状2:现在的手机系统严格控制App自启动,链式启动,App无法像之前一样通过流氓手机强制驻留后台
  • App现状3:基于上面2点,App只有在前台展示期间,或者刚退回桌面的前几分钟是在线状态,其余时间都是离线状态

6.安卓App如何保持在线状态

  • 调整App省电策略:以MIUI为例,长按App图标 => "应用信息" => "省电策略" => "无限制"
  • 允许自启动:以MIUI为例,长按App图标 => "应用信息" => "自启动" => "开启"
  • 原生安卓系统:手持pda搭载原生安卓系统,此类设备不会杀后台

7.通知消息与透传消息

  • 通知消息:在通知栏弹出消息(App自动创建),点击后启动App,App启动后可以拿到相关参数,可根据相关参数来开发对应的逻辑(页面跳转,参数传递,刷新数据等待),离线和在线状态都支持
  • 透传消息:App接收到消息后,不创建通知栏,直接在App内部进行处理,App离线状态不支持

8.通知消息与App交互(web控制台)

  • 通知消息的发送格式:推送时支持2个字段,标题(title)和内容(content)
  • 通知消息的交互行为:消息送达后在通知栏弹出通知,并展示App图标,消息标题和消息内容
  • 点击通知栏的后续行为:分3种,启动App,打开网页,打开App页面,且都会触发"click"回调,区别在于收到的参数有区别
  • 行为1.启动App:点击通知栏启动App,并触发"click"回调,回调参数只能拿到标题(title)和内容(content)
  • 行为2.打开网页:点击通知栏启动App,并触发"click"回调,回调参数只能拿到标题(title)和内容(content),并且打开目标网页
  • 行为3.打开应用内特定页面:需要设置intent(不要按官方web控制台的方法来,那个是错误的),点击后启动App,并触发"click"回调,这种方式可以获取到额外的参数"payload"
  • 监听通知栏点击的代码
plus.push.addEventListener('click', _handlePushClick)
const _handlePushClick = function(message) {
console.log('_handlePushClick',message)
}
  • 回调参数的数据格式
{
"__UUID__": "androidPushMsg170266890",
"title": "测试消息",
"appid": "__UNI__012294A",
"content": "有设备报修",
"payload": {
"title": "测试消息",
"content": "有设备报修"
}
}
  • intent的数据格式:复制下面的字串,替换关键信息即可,payload字段支持对象格式,可以携带额外参数,例如要跳转的页面路径等等特殊字符(页面路径,以/开头需要用引号包起来)
intent://io.dcloud.unipush/?#Intent;scheme=unipush;launchFlags=0x4000000;component=ponyiiot.app/io.dcloud.PandoraEntry;S.UP-OL-SU=true;S.title=测试标题;S.content=测试内容;S.payload={path:'/页面路径',mc:设备名称};end
  • 处理额外参数:给"payload"挂载额外参数用于跳转目标页面
 const _handlePushClick = function(message) {
//有path参数,进行跳转
if(message.payload.path){
uni.navigateTo({
url: message.payload.path,
fail(err){
console.log(item.name+' 跳转失败')
}
})
}
}

9.透传消息与App交互

  • 透传消息的发送格式: 格式可以自定义
  • 通知消息的交互行为:透传消息到达后触发 receive 事件,拿到自定义参数后App自由调配代码
plus.push.addEventListener('receive', _handlePushReceive)
  • 创建本地通知:接收到透传消息后,可以自由创建本地通知
//创建本地通知
plus.push.createMessage(message.content, message.payload , {title:message.title})
  • unipush官方声称符合特定格式的透传将视为通知处理,但是我个人测试无效
{"title": "xxx","content": "xxx","payload": "xxx"}

10.IOS推送

  • App在线:触发 receive 事件,不产生系统通知
  • App离线:弹出系统通知,点击触发 click 事件
  • 因IOS未做测试,以上未经过验证

uniapp 消息推送的更多相关文章

  1. uni-app + .NET 7实现微信小程序订阅消息推送

    微信小程序的订阅消息是小程序的重要能力之一,为实现服务的闭环提供更优的体验.订阅消息我们应该经常见到,比如下单成功之后的服务通知,支付成功后的支付成功通知,都属于小程序的订阅消息. 本文只实现一次性订 ...

  2. uni消息推送

    //APP.vuegetUser(){//获取客户端标识 消息推送 // #ifdef APP-PLUS var pinf = plus.push.getClientInfo(); var cid = ...

  3. SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=》提升)

     SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=>提升,5个Demo贯彻全篇,感兴趣的玩才是真的学) 官方demo:http://www.asp.net/si ...

  4. 【原创分享·微信支付】C# MVC 微信支付之微信模板消息推送

    微信支付之微信模板消息推送                    今天我要跟大家分享的是“模板消息”的推送,这玩意呢,你说用途嘛,那还是真真的牛逼呐.原因在哪?就是因为它是依赖微信生存的呀,所以他能不 ...

  5. 基于SignalR的消息推送与二维码描登录实现

    1 概要说明 使用微信扫描登录相信大家都不会陌生吧,二维码与手机结合产生了不同应用场景,基于二维码的应用更是比较广泛.为了满足ios.android客户端与web短信平台的结合,特开发了基于Singl ...

  6. C# BS消息推送 SignalR介绍(一)

    1. 前言 本文是根据网上前人的总结得出的. 环境: SignalR2.x,VS2015,Win10 介绍 1)SignalR能用来持久客户端与服务端的连接,让我们便于开发一些实时的应用,例如聊天室在 ...

  7. iOS 之消息推送(个推)---个人小结

    前言:自从上个星期开始整这个推送,弄了差不多一个星期,今天终于给整好了,因此现在来记录这段"奇妙"的旅程. 我们公司使用的消息推送是用的第三方--个推,这里不得不说一下,个推的技术 ...

  8. WebSocket与消息推送

    B/S结构的软件项目中有时客户端需要实时的获得服务器消息,但默认HTTP协议只支持请求响应模式,这样做可以简化Web服务器,减少服务器的负担,加快响应速度,因为服务器不需要与客户端长时间建立一个通信链 ...

  9. 分分钟搞定IOS远程消息推送

    一.引言 IOS中消息的推送有两种方式,分别是本地推送和远程推送,本地推送在http://my.oschina.net/u/2340880/blog/405491这篇博客中有详细的介绍,这里主要讨论远 ...

  10. 基于ajax与msmq技术的消息推送功能实现

    周末在家捣鼓了一下消息推送的简单例子,其实也没什么技术含量,欢迎大伙拍砖.我设计的这个推送demo是基于ajax长轮询+msmq消息队列来实现的,具体交互过程如下图: 先说说这个ajax长轮询,多长时 ...

随机推荐

  1. CSS & JS Effect – Image 倒影框

    效果 Step1: HTML 结构 <div class="image"> <img src="./images/img-2.png" /&g ...

  2. 图解连接阿里云(二)使用Paho-MQTT(支持FreeRTOS版本、Linux版本)连接1MQTT测试服务器 2阿里云物联网平台

    前沿提要: MQTT是什么不知道? 看这一篇:https://www.cnblogs.com/happybirthdaytoyou/p/10362336.html 阿里云官网玩不转? 看这一篇: ht ...

  3. [TK] 矩阵取数游戏<简单版> hzoi-tg-906-2

    本题是一个坐标DP问题 状态转移 首先我们注意到,一个状态只能由两种前置状态得到:取左边的数和取右边的数,因此我们以状态为阶段定义如下: \(f[a][b][c]\) 为状态转移数组,其中 \(a\) ...

  4. LeetCode 1388. Pizza With 3n Slices(3n 块披萨)(DP)

    给你一个披萨,它由 3n 块不同大小的部分组成,现在你和你的朋友们需要按照如下规则来分披萨: 你挑选 任意 一块披萨.Alice 将会挑选你所选择的披萨逆时针方向的下一块披萨.Bob 将会挑选你所选择 ...

  5. c++中的读写锁

    读写锁是一种特殊的锁机制,允许多个线程同时读取共享数据,但在写入共享数据时,只有一个线程可以进行写操作,其他线程必须等待. 这种机制对于读多写少的场景非常有效,可以提高并发性能.以下是通过 share ...

  6. Android Systrace 基础知识 -- Systrace 简介

    1. 正文 Systrace 是 Android4.1 中新增的性能数据采样和分析工具.它可帮助开发者收集 Android 关键子系统(如 SurfaceFlinger/SystemServer/Ke ...

  7. 2022年3月中国数据库排行榜:TiDB “三连降”仍霸榜首,“常胜四将军”得分集体下跌

    春暖花开好时光,三月一号迎榜来.2022年3月的 中国数据库流行度排行榜 已在墨天轮社区发布,本月共有 199个 数据库参与排名,相比上月新增四个数据库.排名前十的数据库得分均有所波动,整体排名变动略 ...

  8. 2022年7月中国数据库排行榜:墨天轮榜单榜眼易主,PolarDB得分涨幅最大

    信创元年,后起之秀,大有可为.2022年7月的 墨天轮中国数据库流行度排行榜 风起云涌,本月排行榜共有232个数据库参与排名,相比上月,新增 ShuangzhaoDB 数据库.榜单前十名的唯一变化是达 ...

  9. ES5 和 ES6 的区别,说几个 ES6 的新增方法

    ECMAscript5.,即ES5 ,表示 ECMAscript的第五次修订-2009 : ECMAscript6.,即ES6 ,表示 ECMAscript的第六次修订-2015 : ES6 是对于 ...

  10. 05-react的类组件和函数组件 -- 状态 state

    // 函数组件是无状态的 既没有数据的 类似 vue 组件中的 data 数据 // 类组件是有状态的组件 是有数据的 是双向绑定的数据 是数据驱动视图的 负责UI的视图更新 (单个组件的私有数据组件 ...