首先需要了解的:
- uni-push2统一推送 | uni-app官网【如何通过云函数去进行消息推送,1.0也需要了解】
- 使用场景 | uniCloud 【云函数url化】
- 开发者中心 【配置各厂商证书,通过开发者后台测试推送】
- uni-push2.0 常见问题 - DCloud问答 【涉及到最多的应该是获取cid的状态】
-
开发者中心 【检查cid状态】
- 开通 | uni-app官网 【设置推送图标--需要在正式包上测试,真机(基座)测试可能不太行】
-
uniCloud 【各厂商消息推送的参数】
-
厂商通道限额&QPS说明-个推文档中心 【各厂商消息推送的限制的说明】
由于业务需要在管理后台进行相应的配置,然后进行消息推送,也就是说要服务端配合,所以就需要uniapp云函数的url。
云函数编写起来其实也就是普通的js,要查看云函数打印的语句或者参数什么的,要去云控制台进行查看:
在云函数列表中,找到你自己创建的云函数;
下面这篇文章介绍的也算详细,十有八九都有:
unipush2.0实现APP消息推送(1)_unipush.sendmessage-CSDN博客
创建云函数的例子:
// 简单的使用示例
'use strict';
const uniPush = uniCloud.getPushManager({
// 换成自己小程序的appid,应该manifest.json中找到,hbuilderx创建的项目应该好找一点
appId: 'xxx',
});
function getRandomString(minLength, maxLength) {
const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
const charactersLength = characters.length;
const length = Math.floor(Math.random() * (maxLength - minLength + 1)) + minLength;
let result = '';
for (let i = 0; i < length; i++) {
result += characters.charAt(Math.floor(Math.random() * charactersLength));
}
return result;
}
//注意这里需要传入你的应用appId,用于指定接收消息的客户端
exports.main = async (event, context) => {
console.log('推送事件', event.body);
const obj = JSON.parse(event.body);
const newData = {
push_clientid: obj?.push_clientid,
title: obj?.title,
content: obj?.content,
platform: obj?.platform,
payload: obj?.payload,
badge: Number(obj?.badge) >= 0 ? obj?.badge : '+0',
// 这些可以前端自己写死
settings: {
ttl: 3600000,
},
options: {
// 小米消息分类相关分类
XM: {
// 这是一个实例 换成自己实际申请的
'/extra.channel_id': '1230xx',
},
},
// 服务端(云函数)创建消息推送(离线的--通知栏消息),一定要带上这个属性
force_notification: true,
request_id: new Date().valueOf() + '',
};
console.log('拼装的数据', newData);
const data = await uniPush.sendMessage(newData);
console.log('data的数据', data);
if (data.errCode === 0 && data.errMsg === 'success') {
return {
...data,
};
} else {
return {
data,
event,
};
}
};
关于离线推送还需要注意的:
获取cid:
还有一点,虽然使用的是2.0版本的消息推送,但是获取cid还是要通过1.0的方式去实现,否则获取到的cid是有问题的,不能接收到离线推送的消息;
获取到的正确的cid的状态:
获取cid相关的代码:【建议放在app.vue中的onLaunch方法中,还有就是用户登录成功的地方】
// 获取个推id
try {
// #ifdef APP-PLUS
plus.push.getClientInfoAsync(async (info) => {
let cid = info['clientid'];
console.log('获取的手机信息', info);
const lifeData = uni.getStorageSync('lifeData') || null;
const data = await getUserCid();
console.log('获取的cid', data);
if (lifeData && cid !== data?.data?.cid) {
// 请求服务端接口
await putUserCid(cid);
}
});
// #endif
} catch (err) {
throw new Error(JSON.stringify(err));
}
点击通知栏,获取推送的信息:
在这里可以进行页面的跳转等;
经过实践,接收推送的内容时,1.0版本的方法不管用,还是使用2.0版本的方法:
uni.onPushMessage((res) => {
console.log('获取到的推送消息', res);
uni.navigateTo({
url: res?.data?.payload?.appPushPath,
fail() {
uni.switchTab({
url: res?.data?.payload?.appPushPath,
});
},
});
});
以上就是使用uni-push实现消息推送需要了解的内容以及可能遇见的坑,但愿能够帮助到可爱的你们~