uniapp uni.push消息推送,自定义音频通知

***本章介绍 uniapp app端消息推送与语音播报。包含前端代码,以及排错方案,可结合unipush开发者后台测试***

开通uniPush

1.项目中manifest.json勾选uniPush,然后在开发者后台上传证书(ios推送证书),获取将AppID等配置给到后端
2.使用plus.push.getClientInfoAsync获取cid(设备的唯一标识)

在线消息—透传消息

如果需要离线通知,需要开通厂商推送,配置厂商证书等等,这里就不说明了。不过下面的监听代码是一样的

如果只需要在Android通知可只需要使用《通知消息》,通知消息比较简单就不举例了,代码跟下面差不多。
如果需要兼容IOS就需要使用透传消息了

透传消息是通过监听receive消息。然后通过代码实现通知栏通知,音频通知的,具体代码在下面。

在这里插入图片描述

获取设备标识clientid

在应用安装后第一次运行时应该调用5+ API的plus.push.getClientInfo方法获取客户端标识,如果获取的cid为空,说明客户端向推送服务器注册还未完成,可以使用setTimeout延时重试

//app.vue  onLaunch
var timer = setTimeout(function() {
				console.log("异步获取客户端推送标识信息");
				plus.push.getClientInfoAsync(function(info) {
					if (info.clientid) {
						clearInterval(timer);
						uni.setStorageSync('cid', info.clientid)
						//将cid在登录时一起传给后端,和用户信息存在数据库中。
						console.log("clientid", JSON.stringify(info.clientid));
					}
				}, function(e) {
					console.log(JSON.stringify(e));
				})

			}, 5000)

在App.vue中 onLaunch监听

//消息点击事件
plus.push.addEventListener('click', function(msg){
		//以下就根据传递的参数进行逻辑处理
		console.log("传递的参数", msg)
					var paymsg = msg.payload;
					if (msg.payload != '[]') {
						if (paymsg.id) {
							uni.navigateTo({
								url: '/pages/taskDetail/taskDetail?id=' + paymsg.id
							})
						}
					} else {
						uni.switchTab({
							url: '/pages/index/index'
						})
					}
}, false)
//监听透传消息
plus.push.addEventListener("receive", function(msg){
				console.log("receive", msg);
				// 增加非空判断  否则ios闪退
				if (msg.content != null && msg.content != '') {
					
					//震动   用于判断是否成功监听,如果监听成功再往下播放自定义音频,创建通知栏
					//如果没有监听到,往下看,下面有排查错误的流程
					plus.device.vibrate(500);
					console.log("(receive):" + JSON.stringify(msg));
					// 播放自定义音频
					if (msg.payload.is_mp3 == 1) {
						const innerAudioContext = uni.createInnerAudioContext();
						innerAudioContext.autoplay = true;
						innerAudioContext.src = 'https://sharefs.ali.kugou.com/202111021443/4601cd16d38f85c4d29024c15f598c47/KGTX/CLTX001/73c33edac3740e80feceb3da50ed0fd5.mp3';
						innerAudioContext.onPlay(() => {
							console.log('开始播放');
						});
						innerAudioContext.onError((res) => {
							console.log(res.errMsg);
							console.log(res.errCode);
						});
					}
					//通知栏参数
					let options = {
						"cover": false,
						"sound": 'system',
						"title":msg.title
					};
					//创建通知栏消息
					plus.push.createMessage(msg.payload.content, msg.payload, JSON.parse(JSON.stringify(
				options)));
	}
},false)

后台发送消息测试

{"title":"Hello H5+ Test","content":"test content"}

结果1

有震动,说明消息推送成功 ,receive监听到了,但是没有出现通知? 从下面方案排查

1.应用消息消息通知权限没开

通知权限判断 跳转开通

// 判断是否开启消息推送
function PermissionPush(){
let platform = uni.getSystemInfoSync().platform
			if (platform == 'ios') {
				//ios默认会有通知 不需要手动设置
				console.log('我是iOS')
			} else if (platform == 'android') {
				console.log('我是安卓')
				/* 获取当前手机是否有通知权限 */
				// #ifdef APP-PLUS
				
				// let main = plus.android.runtimeMainActivity();
				// let pkName = main.getPackageName();
				// console.log("是否有通知权限pkName",pkName);
				// let NotificationManagerCompat = plus.android.importClass("android.support.v4.app.NotificationManagerCompat");
				// 	console.log("是否有通知权限NotificationManagerCompat",NotificationManagerCompat);
				// let packageNames = NotificationManagerCompat.from(main);
				
				var main = plus.android.runtimeMainActivity();
				var NotificationManagerCompat = plus.android.importClass("androidx.core.app.NotificationManagerCompat");
						let packageNames = NotificationManagerCompat.from(main);
				let pkName = main.getPackageName();
				if (!packageNames.areNotificationsEnabled()) { //手机没有开启通知的权限
				uni.showModal({
					title: '通知权限',
					content: '通知权限暂未开启',
					cancelText: '暂不开启',
					confirmText: '前往开启',
					 success: function (res) {
					        if (res.confirm) {
								  console.log("没有通知权限");
								  let uid = main.getApplicationInfo().plusGetAttribute("uid");
								  let Intent = plus.android.importClass('android.content.Intent');
								  let Build = plus.android.importClass("android.os.Build");
								  let intent = '';
								  //android 8.0引导  
								  if (Build.VERSION.SDK_INT >= 26) {
								  	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  
								  	intent = new Intent('android.settings.APP_NOTIFICATION_SETTINGS');
								  	intent.putExtra("app_package", pkName);
								  	intent.putExtra("app_uid", uid);
								  } else { //(<21)其他--跳转到该应用管理的详情页
								  	let Settings = plus.android.importClass("android.provider.Settings");
								  	let Uri = plus.android.importClass("android.net.Uri");
								  	intent = new Intent();
								  	intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
								  	let uri = Uri.fromParts("package", main.getPackageName(), null);
								  	intent.setData(uri);
								  }
								  // 跳转到该应用的系统通知设置页  
								  main.startActivity(intent);
			
					        } else if (res.cancel) {
					            console.log('用户点击取消');
					        }
					    },
					fail: () => {},
					complete: () => {}
				});
				
				}
				
// #endif 

				/* 获取当前手机是否有通知权限 */
			}
}

2.plus.push.createMessage参数有问题(会导致ios闪退)
可在发送内容添加 payload字段试试 (原因不明)
参数自行查看
参考 https://www.html5plus.org/doc/zh_cn/push.html

结果2

如果连震动都没有

{“title”:“Hello H5+ Test”,“content”:“test content”}

如果连震动都没有,说明设备没有监听到,可能就是配置问题,按下面步骤排查

1.uniPush必须打自定义包或正式包
2. 获取cid不对 (如果plus.push.getClientInfoAsync 获取cid为null, 使用setTimeout循环获取,应用在服务器还未注册导致

var timer = setTimeout(function() {
				console.log("异步获取客户端推送标识信息~");
				plus.push.getClientInfoAsync(function(info) {
					if (info.clientid) {
						clearInterval(timer);
						uni.setStorageSync('cid', info.clientid)
						console.log("clientid", JSON.stringify(info.clientid));
					}
				}, function(e) {
					console.log(JSON.stringify(e));
				})

			}, 5000)

3.在unipush后台的故障排查 可根据cid查询设备信息和状态,如果没有查到设备信息,可能是应用包,证书等配置错误

如果对大伙有帮助的话,记得点个赞哦 ~ 感谢感谢!

  • 9
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
uni.showModal是uni-app框架中用于显示模态对话框的API。它可以用来展示一个带有标题、内容和按钮的对话框,并且可以根据需要自定义对话框的样式。 要自定义uni.showModal的样式,可以通过在App.vue或者页面的vue文件中添加全局样式或者局部样式来实现。以下是一种常见的自定义样式的方法: 1. 在App.vue或者页面的vue文件中,添加一个<style>标签,用于定义对话框的样式。 ```html <style> .custom-modal { background-color: #f5f5f5; border-radius: 10px; padding: 20px; } .custom-title { font-size: 18px; color: #333; margin-bottom: 10px; } .custom-content { font-size: 14px; color: #666; margin-bottom: 20px; } .custom-button { background-color: #007aff; color: #fff; border-radius: 5px; padding: 10px 20px; text-align: center; } </style> ``` 2. 在需要使用uni.showModal的地方,调用uni.showModal函数,并设置参数中的cssClass属性为自定义的样式类名。 ```javascript uni.showModal({ title: '提示', content: '这是一个自定义样式的对话框', cssClass: 'custom-modal', success: function (res) { if (res.confirm) { console.log('用户点击确定'); } else if (res.cancel) { console.log('用户点击取消'); } } }); ``` 通过以上步骤,你可以自定义uni.showModal对话框的样式。在上述示例中,我们定义了一个名为custom-modal的样式类,用于设置对话框的背景色、圆角、内边距等样式。你可以根据自己的需求修改样式类的属性。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

笑一个吧*

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值