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. C# Dynamic 转换成 Dictionary,Dynamic 转换成 DataTable

    部分软件开发的时候用到了 dynamic 类型,这个类型的数据不需要做其他处理的时候非常好用,但是需要对其中的数据调整的时候就不是那么好用了,这里提供两个常见的转换方式 Dynamic To Dict ...

  2. C# – delegate, event, EventHandler

    前言 写这么多年 C#, 我从来没有写过 EventHandler. 我想应该是因为我没有用 C# 开发过前端的关系, 绝对不是我技术不行哦. 这篇就补上一个学习笔记呗. 参考 C#知识点讲解之C#d ...

  3. Figma 学习笔记 – Team Library Style and Component

    Design System 我们做设计通常会 Follow 一个 Design System, 比如 Material Guide. 里头会定义 Font, Color, Effect (Elevat ...

  4. 编写自己的简易版网络协议栈(1)--arp协议,使用wireshark抓包分析

    实验环境: 略. 实验背景:已编写好基于以太网接口的输入处理,能够解析到以太网数据包内的帧类型. 1. 协议栈底层采用轮询方式,即轮询以太网数据包. 2. 若收到数据,则交由以太网输入处理模块进行解析 ...

  5. [OI] 平衡树

    1. 二叉查找树 二叉查找树的思想和优先队列比较像,都是把若干个数据按一定规则插到一棵树里,然后就可以维护特定的信息. 在优先队列的大根堆实现里,我们让每棵子树的根节点都大于它的儿子,这样就可以保证根 ...

  6. 区分::after和:before中的单冒号和双冒号的作用

    单冒号:一般指的是伪类,如鼠标悬停状态设置样式:选择器:hover {设置样式} 双冒号一般指伪元素,给元素的前面/后面添加内容.内容数据按堆栈数据结构存储.

  7. Nacos2.3.2在ubuntu中的部署

    Nacos2.3.2 在ubuntu下的部署 下载地址 发布历史 | Nacos 官网 https://download.nacos.io/nacos-server/nacos-server-2.3. ...

  8. 云原生周刊:K8sGPT 加入 CNCF | 2024.1.8

    开源项目推荐 VolSync VolSync 使用 rsync 或 rclone 在集群之间异步复制 Kubernetes 持久卷.它还支持通过 Restic 创建持久卷的备份. KubeClarit ...

  9. Kubernetes 集群中流量暴露的几种方案

    作者:KaliArch(薛磊),某 Cloud MSP 服务商产品负责人,熟悉企业级高可用 / 高并发架构,包括混合云架构.异地灾备,熟练企业 DevOps 改造优化,熟悉 Shell/Python/ ...

  10. rsa原理及其应用

    rsa算法 0x01 原理 1.1 相关概念 RSA(Rivest-Shamir-Adleman)加密算法是一种基于数论的非实时加密算法,广泛用于安全通信.RSA算法的核心依赖于大整数分解的困难性 1 ...