1.项目内manifest.json文件的配置
注意:图标设置同一张图不同尺寸!
2.配置DCLOUD开发者中心
选中当前应用填入相应信息
3.厂商推送设置(华为为例)
developer.huawei.com/consumer/cn…
添加应用
分类标准(这里不配置好的话离线推送的数量会被限制)
developer.huawei.com/consumer/cn…
厂商个推文档
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
},