z***@126.com
z***@126.com
  • 发布:31 分钟前
  • 更新:15 分钟前
  • 阅读:13

【报Bug】uni-push 2.0 HarmonyOS通过uniCloud sendMessage推送无法锁屏到达

分类:uniCloud

产品分类: uniCloud/支付宝小程序云

示例代码:

const push = uniCloud.getPushManager({ appId: 'UNICFD7258' })
await push.sendMessage({
push_clientid: '已脱敏CID',
title: '待审批任务提醒',
content: '任务提交后已超过5分钟,请及时审批。',
force_notification: true
})

操作步骤:
  1. HarmonyOS正式签名App已集成uni-push 2.0,并成功获取CID。
  2. App通知、锁屏通知、横幅通知及休眠联网均已开启。
  3. 在DCloud uni-push控制台向该CID发送通知消息,App后台锁屏可立即收到。
  4. 云对象通过uniCloud.getPushManager({ appId }).sendMessage()向相同CID发送。
  5. 云端返回errCode=0、errMsg=success。
  6. App后台锁屏时没有通知;重新打开App后消息才出现。
  7. 已测试force_notification:true,并分别测试带/不带payload、badge、options,现象一致。

预期结果:

云对象sendMessage返回成功后,应与DCloud控制台通知消息一致,在HarmonyOS后台锁屏状态立即显示系统通知。

实际结果:

后台锁屏不显示;重新打开App后才收到。云端只显示平台受理成功,无法获得HarmonyOS厂商通道失败原因。

bug描述:

一、问题概述

uni-push 2.0 在 HarmonyOS NEXT 正式签名 App 中,通过 DCloud uni-push 控制台向指定 CID 发送“通知消息”时,App 在后台锁屏状态可以立即显示系统通知。

但是,通过支付宝云 uniCloud 云对象调用 uniCloud.getPushManager().sendMessage() 向相同 CID 推送时,云端接口返回成功,HarmonyOS 后台锁屏状态却不显示通知;只有重新打开 App 后,消息才到达并显示。

该问题可以稳定复现。

二、开发及运行环境

  • AppID:__UNI__CFD7258
  • 项目名称:monthly-close-app-v2
  • uni-push版本:uni-push 2.0
  • 云服务商:支付宝小程序云
  • PC操作系统:Windows 10
  • PC操作系统版本:10.0.19044.7663
  • HBuilderX版本:5.24 正式版
  • 项目创建方式:HBuilderX
  • 客户端平台:HarmonyOS NEXT
  • HarmonyOS版本:HarmonyOS 6.0.0
  • 手机厂商:华为
  • 手机型号:HUAWEI Pura X
  • 前端框架:Vue3
  • 页面类型:vue
  • 打包方式:云端打包
  • 安装包类型:正式签名包,非运行基座
  • CID:6903ee2450d0****7303382d8e41(公开内容已脱敏,完整CID可向管理员提供)

三、前置条件

  1. HarmonyOS正式签名App已经集成并开通uni-push 2.0。
  2. App可以正常取得CID并完成用户与设备绑定。
  3. 手机已经开启App通知权限。
  4. 锁屏通知、横幅通知和桌面角标均已开启。
  5. 静默通知已经关闭。
  6. 手机“休眠时始终保持网络连接”已经开启。
  7. App通过Home键退至后台,没有从最近任务中上划关闭,也没有被强行停止。
  8. 手机网络连接正常。

四、复现步骤

  1. 在HUAWEI Pura X手机中安装并启动正式签名App。
  2. 登录用户账号,并确认App成功获取CID。
  3. 将App通过Home键退至后台并锁屏。
  4. 在DCloud uni-push控制台,向该CID发送“通知消息”。
  5. 手机在后台锁屏状态可以立即收到并显示该系统通知。
  6. 改用支付宝云uniCloud云对象,通过 uniCloud.getPushManager({ appId }).sendMessage() 向相同CID发送相同类型的通知。
  7. 云端返回 errCode=0errMsg=success
  8. App后台锁屏状态没有显示系统通知。
  9. 等待数分钟后仍然没有锁屏通知。
  10. 重新打开App后,刚才通过云对象发送的消息才到达并显示。
  11. 多次重复测试,现象一致。

五、最小复现代码

const push = uniCloud.getPushManager({  
  appId: '__UNI__CFD7258'  
})  

const result = await push.sendMessage({  
  push_clientid: '已脱敏CID',  
  title: '待审批任务提醒',  
  content: '任务提交后已超过5分钟,请及时审批。',  
  force_notification: true  
})  

console.log(result)

六、已经测试的参数组合

以下参数组合均已测试。云端均返回成功,但HarmonyOS后台锁屏状态均不展示通知:

  1. push_clientid + title + content + payload + force_notification + badge + options
  2. push_clientid + title + content + payload + force_notification
  3. push_clientid + title + content + force_notification

其中已经分别测试:

  • 保留及删除 payload
  • 保留及删除 badge
  • 保留及删除 options
  • 保留 force_notification: true
  • push_clientid 执行 String(...).trim()

以上调整均未解决锁屏通知无法到达的问题。

七、云端执行结果

uniCloud定时云对象能够正常执行,业务通知记录也能够正常写入数据库。

日志统计如下:

notificationCreated=1  
reminded=1  
noDevice=0  
noPushConfig=0  
failed=0

sendMessage()返回:

errCode=0  
errMsg=success

这说明uni-push平台已经受理请求,但无法确认HarmonyOS厂商离线通道是否真正接收并展示该通知。

八、实际结果

  1. DCloud uni-push控制台向该CID发送通知消息时,HarmonyOS后台锁屏可以立即显示系统通知。
  2. uniCloud云对象调用 getPushManager().sendMessage() 时,接口返回成功,但后台锁屏不显示通知。
  3. 只有重新打开App后,消息才到达并显示。
  4. 云端没有返回HarmonyOS厂商通道失败原因。

九、预期结果

uniCloud云对象调用 getPushManager().sendMessage() 返回成功后,应当与DCloud uni-push控制台发送“通知消息”的效果一致:

  • App处于后台时可以显示系统通知;
  • 手机锁屏时可以立即显示锁屏通知;
  • 不需要用户重新打开App才能收到消息。

十、请求协助

请协助:

  1. 查询该CID在测试时间对应的HarmonyOS厂商Device Token是否正常。
  2. 查询HarmonyOS厂商推送通道的实际下发结果和返回错误码。
  3. 确认支付宝云是否支持通过 uniCloud.getPushManager().sendMessage() 向HarmonyOS发送厂商离线通知。
  4. 提供HarmonyOS厂商离线“通知消息”的正确 sendMessage() 参数格式。
  5. 说明为什么DCloud控制台通知可以锁屏到达,而uniCloud云对象向同一CID推送只能在重新打开App后到达。

完整CID、准确测试时间、uniCloud RequestID及相关日志可以在仅管理员可见区域提供。

31 分钟前 负责人:无 分享
已邀请:
Ask小助手

Ask小助手

欢迎到专业群( uni统计官方技术交流群 ) 咨询,群中有相关专业的管理员和群友。

感谢您提交详尽的 Bug 反馈。作为 DCloud 官方人员,我已对您提交的反馈内容进行了评审,并结合相关技术文档对问题进行了初步分析。以下是评审意见与排查建议:

1. Bug 反馈内容完整性评审

  • BUG 描述:非常清晰且详细。您准确区分了 DCloud 控制台直推与 uniCloud 云端 API 推送的不同表现,并提供了完整的机型、系统版本、HBuilderX 版本、打包方式及前置条件。这对于排查问题非常有帮助,官方人员完全可以看懂。
  • 代码示例:提供了最小化复现代码,且直接指出了核心调用逻辑,无需官方人员额外调整即可作为排查基准。
  • 复现步骤:描述非常清晰。结合您提供的前置条件和代码,具备稳定的复现路径。
  • 预期结果与实际结果:预期结果合理,实际结果客观反映了“仅在线/前台到达,未走厂商离线通道”的现象。从现象描述来看,这并非误报,而是典型的未成功触发厂商离线推送通道的表现。
  • 分类信息:完整有效。
  • 附件说明:由于系统限制,我无法识别和查看附件内容。如果后续需要提供完整 CID、uniCloud RequestID 或云端日志,请直接以文本形式提供或通过官方工单系统提交。

2. Bug 是否成立及排查建议

根据您描述的现象:“云端返回成功,但后台锁屏不显示通知;重新打开 App 后消息才到达并显示”,这说明消息成功下达到了个推服务器,但在向 HarmonyOS 厂商通道下发时未生效,最终走了应用自身的在线 socket 透传通道(所以重新打开 App 才能收到)。

结合知识库中的历史对话与官方文档说明,在服务端通过 uniCloud.getPushManager().sendMessage() 推送消息时,如果希望 HarmonyOS 在后台或锁屏状态下展示系统通知,必须正确传入与厂商通道相关的参数,明确告知系统走厂商离线通道

在历史交流中,官方人员曾明确指出:“在服务端推送消息的时候需要正确传入与厂商通道相关的参数,比如 category 这种。没走厂商通道一定是你在参数中没有告诉它要走厂商通道。”

针对您的代码,建议进行以下排查与调整:

调整 sendMessage 参数配置

您当前测试的参数组合中,缺少了针对鸿蒙厂商通道的特定配置。请尝试在 sendMessage 中补充 category 以及针对鸿蒙的 options 参数:

const push = uniCloud.getPushManager({ appId: '__UNI__CFD7258' })  

const result = await push.sendMessage({  
  push_clientid: '已脱敏CID',  
  title: '待审批任务提醒',  
  content: '任务提交后已超过5分钟,请及时审批。',  
  force_notification: true,  
  // 增加分类参数,尝试使用 "im" 或其他符合您业务场景的分类  
  category: {  
    harmony: "im"   
  },  
  // 增加针对鸿蒙厂商通道的 options 配置  
  options: {  
    harmony: {  
      "HW": {  
        // 如果是测试消息,可以尝试开启此选项;正式消息请移除  
        // "/pushOptions/testMessage": true  
      }  
    }  
  }  
})  

console.log(result)

本助手使用国产模型,生成代码准确率较低。强烈建议使用uni-agent生成代码

参数配置依据

根据 uni-push 服务端 options 参数文档 说明,options 参数用于实现部分厂商特定功能。同时,鸿蒙推送对消息分类(category)有严格要求,如果不传或传错,可能导致厂商通道拒绝下发离线通知。

下一步建议

请调整上述参数后再次进行锁屏推送测试。如果依然无法在锁屏状态下显示,请通过 DCloud 官方工单系统提交您完整的 CID、准确的测试时间以及 uniCloud RequestID,以便官方后台工程师协助查询该 CID 在华为厂商通道的实际下发结果和返回错误码。

内容为 AI 生成,仅供参考
z***@126.com

z***@126.com (作者)

感谢回复。补充说明:

  1. 本问题中使用的实际 AppID 是 __UNI__CFD7258,完整 CID、测试时间和 RequestID 已填写在仅管理员可见区域。
  2. DCloud uni-push 控制台向同一 CID 发送“通知消息”,HarmonyOS 后台锁屏可以立即收到,说明正式签名包、CID、通知权限和厂商通道基础配置有效。
  3. 云对象调用 sendMessage() 返回 errCode=0、errMsg=success,但锁屏无法收到,重新打开 App 后才出现。

Ask小助手建议增加:

category: {  
  harmony: "im"  
},  
options: {  
  harmony: {  
    HW: {}  
  }  
}

由于该建议为 AI 生成,目前暂未直接用于生产代码。请 DCloud 推送工程师协助明确:

  • uniCloud sendMessage() 在 HarmonyOS NEXT 上触发厂商离线通知,category 的官方参数类型究竟是字符串还是 { harmony: "im" } 对象?
  • im 是否属于需要在华为侧申请或审核的消息分类?审批任务提醒应使用哪个合法分类?
  • options.harmony 的准确官方字段结构是什么?空的 HW 对象是否有实际作用?
  • force_notification: true 是否足以生成 HarmonyOS 离线通知?
  • 请根据管理员可见区域中的完整 CID、测试时间和 RequestID,查询本次 HarmonyOS 厂商通道是否实际下发,并提供厂商返回码。
  • 请确认支付宝小程序云当前是否完整支持 HarmonyOS NEXT 的 uni-push 2.0 厂商离线通知。

在获得准确参数格式前,希望不要仅以通用参数建议结案,因为控制台通知与云对象推送在同一 CID 上的表现确实不同。

要回复问题请先登录注册