参考文档
https://uniapp.dcloud.net.cn/uni-push/open.html
https://uniapp.dcloud.net.cn/unipush-v2.html
https://uniapp.dcloud.net.cn/unipush_vendor_config.html
新建并关联云服务空间
访问https://unicloud.dcloud.net.cn/,登录后新建,此处我选择的阿里云

创建后,回到dcloud,关联云空间,填好信息,点击开通应用

厂商推送配置
ios
制作推送证书,参考网址https://blog.csdn.net/qq_37004501/article/details/153678754

点击Identifiers,勾选Push Notifications


都准备好,填下面的表单

华为
访问https://developer.huawei.com/consumer/cn/service/josp/agc/index.html#/myProject,点击项目,在项目设置中添加项目,添加项目后,点击推送服务,点击开通



荣耀,小米,oppo等
参考网址https://uniapp.dcloud.net.cn/unipush_vendor_config.html
配置好,回到Hbuilderx勾选对应SDK

获取客户端推送标识
javascript
// uni-app客户端获取push客户端标记
uni.getPushClientId({
success: (res) => {
let push_clientid = res.cid
console.log('客户端推送标识:',push_clientid)
},
fail(err) {
console.log(err)
}
})
服务端推送消息
回到Hbuilderx中,给项目关联云空间,关联后,选中cloudfunctions,右键选择新建云函数

点击添加公共模块或扩展库依赖

在弹窗中勾选uni-clound-push

修改云函数的index.js文件,替换appId,然后上传云函数
javascript
// 简单的使用示例
'use strict';
const uniPush = uniCloud.getPushManager({appId:"__UNI__XXXXXX"}) //注意这里需要传入你的应用appId,用于指定接收消息的客户端
exports.main = async (event, context) => {
let obj = JSON.parse(event.body)
const res = await uniPush.sendMessage({
"push_clientid": obj.cids, // 设备id,支持多个以数组的形式指定多个设备,如["cid-1","cid-2"],数组长度不大于1000
"title": obj.title, // 标题
"content": obj.content, // 内容
"settings": obj.settings, // 消息有效期
"payload": obj.payload, // 数据
"category": obj.category, // HarmonyOS NEXT系统(纯血鸿蒙、非安卓鸿蒙)的消息分类,要给鸿蒙设备推送时才必传
"force_notification": true, //填写true,客户端就会对在线消息自动创建"通知栏消息",不填写则需要客户端自己处理。
"request_id": obj.request_id, //请求唯一标识号,10-32位之间;如果request_id重复,会导致消息丢失
"options": obj.options //消息分类,没申请可以不传这个参数
})
return res;
};
打开云函数

找到URL,使用postman发起get请求,即可收到推送消息

接口请求参数,注意request_id不要重复,重复会导致收不到推送
javascript
{
"request_id": "212320028909901190",
"title": "订单信息更新",
"content": "尊敬的司机师傅,您接的订单(订单编号:JSYC202589143,长春市摩天活力城 - 吾悦广场(绿园店))信息已被修改,请您务必仔细核对订单信息,以免产生误差。",
"settings": {
//消息有效期设置,单位毫秒,-1表示不设离线。默认是 2 小时,取值范围:-1 ~ 3 * 24 * 3600 * 1000(3天)之间
"ttl": 86400000
},
"options": {
"HW": {
// 值为int 类型。1 表示华为测试消息,华为每个应用每日可发送该测试消息500条。此 target_user_type 参数请勿发布至线上。
"/message/android/target_user_type": 1
},
"HO": {
//值为int 类型。1 表示测试推送,不填默认为0。荣耀每个应用每日可发送该测试消息1000条。此测试参数请勿发布至线上。
"/android/targetUserType": 1
},
"VV": {
//值为int 类型。0 表示正式推送;1 表示测试推送,不填默认为0。此 pushMode 参数请勿发布至线上。
"/pushMode": 1
},
"XM": {
//新小米消息分类下,无论公信私信,/extra.channel_id 都必传,否则请求小米厂商接口会被拦截导致推送失败。
"/extra.channel_id": "填写小米平台申请的渠道id"
}
},
"category": {
//HarmonyOS NEXT系统(纯血鸿蒙、非安卓鸿蒙)的消息分类,要给鸿蒙设备推送时才必传
"harmony":"MARKETING"
},
//payload是点击通知栏消息后,传给客户端click回调的自定义参数
"payload": {
"data1": "自定义",
"data2": 2
}
}
推送消息监听
javascript
//App.vue
onLaunch: function(options) {
console.log('App 启动参数:', JSON.stringify(options));
// #ifdef APP
uni.onPushMessage((res) => {
console.log("收到推送消息:", res.data.payload) //监听推送消息
const id = res.data.payload.id
//跳转对应页面
})
// #endif
}
推送权限
javascript
function getPush() {
// #ifdef APP
if (permission.isIOS) {
var UIApplication = plus.ios.import("UIApplication");
var app = UIApplication.sharedApplication();
var enabledTypes = 0;
// iOS 8 及以上版本的判断逻辑
if (app.currentUserNotificationSettings) {
var settings = app.currentUserNotificationSettings();
enabledTypes = settings.plusGetAttribute("types");
plus.ios.deleteObject(settings);
if (enabledTypes == 0) {
console.log("iOS 8+:推送权限已关闭(用户在设置里关了)");
return false;
} else {
console.log("iOS 8+:推送权限已开启");
return true;
}
} else {
// iOS 7 及以下(极少见,仅作兼容)
enabledTypes = app.enabledRemoteNotificationTypes();
if (enabledTypes == 0) {
console.log("iOS 7-:推送权限已关闭");
return false;
} else {
console.log("iOS 7-:推送权限已开启");
return true;
}
}
plus.ios.deleteObject(app);
} else {
var main = plus.android.runtimeMainActivity();
var context = main.getApplicationContext();
var NotificationManager = plus.android.importClass('android.app.NotificationManager');
var notificationManager = context.getSystemService(context.NOTIFICATION_SERVICE);
if (!notificationManager.areNotificationsEnabled()) {
showMsg('请打开手机通知功能(点击确定后在权限中授权通知功能)')
}
return notificationManager.areNotificationsEnabled()
}
// #endif
}