uniapp 消息推送
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 消息推送的更多相关文章
- uni-app + .NET 7实现微信小程序订阅消息推送
微信小程序的订阅消息是小程序的重要能力之一,为实现服务的闭环提供更优的体验.订阅消息我们应该经常见到,比如下单成功之后的服务通知,支付成功后的支付成功通知,都属于小程序的订阅消息. 本文只实现一次性订 ...
- uni消息推送
//APP.vuegetUser(){//获取客户端标识 消息推送 // #ifdef APP-PLUS var pinf = plus.push.getClientInfo(); var cid = ...
- SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=》提升)
SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=>提升,5个Demo贯彻全篇,感兴趣的玩才是真的学) 官方demo:http://www.asp.net/si ...
- 【原创分享·微信支付】C# MVC 微信支付之微信模板消息推送
微信支付之微信模板消息推送 今天我要跟大家分享的是“模板消息”的推送,这玩意呢,你说用途嘛,那还是真真的牛逼呐.原因在哪?就是因为它是依赖微信生存的呀,所以他能不 ...
- 基于SignalR的消息推送与二维码描登录实现
1 概要说明 使用微信扫描登录相信大家都不会陌生吧,二维码与手机结合产生了不同应用场景,基于二维码的应用更是比较广泛.为了满足ios.android客户端与web短信平台的结合,特开发了基于Singl ...
- C# BS消息推送 SignalR介绍(一)
1. 前言 本文是根据网上前人的总结得出的. 环境: SignalR2.x,VS2015,Win10 介绍 1)SignalR能用来持久客户端与服务端的连接,让我们便于开发一些实时的应用,例如聊天室在 ...
- iOS 之消息推送(个推)---个人小结
前言:自从上个星期开始整这个推送,弄了差不多一个星期,今天终于给整好了,因此现在来记录这段"奇妙"的旅程. 我们公司使用的消息推送是用的第三方--个推,这里不得不说一下,个推的技术 ...
- WebSocket与消息推送
B/S结构的软件项目中有时客户端需要实时的获得服务器消息,但默认HTTP协议只支持请求响应模式,这样做可以简化Web服务器,减少服务器的负担,加快响应速度,因为服务器不需要与客户端长时间建立一个通信链 ...
- 分分钟搞定IOS远程消息推送
一.引言 IOS中消息的推送有两种方式,分别是本地推送和远程推送,本地推送在http://my.oschina.net/u/2340880/blog/405491这篇博客中有详细的介绍,这里主要讨论远 ...
- 基于ajax与msmq技术的消息推送功能实现
周末在家捣鼓了一下消息推送的简单例子,其实也没什么技术含量,欢迎大伙拍砖.我设计的这个推送demo是基于ajax长轮询+msmq消息队列来实现的,具体交互过程如下图: 先说说这个ajax长轮询,多长时 ...
随机推荐
- Angular 18+ 高级教程 – 国际化 Internationalization i18n
介绍 先讲讲名词. Internationalization 的缩写是 i18n,中文叫国际化. Globalization 是 Internationalization 的同义词,都是指国际化. L ...
- Servlet——xml配置Servlet
XML配置方式编写 Servlet 步骤: 1.编写 Servlet 类 2.在 web.xml 中配置该Servlet
- flink 大批量任务提交 yarn 失败问题
问题现象 用户迁移到新集群后,反馈他们开发平台大量 flink 任务提交失败了,当时集群的 yarn 资源是足够的 排查过程 用户是在他们的开发平台上提交的,查看他们失败的任务,发现是他们提交端主动 ...
- Python计算傅里叶变换
技术背景 傅里叶变换在几乎所有计算相关领域都有可能被使用到,例如通信领域的滤波.材料领域的晶格倒易空间计算还有分子动力学中的倒易力场能量项等等.最简单的例子来说,计算周期性盒子的电势能\(k\sum_ ...
- Nacos 开启鉴权设置
Nacos 开启鉴权设置 # 开启鉴权 nacos.core.auth.enabled=true nacos.core.auth.system.type=nacos # 开启鉴权之后,你可以自定义用于 ...
- Android Qcom USB Driver学习(十)
本章主要是基于之前的学习,实现一个hidraw的驱动,发现有两种用于识别usb设备的方式,放别是usb_device_id和hid_device_id hid_probe (1)hid_device_ ...
- 2022年7月中国数据库排行榜:墨天轮榜单榜眼易主,PolarDB得分涨幅最大
信创元年,后起之秀,大有可为.2022年7月的 墨天轮中国数据库流行度排行榜 风起云涌,本月排行榜共有232个数据库参与排名,相比上月,新增 ShuangzhaoDB 数据库.榜单前十名的唯一变化是达 ...
- iOS中使用UITextView设置不同文本部分点击事件小结
最近在项目开发中遇到了设置多行文本,点击蓝色邮箱部分跳转到发邮件页面功能.当然比较简单的方式是多标签单独设置,那样稍显麻烦.我们能不能用一个控件,给某一部分添加点击事件,结果是可以的,UITextVi ...
- .Net 反射的学习
// 反射 // 一切从 type 开始 2 种拿到 type 的方式 // 作用:动态的操作对象 获取属性 方法 特性 // 1. 拿到对象的 type // typeof(类); // 2. 拿到 ...
- python多线程应用-批量下载视频课程(宠医堂)
#!/usr/bin/env python # -*- coding: UTF-8 -*- ''' @Name: cyt_record_download @IDE:PyCharm @Author:qt ...