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长轮询,多长时 ...
随机推荐
- CSS & JS Effect – Blue Tick Avatar
效果 难点 难题只有一个, 那就是如何把 blue tick image 定位当 avatar 的右下角. HTML <div class="avatar-wrapper"& ...
- Figma 学习笔记 – Keyboard Shortcut and Tips 小技巧
参考: 10 tips to work 10x faster in Figma 15 tips to design 15X faster in Figma | Figma Tutorial 2021 ...
- PyCharm 的一些基本设置&&常用插件&&快捷键
PyCharm一些基本设置 1.主题色彩 2.添加设置:Ctrl+鼠标滚轮上下调节字体大小 3. 中文语言包 4.翻译插件 5.快捷键
- 加快 hdfs block 块复制的参数调整
共涉及三个参数: dfs.namenode.replication.max-streams 30 => 70 dfs.namenode.replication.max-streams-hard- ...
- kaggle入门 随机森林求解Titanic
# kaggle Titanic # 导入需要的库 import pandas as pd import numpy as np import sys import sklearn import ra ...
- AntDesign-Vue Table 查询与分页
前言 之前的增删改查小 Demo 已经快要进行到最后一步了,这节的任务是将请求数据的方式改为 分页,并且增加 分页条件查询 的功能. 页面布局 <a-table :data-source=&qu ...
- USB硬件特性(速度、名称、供电)
USB传输速度 USB1.0版本,USB LS(Low Speed低速),速度1.5Mbps. USB1.1版本,USB FS(Full Speed全速),速度12Mbps. USB2.0版本,USB ...
- react -- 什么是jsx
概念:JSX 就是js和xml的缩写,表示在js代码中编写html模板结构,他是react中编写UI模板的方式 优势:html的声明式模板写法 js的可编程能力
- 0608-nn和autograd的区别
0608-nn和autograd的区别 目录 一.nn 和 autograd 的区别 二.Function 和 Module 在实际中使用的情况 pytorch完整教程目录:https://www.c ...
- css动画(仿微信聊天页面)
微信聊天框以其简洁直观的界面和流畅的交互体验而广受欢迎.本文将展示如何利用HTML和CSS技术,在自己的网页上实现类似微信的聊天框效果.我们将一步步指导您完成,让网站或应用也能拥有专业且用户友好的聊天 ...