uni-app app.vue 未收到receive 消息
uni-app app.vue 未收到receive 消息
产品分类:
uniapp/App
PC开发环境操作系统:
Windows
PC开发环境操作系统版本号:
windows11
HBuilderX类型:
正式
HBuilderX版本号:
4.64
手机系统:
Android
手机系统版本号:
Android 9.0
手机厂商:
模拟器
手机机型:
小米
页面类型:
vue
vue版本:
vue2
打包方式:
云端
项目创建方式:
HBuilderX
示例代码:
服务的php代码
public static function sendAppMsg($cid,$title,$content,$payload)
{
$url = 'https://fc-mp-b5eb8***********com/pushmsg';
$request_id = md5(base64_encode($cid . $title . $content.time()));
$data = [
"cids" => [$cid],
"title"=>$title,
"content"=>$content,
"data"=>$payload,// 字符串
"request_id"=>$request_id,
"open_url"=>"",
];
$jsonData = json_encode($data);
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true); // 使用 POST 请求
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
'Content-Length: ' . strlen($jsonData)
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonData);
$response = curl_exec($ch);
$result = json_decode($response,true);
var_dump($result);
curl_close($ch);
}
云函数代码
'use strict';
const uniPush = uniCloud.getPushManager({
appId: "__UNI__EFA6C11" // 你的应用appId
})
exports.main = async (event) => {
// event为客户端上传的参数
const body = JSON.parse(event.body)
console.log('参数',body)
// const body = event
return await uniPush.sendMessage({
"force_notification": false,// 填写true,客户端就会对在线消息自动创建“通知栏消息”,不填写则需要客户端自己处理。
"push_clientid": body.cids, // 必选 设备id,支持多个以数组的形式指定多个设备,如["cid-1","cid-2"],数组长度不大于1000
"title": body.title, //必填 通知栏显示的标题
"content": body.content, //必填 通知栏显示的内容
"payload": body.data, //可选 自定义数据
"open_url": body.open_url, //可选 需要打开外部url就填写
"request_id": body.request_id, //必填 请求唯一标识号,10-32位之间;如果request_id重复,会导致消息丢失
"badge":"+1",
// options更多参数介绍:https://doc.dcloud.net.cn/uniCloud/uni-cloud-push/options.html
"options": {
"HW": {
// 1 表示华为测试消息,华为每个应用每日可发送该测试消息500条,target_user_type 参数请勿发布至线上。
"/message/android/target_user_type": 1,
// "/message/android/category": "WORK"
},
"HO": {
//值为int 类型。1 表示测试推送,不填默认为0。荣耀每个应用每日可发送该测试消息1000条。此测试参数请勿发布至线上。
"/android/targetUserType": 1
},
"VV": {
//值为int 类型。0 表示正式推送;1 表示测试推送,不填默认为0。此 pushMode 参数请勿发布至线上。
"/pushMode": 1
},
"XM": {
//新小米消息分类下,私信公信id都必须要传,否则请求小米厂商接口会被拦截
"/extra.channel_id": "填写小米平台申请的渠道id"
}
}
})
};
app.vue代码
plus.push.addEventListener('click', function(msg) {
console.log('监听消息', msg);
});
plus.push.addEventListener("receive", function(msg) {
console.log('在线消息', msg);
});
console.log('App Launch')
uni.onPushMessage((res) => {
// 监听通知栏消息的点击
console.log("接收到消息", res)
if(res.type == 'click'){
// 如果需要跳转app内指定页面,则自己实现下方的跳转代码。
uni.navigateTo({
//页面路径示例值:/pages/pushinfo/pushinfo
url:'指定页面路径'
})
}
// 监听在线推送消息,若云函数设置了 "force_notification":true,则不会触发此 receive。
if(res.type == 'receive'){
console.log("接收到的消息内容", res.payload);
}
})
操作步骤:
服务的发送消息,app.vue 里面监听消息
预期结果:
收到receive 消息
实际结果:
未收到
bug描述:
服务端发送在线消息后,receive 没有收到消息。
更多关于uni-app app.vue 未收到receive 消息的实战教程也可以访问 https://www.itying.com/category-93-b0.html
1 回复
更多关于uni-app app.vue 未收到receive 消息的实战教程也可以访问 https://www.itying.com/category-93-b0.html
根据您提供的代码和问题描述,关于uni-app中app.vue未收到receive消息的问题,以下是可能的原因和解决方案:
-
force_notification参数影响: 在您的云函数代码中设置了
"force_notification": false
,这意味着客户端需要自己处理在线消息。但根据uniPush文档,当此参数为false时,客户端确实应该触发receive事件。 -
监听方式问题: 您同时使用了两种监听方式:
- 原生plus.push事件监听
- uni.onPushMessage统一监听 建议统一使用uni.onPushMessage方式,避免冲突。
- 厂商通道测试模式: 您在各厂商配置中都设置了测试模式(如华为的target_user_type=1),测试消息可能有数量限制或特殊要求,建议:
- 检查测试消息是否已超限额
- 尝试去掉测试模式配置
-
小米渠道ID缺失: 在XM配置中,您需要填写实际的小米渠道ID,目前是占位文本,这可能导致小米推送失败。
-
客户端初始化时机: 确保push模块已正确初始化,可以在app.vue的onLaunch中添加:
uni.getPushClientId({
success: (res) => {
console.log('客户端推送标识:', res.cid)
}
})