uniapp-安卓app消息推送uniPush2.0

384 阅读3分钟

1.项目内manifest.json文件的配置

注意:图标设置同一张图不同尺寸!

2.配置DCLOUD开发者中心

选中当前应用填入相应信息

image.png

3.厂商推送设置(华为为例)

developer.huawei.com/consumer/cn…

image.png

添加应用

image.png

分类标准(这里不配置好的话离线推送的数量会被限制)

developer.huawei.com/consumer/cn…

厂商个推文档

docs.getui.com/getui/mobil…

image.png

4.项目中集成使用云函数

1.点到项目,右键创建云开发环境,选择你购买的云服务器

2.关联你的云服务

3.右键你的云服务,选择创建云函数,随便起个名字,那个push就是我创建的云函数

4.在你的云函数中引入uni-cloud-push这个扩展模块

5.然后到你的云服务中,的云数据库中创建3张数据库表,扩展库依赖 3 张 opendb 表:opendb-tempdata,opendb-device,uni-id-device

6.到这一步就算配置的差不多了,现在来进行测试云函数,到你的创建的云函数的index.js文件执行以下代码

// 简单的使用示例  
'use strict';
const uniPush = uniCloud.getPushManager({
	appId: ""
})
exports.main = async (event) => {
	let obj = JSON.parse(event.body)
	console.log(obj)
	const res = await uniPush.sendMessage({
		"push_clientid": obj.cids, // 设备id,支持多个以数组的形式指定多个设备,如["cid-1","cid-2"],数组长度不大于1000  
		"title": obj.title, // 标题  
		"content": obj.content, // 内容  
		"payload": obj.data, // 数据  
		"force_notification": true, // 服务端推送 需要加这一句  
		"request_id": obj.request_id, //请求唯一标识号,10-32位之间;如果request_id重复,会导致消息丢失 
		"options": obj.options

	})
	return res
};

7.上传并允许该云函数

8.此时无论app在线还是离线都可以测试并获取到消息,是内置的云函数帮我们完成功能,如果这一步出错的话,可以到云服务器查看云函数的日志

云函数每次修改后都需要上传部署

// 简单的使用示例  
'use strict';
const uniPush = uniCloud.getPushManager({
	appId: ""
})
exports.main = async (event) => {
	let obj = JSON.parse(event.body)
	console.log(obj)
	const res = await uniPush.sendMessage({
		"push_clientid": obj.cids, // 设备id,支持多个以数组的形式指定多个设备,如["cid-1","cid-2"],数组长度不大于1000  
		"title": obj.title, // 标题  
		"content": obj.content, // 内容  
		"payload": obj.data, // 数据  
		"force_notification": true, // 服务端推送 需要加这一句  
		"request_id": obj.request_id, //请求唯一标识号,10-32位之间;如果request_id重复,会导致消息丢失 
		"options": obj.options

	})
	return res
};

ApiFox中测试接口

// 云函数url


{  
"cids": "",  
"title": "消息提醒2",  
"content": "未来三天降雨大暴雨!", 
"options": {  
"HW": {  
"/message/android/category": "WORK"  
}  
},      
"request_id": "211231121232332123132231221111"  
}

5.测试接口通,打包app app在线离线都可以显示弹窗

弹窗权限提醒,复制代码放到app.vue中即可。

// 消息提醒数量
		clearBadge() {
			plus.runtime.setBadgeNumber(0);
		},
		// 消息提醒通知权限
		setPermissions() {
			// #ifdef APP-PLUS
			if (plus.os.name == 'Android') {
				// 判断是Android
				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) {
					uni.showModal({
						title: '通知权限开启提醒',
						content: '您还没有开启通知权限,无法接受到消息通知,请前往设置!',
						showCancel: false,
						confirmText: '去设置',
						success: function (res) {
							if (res.confirm) {
								var Intent = plus.android.importClass('android.content.Intent');
								var Build = plus.android.importClass('android.os.Build');
								//android 8.0引导
								if (Build.VERSION.SDK_INT >= 26) {
									var 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
									var 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);
									var uri = Uri.fromParts('package', mainActivity.getPackageName(), null);
									intent.setData(uri);
								}
								// 跳转到该应用的系统通知设置页
								main.startActivity(intent);
							}
						}
					});
				}
			} else if (plus.os.name == 'iOS') {
				// 判断是ISO
				var isOn = undefined;
				var types = 0;
				var app = plus.ios.invoke('UIApplication', 'sharedApplication');
				var settings = plus.ios.invoke(app, 'currentUserNotificationSettings');
				if (settings) {
					types = settings.plusGetAttribute('types');
					plus.ios.deleteObject(settings);
				} else {
					types = plus.ios.invoke(app, 'enabledRemoteNotificationTypes');
				}
				plus.ios.deleteObject(app);
				isOn = 0 != types;
				if (isOn == false) {
					uni.showModal({
						title: '通知权限开启提醒',
						content: '您还没有开启通知权限,无法接受到消息通知,请前往设置!',
						showCancel: false,
						confirmText: '去设置',
						success: function (res) {
							if (res.confirm) {
								var app = plus.ios.invoke('UIApplication', 'sharedApplication');
								var setting = plus.ios.invoke('NSURL', 'URLWithString:', 'app-settings:');
								plus.ios.invoke(app, 'openURL:', setting);
								plus.ios.deleteObject(setting);
								plus.ios.deleteObject(app);
							}
						}
					});
				}
			}
			// #endif
		},