uniapp中unipush推送的使用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了uniapp中unipush推送的使用相关的知识,希望对你有一定的参考价值。

参考技术A

uniapp官方推送文档:UniPush使用指南 - DCloud问答

1 unipush其实就是dcloud帮你集成了个推的sdk到uniapp内部,本质是dcloud帮你做了二次封装,你不需要去个推官网集成App端的推送sdk(服务端需要去个推集成服务端的sdk,但有个大方向就是服务端一定要使用 透传模板 ),你也不需要去个推申请账号,而是直接用dcloud的账号就好了。

2 在线消息、离线消息、透传消息的区别

在线消息(推送):指App在前台或App刚退到后台但时间不长还没有被杀死进程的状态

离线消息(推送):指App根本就没有打开或App打开了又被杀死了,离线消息本质是手机厂商自己实现的手机系统级的长连接

透传消息:也叫应用内消息或自定义消息,本质是个推自己实现的长连接

1 华为手机必须用自有证书云打包才能实现离线推送

2 小米手机用云打包或自定义调试基座打包都能实现离线推送

3 oppo和vivo如果要实现离线推送,必须先上架oppo和vivo的官方应用商店才能实现离线推送

因为华为手机必须用自有证书才能实现离线推送的关系,其他小米手机,ov也就跟着统一使用自有证书来打包了

首先证书里存储的是一些用于表明开发者身份的信息,就是类似一个身份证的东西,为了证明你是你,对于App来说就是给App签名用的,一个证书可以签名多个App。

自有证书,字面意思,就是自己拥有的证书,对于uniapp来说,如果你的应用安全性不高或者根本用不到推送功能,那么你可以直接选择用dcloud的公共测试证书来打包。

只要你需要实现华为手机的离线消息推送,那么你就一定需要制作一个自有证书,只要制作一个,就可以一劳永逸。

如果你需要支持华为手机的离线推送,那么必须制作一个签名证书,一般情况下,你只要做推送功能的,不支持华为说不过去,所以别管那么多直接做一个证书就完事。

android平台签名证书(.keystore)生成指南 - DCloud问答

https://ask.dcloud.net.cn/article/35777

使用Windows电脑制作自有证书的过程中,注意记录好你的证书别名,证书私钥密码,因为打包的时候需要填写。

根据上面制作证书的文档,你可以获取到形如下面样子的两个值

sha1是需要填写在dcloud开发者后台的,sha256是需要填写在华为开放平台后台

SHA1:

29:13:A2:70:8A:97:EE:72:12:8B:61:5A:68:B0:59:43:87:58:AC:42

SHA256:

16:EC:B2:F1:DC:14:BD:2B:4E:E2:4F:03:45:74:17:84:83:D4:B7:58:96:B5:CE:86:46:E9:37:45:07:DD:BC:A8

在华为后台配置sha256的时候,复制到输入框后一定要点击右侧的蓝色小对勾,不然保存不上。

小米的配置没啥可说的,直接创建应用就可以了,然后启用一下推送,注意所有包名要写一致,把appid等相关信息复制到dcloud后台,小米的配置就完事了。

下面是华为:

华为创建应用的时候包名也要统一。

数据存储位置选中国就可以,sha256这里就填你自有证书获取到的sha256

如果找不到sha256,可能你需要点到我的项目而不是我的应用。







然后登录dcloud开发者后台

注意这里的pkgName就是包名的意思,这里把华为小米的appid等信息分别填入保存。

这里的安卓应用签名就是你自有证书的sha1值,如果你的sha1值和下面那行写的一样,那么恭喜你写错了,ios BundleId就是iOS的包名,建议安卓和iOS包名统一。

以上都配置完毕后,用透传消息来测试离线推送。

除了intent格式需要注意,其他都随便写字符串就可以。

intent:#Intent;action=android.intent.action.oppopush;launchFlags=0x14000000;component=你的包名/io.dcloud.PandoraEntry;S.UP-OL-SU=true;S.title=测试标题;S.content=测试内容;S.payload=test;end

把“你的包名”四个字改成你的包名,其他不要改。

然后你把打包好的App安装到手机上,不出意外的话,你就会收到推送了。

uniapp:3分钟搞定在线推送uni.createPushMessage,uni.onPushMessage

安卓端 在线推送功能演示:

1、dcloud后台申请开通uniPush

dcloud后台

(1):找到我的应用

(2):点进去后,各平台信息,点击新增

(3):填写包名,签名等信息

包名:就是你原生APP-云打包 时的Android包名
SHA1和SHA256:参考我的另一篇文章,详细介绍了如何生成证书,和获取证书信息链接地址
MD5:上一篇文章中使用JDK获取到SHA1和SHA256,获取不到MD5,找找资料发现说是因为JDK版本过高,降低版本后也无法解决这个问题,后来从官网了解到,获取安装包的签名,每2位中间间隔一个冒号就是md5。
所以这里参考另一篇文章,如何获取APP签名
这里需要注意:你的APP必须安装到手机中之后,在使用这个工具,才能获取到签名

获取到的签名每2位字母中间间隔一个 :就可以了。
(4):选择uniPush2.0,选择对应的项目,平台选择安卓,Android包名就是上一步填写的包名信息,会自动生成到下边2个框内

(5):添加云服务空间



测试阶段,我们就选免费试用一个月。并确认开通。(完成后需要等待10分钟左右)10分钟后,返回(4)关联云空间,并开通应用。
(6):以上内容全部完成后,消息推送 即可手动推送消息。

写到这里 uniPush 的申请开通教程已完成

2、配置manifest.json

该项目仅供测试,所以没有做离线推送(离线推送牵扯到应用上架等内容。等以后做这块内容的再来更新)

3、app.vue

(1):首先要保证我们用到的通知管理权限要开启。permission.js

import permision from "@/js_sdk/wa-permission/permission.js"
export default 
	onLaunch: function() 
		var main = plus.android.runtimeMainActivity();
			var pkName = main.getPackageName();
			var uid = main.getApplicationInfo().plusGetAttribute("uid");
			var NotificationManagerCompat = plus.android.importClass(
				"android.support.v4.app.NotificationManagerCompat"
			);
			//android.support.v4升级为androidx
			if (NotificationManagerCompat == null) 
				NotificationManagerCompat = plus.android.importClass(
					"androidx.core.app.NotificationManagerCompat"
				);
			
			var areNotificationsEnabled = NotificationManagerCompat.from(main).areNotificationsEnabled();
			// 未开通‘允许通知’权限,则弹窗提醒开通,并点击确认后,跳转到系统设置页面进行设置
			if (!areNotificationsEnabled) 
				console.log('请开启权限:通知管理-允许通知')
				uni.showModal(
					title: '权限提示',
					content: '请前往 通知管理 开启权限',
					confirmColor: '#7287EA',
					success: function(res) 
						if (res.confirm) 
							permision.gotoAppPermissionSetting() // 跳转到APP设置,用户手动开启通知权限
						 else if (res.cancel) 
							console.log('用户点击取消');
						
					
				);
			
	

(2):开始创建通知栏uni.createPushMessage
为了能够及时收到用户发来的消息,所以需要在主进程中写一个轮询,查到有新消息就创建系统通知栏

setInterval(() => 
	let session_id = uni.getStorageSync('session_id') ? uni.getStorageSync('session_id') : '';
	// console.log(session_id)
	this.$http.post("/api/Chat/msgNotify", 
		id: session_id,
	).then(res => 
		if (res.code == 1) 
			if(session_id == data.session_id)
				// 这里为什么要判断:因为当A--B进行会话,我肯定不希望B发送的消息也创建系统通知栏,
				// 进入会话页面要向本地存储session_id,离开会话页面就清除本地的session_id
				// 所以要判断,如果当前的会话id == 接口返回的会话id 则不提醒。
				return
		else
				uni.createPushMessage(
					icon:require('./static/logo58.png'),
					title:title,
					content:content,
					payload:
						// 这里地方你可以随意组合你想要的数据,uni.onPushMessage会监听到你组合的数据。
						session_id:res.data.session_id,
						page:'/pages/index/index?id='+res.data.session_id
					,
					success:(res=>
						console.log('成功创建')
					),
				)
			
		
	)
, 4000);

(3):监听通知栏被点击,当通知栏被点击后会打开APP,可以拿到上一步自己组合的数据,进行一些操作

uni.onPushMessage((res) => 
	uni.removeStorageSync('session_id');
	let url = res.data.payload.page;
	console.log('监听推送消息-----' + res)
	setTimeout(() => 
		this.$goBack(2, url)//OK=== 跳转到聊天页面
	, 1000)
)

以上内容已完成。有什么不理解欢迎给我留言-.-

以上是关于uniapp中unipush推送的使用的主要内容,如果未能解决你的问题,请参考以下文章

Uniapp的消息推送Unipush(在线离线服务端)

uniapp 消息推送

uniapp APP消息推送方案

Spring Boot 集成 个推 和 UniPush 两种消息推送方式

uniapp如何提交代码推送

Uni-app实现推送Uni-push(Android)