uni-app使用plus本地推送通知栏信息,不使用第三方个推实现消息在线统一推送、消息通知(MQTT、WebSocket、setInterval定时器)

news2024/12/23 15:08:21
  1. plus.push.createMessage()
  • 因项目一直是运行在内网,所以不支持使用uni-push等运行在公网的第三方个推渠道。
    那就只能使用plus.push.createMessage(),示例代码如下:
let content = "您有一条新的消息~";
let options = {
	"cover" : false,
	"when" : new Date(),
	'title' : "通知消息"
};
let body = {
	'id' : 'id',
	'key': "key"
}
let payload = JSON.stringify(body);
plus.push.createMessage(content, payload, options);

参数解释:
content: ( String 类型) 必选,消息显示的内容,在系统通知中心中显示的文本内容。
payload: ( String 类型 ) 可选,消息承载的数据,可根据业务逻辑自定义数据格式。
option: ( MessageOptions ) 可选 创建消息的额外参数,参考MessageOptions。
MessageOptions:JSON对象,获客户端创建本地消息的参数:
① title: (String 类型 )推送消息的标题。
② sound: (String 类型 )推送消息的提示音,显示消息时的播放的提示音,可取值: “system”-表示使用系统通知提示音; “none”-表示不使用提示音; 默认值为“system”。
③ cover: (Boolean 类型 )是否覆盖上一次提示的消息。可取值true或false,true为覆盖,false不覆盖
④ when: (Date 类型 )消息上显示的提示时间。
⑤ delay: (Number 类型 )提示消息延迟显示的时间。当设备接收到推送消息后,可不立即显示,而是延迟一段时间显示,延迟时间单位为s,默认为0s,立即显示。

  • 实际开发过程中,使用MQTT或者WebSocket轮询消息通知接口,拿到数据,调用plus.push.createMessage()方法。
  1. plus.push.getAllMessage()
  • 获取所有信息
getAllMessage(){
 	return plus.push.getAllMessage();
}
  1. 获取客户端标识
plus.push.getClientInfo()
  1. 捕获点击的通知栏消息内容
plus.push.addEventListener( "click", function(msg){
	console.log( "您点击了: " + JSON.stringify(msg) );
	// TODO...
}, false); 
  1. 清空系统消息中心所有的推送消息。
plus.push.clear();
  1. 删除系统消息中心指定的推送消息,可通过getAllMessage方法获取所有的消息后进行操作。

参数:message: ( PushMessage ) 必填,要删除的消息对象,可通过getAllMessage()方法来获取消息。

plus.push.remove( message );
  1. 判断客户端是否开启通知权限
enablPermission(){
	let main = plus.android.runtimeMainActivity();
	let pkName = main.getPackageName();
	let uid = main.getApplicationInfo().plusGetAttribute("uid");
	let NotificationManagerCompat = plus.android.importClass("android.support.v4.app.NotificationManagerCompat");
	//android.support.v4升级为androidx
	if (NotificationManagerCompat == null) {
		NotificationManagerCompat = plus.android.importClass("androidx.core.app.NotificationManagerCompat");
	}
	let areNotificationsEnabled = NotificationManagerCompat.from(main).areNotificationsEnabled();
	// 未开通‘允许通知'权限,则弹窗提醒开通,并点击确认后,跳转到系统设置页面进行设置  
	if (!areNotificationsEnabled) {
		uni.showModal({
			title: '通知权限开启提醒',
			content: '您还没有开启通知权限,无法接受到消息通知,请前往设置!',
			showCancel: false,
			confirmText: '去设置',
			success: function(res) {
				if (res.confirm) {
					let Intent = plus.android.importClass('android.content.Intent');
					let Build = plus.android.importClass("android.os.Build");
					//android 8.0引导  
					if (Build.VERSION.SDK_INT >= 26) {
						let intent = new Intent('android.settings.APP_NOTIFICATION_SETTINGS');
						intent.putExtra('android.provider.extra.APP_PACKAGE', pkName);
					} else if (Build.VERSION.SDK_INT >= 21) { //android 5.0-7.0  
						let intent = new Intent('android.settings.APP_NOTIFICATION_SETTINGS');
						intent.putExtra("app_package", pkName);
						intent.putExtra("app_uid", uid);
					} else { //(<21)其他--跳转到该应用管理的详情页  
						intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
						let uri = Uri.fromParts("package", mainActivity.getPackageName(), null);
						intent.setData(uri);
					}
					// 跳转到该应用的系统通知设置页  
					main.startActivity(intent);
				}
			}
		});
	}
}
  1. 通知消息的左上角及右边图标跟随App图标配置:

注意:该图标必须为透明,不然左上角会显示一个黑块。

在这里插入图片描述

示例图片如下:

在这里插入图片描述


【补充】

若是不使用MQTT或者WebSocket等协议,只使用setInterval定时器来实现简单的消息在线通知的话,则可以参考如下示例:

    1. 登录成功后,触发获取所有未读消息接口
    1. 判断是登录时的请求,还是已经登录后使用setInterval定时器触发的请求
    1. 如果是登录时触发的请求,则把获取到的数据的length长度存在本地或者vuex,便于使用setInterval定时器时进行比对,来更新数量,进行差异的消息通知

示例代码如下(主要信息已用注释方式标出):

// 获取消息列表,刚进页面时,在钩子内触发
getAllNotice() {
	this.$Message.unread().then(({data}) => { // 请求未读信息接口,供参考
		this.messageData = data.data; // this.messageData接收获取到的数据
		if(uni.getStorageSync('unreadMsgQuantity')) { // 判断是否已经在本地存了未读数量(非第一次请求时才会走这步)
			if(uni.getStorageSync('unreadMsgQuantity') < this.messageData.length) { // 如果本地存的数据小于获取到的数据,说明接口有更新多的内容
				let showMsg = this.messageData.slice(0, this.messageData.length - uni.getStorageSync('unreadMsgQuantity')) // 只弹出多出的也就是新增的消息
				if(showMsg.length > 0) { 
					showMsg.forEach((ele)=>{ // 在安卓通知栏进行消息通知
						let body = {
							'rowId' : ele.rowId,
						}
						let payload = JSON.stringify(body);
						let options = {
							"cover" : false, // true:覆盖上次,只保留最后一个
							"when" : new Date(),
							'title' : "通知消息"
						};
						// 发送消息通知
						plus.push.createMessage(ele.content, payload, options);
					})
				}
			}
			// 在本地更新最新的数量
			uni.setStorageSync('unreadMsgQuantity', this.messageData.length);
		} else { // 第一次登陆时走的这步
			if(this.messageData.length > 0) {
				uni.setStorageSync('unreadMsgQuantity', this.messageData.length); // 获取到所有的未读信息进行存储
				this.messageData.forEach((ele)=>{ // 在安卓通知栏进行消息通知
					let body = {
						'rowId' : ele.rowId,
					}
					let payload = JSON.stringify(body);
					let options = {
						"cover" : false, // true:覆盖上次,只保留最后一个
						"when" : new Date(),
						'title' : "通知消息"
					};
					// 发送消息通知
					plus.push.createMessage(ele.content, payload, options);
				})
			}
		}
		this.getSetIntervalData(); // 触发定时器
	});
},
// 定时器函数
getSetIntervalData() {
	setInterval(this.getAllNotice, 30 * 1000);
},
// 最后记得清除定时器(clearInterval),清除本地存储(uni.removeStorageSync('unreadMsgQuantity'))
    1. 点击通知栏消息进入到对应页面

示例代码如下(主要信息已用注释方式标出):

// 安卓通知栏提醒显示,可放在app.vue--methods里
androidNoticeBar() {
	// 捕获点击的通知栏消息内容
	plus.push.addEventListener( "click", function(msg){
		const page=getCurrentPages()
		let nowPage=page[page.length - 1].route // 获取点击消息时,当前所在的页面
		if(nowPage.indexOf('notice-page')>-1){ // 已经在消息页面时,禁止跳转
			return;
		}
		if(uni.getStorageSync('token')) {
			uni.navigateTo({ // 登陆成功后,点击消息跳转到消息列表页
				url:'../notice-page/index'
			});
		} else {
			console.log('token缺失'); // 跳转到登录页
		}
	}, false); 
},

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/747619.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

玩转CSS基础:CSS盒模型

CSS盒模型 什么是CSS盒模型&#xff1f; 完整的 CSS 盒模型应用于块级盒子&#xff0c;内联盒子只使用盒模型中定义的部分内容。模型定义了盒的每个部分 —— margin, border, padding, and content &#xff0c;合在一起就是在页面上看到的内容。为了增加一些额外的复杂性&a…

操作系统Linuxday04

Linux用户相关 Linux是多用户多任务&#xff0c;可以支持多个用户同时登录&#xff0c;并且多个用户可以执行不同的任务&#xff0c;互不影响。 不同的用户&#xff0c;有不同的权限&#xff0c;可以完成权限以内的不同的任务 用户组 如果一次性用户太多&#xff0c;分别给…

【嵌入式Linux项目】基于Linux的全志H616开发板智能垃圾桶项目

目录 一、功能需求 二、涵盖的知识点 1、wiringPi库下的相关硬件操作函数调用 2、线程&#xff08;未使用互斥锁和条件&#xff09; 3、父子进程 4、网络编程&#xff08;socket套接字&#xff09; 5、进程间通信&#xff08;共享内存和信号量&#xff09; 三、开发环境…

[MySQL]MySQL内置函数

[MySQL]MySQL内置函数 文章目录 [MySQL]MySQL内置函数1. 日期函数2. 字符串函数3. 数学函数4. 其他函数 1. 日期函数 常用日期函数如下&#xff1a; 函数名称描述current_date()获取当前日期current_time()获取当前时间current_timestamp()获取当前时间戳now()获取当前日期时…

Redis_安装配置(2)

目录 一、安装redis 1、安装gcc依赖 2、下载并解压安装包 3、编译 4、安装 5、设置全局命令 二、启动redis 1、前台启动 2、后台启动 2.1 修改redis.conf文件 2.2 使用指定配置启动redis 2.3 kill redis的进程 3、开机启动 三、配置redis 远程访问设置 设置密码…

Magic3D: High-Resolution Text-to-3D Content Creation(高分辨率文本到3d内容创建)

Magic3D: High-Resolution Text-to-3D Content Creation&#xff08;高分辨率文本到3d内容创建&#xff09; Paper&#xff1a;https://readpaper.com/pdf-annotate/note?pdfId4738271534435532801&noteId1848084184935912192 Project&#xff1a;https://research.nvidia…

InstructGPT:语言模型的人类反馈指令对齐

论文标题&#xff1a;Training language models to follow instructions with human feedback论文链接&#xff1a;https://arxiv.org/abs/2203.02155论文来源&#xff1a;OpenAI 一、概述 大型语言模型&#xff08;Large language models&#xff0c;LLMs&#xff09;可以通过…

TortoiseGit的安装和使用

1、TortoiseGit的下载安装 安装说明:因为TortoiseGit 只是一个程序壳,必须依赖一个 Git Core,所以安装前请确定已完成git安装和配置。 TortoiseGit下载地址 https://download.tortoisegit.org/tgit/ ,最新稳定版本2.11.0.0。 点进去下载程序包和语言包(非必须),安装时…

【网络】网络基础(一)

目录 一、网络协议初识 1、协议分层 2、OSI七层模型 3、 TCP/IP五层(或四层)模型 4、对网络协议栈的理解 二、网络传输基本流程 1、网络传输流程图 1.1、同一个网段内的两台主机进行文件传输 1.2、跨网段的主机的文件传输 三、数据包封装和分用 四、网络中的地址管理…

配置微服务负载均衡的两种方式

说明&#xff1a;在微服务开发中&#xff0c;每个服务是通过服务名称来区分的&#xff0c;当两个微服务名称相同时&#xff0c;注册中心会视为这两个服务是相同的。配置对应的负载均衡策略&#xff0c;当其他服务发送请求过来的时&#xff0c;可以对这两个微服务进行规则访问。…

Linux的起源

UNIX 与 Linux 之间的关系是一个很有意思的话题。在目前主流的服务器端操作系统中&#xff0c;UNIX 诞生于 20 世纪 60 年代末&#xff0c;Windows 诞生于 20 世纪 80 年代中期&#xff0c;Linux 诞生于 20 世纪 90 年代初&#xff0c;可以说 UNIX 是操作系统中的"老大哥&…

Prompt本质解密及Evaluation实战与源码解析(二)

9.4 Evaluation for Agents源码解析 如图9-4所示,转过来,我们再看一下LangChain框架代理评估(Evaluation for Agents)的源代码。 图9- 4 LangChain的evaluation agents目录 在trajectory_eval_prompt.py文件里面,写了一个非常经典的提示词。 1. """提示…

抽象轻松有点使用的JavaScript

数据类型转换 定义概念&#xff1a;将一种数据类型通过用特定的方法转换成另一种数据类型 拆分&#xff1a; 数据类型转换 A1&#xff08;一种数据类型&#xff09; A2&#xff08;方法&#xff09; A3&#xff08;转换成另一种数据类型&#xff09; 理解&#xff1a;A1 &…

使用STM32 再实现电动车防盗钥匙扣

实现目标 1. 点击遥控器 A 按键&#xff0c;系统进入警戒模式&#xff0c;一旦检测到震动&#xff08;小偷偷车&#xff09;&#xff0c;则喇叭发出声响报警 2. 点击遥控器 B 按键&#xff0c;系统退出警戒模式&#xff0c;再怎么摇晃系统都不会报警 硬件介绍 1. 震动传感器…

安装orcle报错:指定的 Oracle 系统标识符 (SID) 已在使用

安装orcle报错&#xff1a;[INS-35075]指定的 Oracle 系统标识符 (SID) 已在使用 说明前面的orcle没有彻底删除 解决这个问题&#xff1a; 搜索框 —— > 输入&#xff1a;regedit ——> 回车 运行regedit&#xff0c;选择HKEY_LOCAL_MACHINE SOFTWARE ORACLE&#xff…

【Android】从零搭建组件化项目

组件化系列文章介绍的内容稍微多了点&#xff0c;本着研究透这玩意的精神&#xff0c;从组件化的简介开始说起。 目录 简介组件化、模块化与插件化开始创建配置共享文件打包模式配置APT与JavaPoet 简介 什么是组件化&#xff1f; 将多个功能模板拆分、重组的过程。 为什么要使…

GEE入门学习,遥感云大数据分析、管理与可视化以及在林业应用丨灾害、水体与湿地领域应用丨GPT模型应用

目录 ①海量遥感数据处理与GEE云计算技术实践应用 ②GPT模型支持下的Python-GEE遥感云大数据分析、管理与可视化技术及多领域案例实践应用 ③GEE遥感云大数据林业应用典型案例实践及GPT模型应用 ④遥感云大数据在灾害、水体与湿地领域典型案例实践及GPT模型应用 ①海量遥感…

78. 左旋转字符串

目录 链接&#xff1a; 题目&#xff1a; 思路&#xff1a; 代码&#xff1a; 图片&#xff1a; 链接&#xff1a; 原题链接 题目&#xff1a; 字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。 请定义一个函数实现字符串左旋转操作的功能。 比如输入字…

Talk预告 | 天津大学博士生赵煜:从平面图像中理解空间语义 - 视觉空间位置描述

本期为TechBeat人工智能社区第512期线上Talk&#xff01; 北京时间7月12日(周三)20:00&#xff0c; 天津大学博士生—赵煜的Talk将准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “从平面图像中理解空间语义-视觉空间位置描述”&#xff0c;届时将与大家…

webpack插件安装

webpack插件安装 1、html-webpack-plugin插件2 、css-loader和style-loader插件3、less-load插件 1、html-webpack-plugin插件 1、下载插件 yarn add html-webpack-plugin -D2、webpack.config.js添加配置 *const HtmlWebpackPlugin require(html-webpack-plugin); const p…