1***@qq.com
1***@qq.com
  • 发布:2025-07-01 12:06
  • 更新:2025-07-01 14:27
  • 阅读:83

【报Bug】plus.push.createMessage 创建本地通知 ,切换app 的进程在后台,点击通知栏的信息打不开app

分类:鸿蒙Next

产品分类: uniapp/App

PC开发环境操作系统: Windows

PC开发环境操作系统版本号: Microsoft Windows 11 专业版 10.0.26100 26100

HBuilderX类型: 正式

HBuilderX版本号: 4.24

手机系统: HarmonyOS NEXT

手机系统版本号: HarmonyOS NEXT Developer Beta2

手机厂商: 华为

手机机型: huawei mate 60

页面类型: vue

vue版本: vue3

打包方式: 云端

项目创建方式: HBuilderX

操作步骤:

plus.push.createMessage(content, JSON.stringify(msg.payload),{
cover:false,
sound:"system",
title:title
} )

预期结果:

app 进程在后台,点击通知栏打开app

实际结果:

app 进程在后台,点击通知栏打不开app

bug描述:

1.创建本地通知
plus.push.createMessage(content, JSON.stringify(msg.payload),{
cover:false,
sound:"system",
title:title
} )

2.切换app 的进程在后台,点击通知栏的信息打不开app,但是plus.push.addEventListener("click")里的方法是执行的。

手机是华为手机mate 60,版本号是4.2
后台弹窗的权限已打开

麻烦各位大神帮忙看一下,非常感谢!

2025-07-01 12:06 负责人:无 分享
已邀请:
DCloud_UNI_yuhe

DCloud_UNI_yuhe

鸿蒙上也不支持 plus 的 这个 API 啊,你使用它会有通知?

  • 1***@qq.com (作者)

    对的,可以直接生成本地通知的,但是app 进程在后台之后,我点击通知栏打开是不会打开app 的,麻烦帮忙看一下

    2025-07-01 14:39

  • DCloud_UNI_yuhe

    回复 1***@qq.com: 你提供一下完整的可以直接运行的代码我看一下

    2025-07-01 14:45

  • 1***@qq.com (作者)

    回复 DCloud_UNI_yuhe: export default {

    init: () => {

    // #ifdef APP-PLUS

    plus.push.setAutoNotification(true); //设置通知栏显示通知 //必须设置

    // 监听用户点击通知事件

    plus.push.addEventListener("click", function(msg) {

    console.log("收到点击通知事件:", JSON.stringify(msg));

    pushHandle(msg) //处理方法

    plus.push.clear(); //清空通知栏

    }, false);


        // 监听在线消息事件      
    plus.push.addEventListener("receive", function(msg) {
    console.log("收到推送消息:", JSON.stringify(msg));
    // 处理传递的参数
    if (msg.payload) {
    msg.payload=decodeURIComponent(msg.payload);
    if(typeof (msg.payload) == 'string'){
    msg.payload = JSON.parse(msg.payload);
    }
    }

    // 处理自定义格式
    let contFlag=false;
    if (msg.content&&typeof (msg.content) == 'string'&&msg.content.indexOf('title1')!=-1) {
    msg.content = JSON.parse(msg.content);
    contFlag=true;
    if(msg.content&&msg.content.payload){
    msg.content.payload = decodeURIComponent(msg.content.payload);
    }
    }

    // iOS需要创建本地通知
    if (plus.os.name=='iOS') {
    if (((msg.payload && msg.payload!=null)||(msg.content&&msg.content.title1))&&msg.type=='receive') {
    renderPush(msg);
    }
    }

    // Android处理
    if (plus.os.name=='Android') {
    if(!msg.title || !msg.content || !msg.payload||(contFlag&&msg.content&&msg.content.title1)) {
    renderPush(msg);
    } else {
    pushHandle(msg)
    }
    }
    }, false);
    // #endif
    },

    getClient: (callback) => {
    // #ifdef APP-PLUS
    var timer = setInterval(() => {
    let clientInfo = plus.push.getClientInfo(); //获取 clientID
    if (clientInfo.clientid) {
    clearInterval(timer);
    uni.setStorageSync('clientid', clientInfo.clientid);
    callback&&callback();
    }
    }, 1000);
    // #endif

    },

    }

    // 渲染通知数字

    const setBadgeNum=(num)=>{

    uni.setStorageSync('bageNumber',num);

    plus.runtime.setBadgeNumber(num);

    }

    // 渲染在通知了上

    const renderPush=(msg)=>{

    let title =msg.title;

    if(msg.content&&msg.content.title1){

    title =msg.content.title1;

    }

    let content="新消息";

    if(msg.content&&msg.content.body){

    content =msg.content.body;

    }

    let options={

    cover:false,

    sound:"system",

    title:title

    }

    try {

    let nums = uni.getStorageSync('bageNumber')||0;

    if(nums){

    nums=nums*1;

    }

    setBadgeNum(nums+1);

    plus.push.createMessage(content, JSON.stringify(msg.payload),options);


    } catch(e) {  
    console.error("创建消息失败:", e);
    }

    }


    // 處理push

    const pushHandle = (msg) => {

    if(!msg) return false;

    // 清除app角标

    setBadgeNum(0);

    // iOS的payload可能是字符串,需要解析

    if (typeof (msg.payload) == 'string') {

    try {

    msg.payload = JSON.parse(decodeURIComponent(msg.payload));

    } catch(e) {

    console.error("解析payload失败:", e);

    }

    }


    console.log("处理推送消息:", JSON.stringify(msg));  
    // 根据消息类型跳转页面
    if (msg && msg.payload && msg.payload.onClickType) {
    let onClickValue = msg.payload.onClickValue;
    switch (msg.payload.onClickType) {
    case 'NEW_ORDER_LIST': // 打开接单列表
    uni.reLaunch({
    url: '/pages/newOrders/newOrders'
    });
    break;
    default:
    console.log("未知的跳转类型:", msg.payload.onClickType);
    break;
    }
    }

    }

    2025-07-01 14:56

  • DCloud_UNI_yuhe

    回复 1***@qq.com: #ifdef APP-PLUS 都不会在鸿蒙上执行的

    2025-07-01 14:57

  • 1***@qq.com (作者)

    回复 DCloud_UNI_yuhe: 那我现在就是执行了的,鸿蒙4.2.0,不过我现在用的是自定义基座测试

    2025-07-01 15:13

  • 1***@qq.com (作者)

    回复 DCloud_UNI_yuhe: 貌似回复没有图片可以上传

    2025-07-01 15:14

  • DCloud_UNI_yuhe

    回复 1***@qq.com: 你问题分类写错了,这个不是鸿蒙 next

    2025-07-01 15:16

  • 1***@qq.com (作者)

    回复 DCloud_UNI_yuhe: 哦哦,不好意思,那帮忙看看,我用小米手机测试也是一样

    2025-07-01 15:38

  • 1***@qq.com (作者)

    回复 DCloud_UNI_yuhe: 大佬,除了这个点击通知进不去APP 里面。还有一个问题,麻烦帮我看看是不是正常的。后台java 推送的格式用的是自定义格式,在华为手机上app 在后台的时候是触发不到plus.push.addEventListener(‘receive') 创建不了本地通知,但是小米手机在线和app 在后台的情况都是可以创建本地通知。这个是正常的吗?谢谢哈

    2025-07-01 15:45

要回复问题请先登录注册