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消息的问题,以下是可能的原因和解决方案:

  1. force_notification参数影响: 在您的云函数代码中设置了"force_notification": false,这意味着客户端需要自己处理在线消息。但根据uniPush文档,当此参数为false时,客户端确实应该触发receive事件。

  2. 监听方式问题: 您同时使用了两种监听方式:

  • 原生plus.push事件监听
  • uni.onPushMessage统一监听 建议统一使用uni.onPushMessage方式,避免冲突。
  1. 厂商通道测试模式: 您在各厂商配置中都设置了测试模式(如华为的target_user_type=1),测试消息可能有数量限制或特殊要求,建议:
  • 检查测试消息是否已超限额
  • 尝试去掉测试模式配置
  1. 小米渠道ID缺失: 在XM配置中,您需要填写实际的小米渠道ID,目前是占位文本,这可能导致小米推送失败。

  2. 客户端初始化时机: 确保push模块已正确初始化,可以在app.vue的onLaunch中添加:

uni.getPushClientId({
  success: (res) => {
    console.log('客户端推送标识:', res.cid)
  }
})
回到顶部