1***@qq.com
1***@qq.com
  • 发布:2026-09-21 23:02
  • 更新:2026-09-21 23:03
  • 阅读:81

uni-push 2.0 小米厂商通道离线消息不下发:sendMessage返回successed_offline但小米侧零下发

分类:uni-app

【环境】

  • DCloud appId:UNIF0AA0BA(应用:八折半-商家端)
  • uniCloud 支付宝云空间,云函数通过 uniCloud.getPushManager({appId:'UNIF0AA0BA'}).sendMessage 下发
  • 问题设备 CID:d3274b6ed499c8dd9f2c7481eaef343e
  • 设备:小米14(机型 23127PN0CC,HyperOS 3.0.3.5.0),已重新云打包并安装,故障排查显示:CID正常、归属包名 uni.app.UNIF0AA0BA 正确、Device Token 有值(N8iUnSUYF6LmI/GXjlRZBk1g3BNbxBxKZMwnGXemC8+U8OyZ81ZlRZgHeBiN+RO)
  • 问题 taskid:RASS_0921_7f5913284f6ce8313c910a2d404fecfe

【现象】

  1. App 杀进程离线时,sendMessage 对该 CID 返回 successed_offline,但消息从未到达设备;App 打开在线时可正常收到(走个推通道)。
  2. 小米开放平台推送统计全天数据:推送总量=0、实际下发=0、送达数=0,即个推从未调用小米推送接口。
  3. 对照组:OPPO 厂商通道离线推送正常(同一云函数、同一时间下发,OPPO 杀进程可收到)。
  4. 裸消息测试(sendMessage 不带任何厂商 options、不带 sound 参数,仅 push_clientid/title/content/payload/force_notification)同样离线不下发,可排除云函数自定义参数问题。

【已排查确认的事项】

  1. uni-push 后台厂商推送设置-小米:通道开关开启,AppID 2882303761520550702 / AppKey 5232055093702 / AppSecret 与小米开放平台一致,保存验证通过。
  2. 小米开放平台:应用包名 uni.app.UNIF0AA0BA 与 manifest 一致;通知类别 156926(新订单)、156927(退款订单)存在且状态正常,自定义铃声 URI 包名正确;隐私政策已上传;应用已上架(在架版本1.0.2,1.0.3审核中)。
  3. manifest.json:push 模块已勾选,unipush version 2,offline true,mi 配置存在。
  4. 客户端系统通知权限全部开启(允许通知/锁屏/悬浮/声音/振动均开)。
  5. 故障排查显示该 CID 无黑名单、Device Token 正常。

【疑问】
个推侧已有该设备的小米厂商 token(Device Token 有值),但消息始终不下发到小米通道,小米统计全天为 0。请协助查询上述 taskid 的厂商通道路由日志,确认为什么个推未向小米推送接口下发这条离线消息,或需要我们补充什么配置。

2026-09-21 23:02 负责人:无 分享
已邀请:
Ask小助手

Ask小助手 - Ask社区AI助手

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

根据您提供的详细排查信息和知识库中的相似案例,这是一个典型的厂商通道路由异常问题。由于 successed_offline 仅表示个推服务端已受理离线消息任务,并不保证厂商通道实际执行下发,结合小米侧统计为 0 的情况,说明消息在个推侧未能成功路由到小米推送接口。

基于知识库中 DCloud 官方人员的排查思路,请按以下步骤验证:

1. 检查小米系统级通知渠道设置(最常见原因)

根据 DCloud 官方人员在类似案例中的指引,即使个推配置正确,如果小米系统层面的通知渠道被用户关闭或分类不当,厂商通道会直接丢弃消息且小米后台统计为 0

请在小米14上检查:

  • 进入 设置 > 通知与控制中心 > 通知管理 > 找到"八折半-商家端"
  • 确认您代码中使用的 channel_id(如 156926、156927)对应的渠道已启用
  • 检查是否被归类为"静默通知"或"营销通知"导致被系统拦截

2. 验证 category 与 options 配置

根据 uni-push 消息分类管理文档,小米厂商通道对消息分类有严格要求。

建议的 sendMessage 参数结构

await push.sendMessage({  
  push_clientid: 'd3274b6ed499c8dd9f2c7481eaef343e',  
  title: '测试标题',  
  content: '测试内容',  
  payload: {...},  
  force_notification: true,  
  // 小米需要正确的消息分类  
  category: {  
    xm: 'IM'  // 或您申请的具体分类  
  },  
  options: {  
    xm: {  
      // 小米特定参数,如需要 channel_id 应通过原生 SDK 设置  
      // 参考:https://doc.dcloud.net.cn/uniCloud/uni-cloud-push/options.html  
    }  
  },  
  settings: {  
    strategy: {  
      default: 1,  // 离线走厂商通道  
      xm: 1        // 明确指定小米策略  
    }  
  }  
})

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

3. 关于 Channel ID 的特殊说明

根据知识库中 DCloud 官方人员的说明,Channel ID 是 Android 标准概念,但各厂商实现不一

  • 小米/华为需要通过原生 SDK 在客户端设置 Channel ID
  • 服务端推送时应通过 optionscategory 指定,而非仅依赖客户端设置
  • 早期 Channel 配置方式已废弃,请确认未混用新旧配置方式

4. 申请开通厂商下发策略权限

根据 uni-push strategy 文档精确控制厂商下发策略需要单独申请开通

如果需要在云函数中强制指定小米通道策略(strategy.xm),请确认:

  • 是否已在 DCloud 开发者后台申请开通厂商下发策略权限
  • 如未开通,默认策略可能未正确路由到小米通道

5. 收集日志并提交工单

由于您已确认个推侧存在有效的小米 Device Token,但厂商侧零下发,这通常需要查询个推服务端的路由日志。

请通过 DCloud 官方渠道提交工单,并提供:

  • TaskID: RASS_0921_7f5913284f6ce8313c910a2d404fecfe
  • CID: d3274b6ed499c8dd9f2c7481eaef343e
  • AppID: __UNI__F0AA0BA
  • 具体时间点(精确到分钟)
  • 小米开放平台应用包名: uni.app.UNIF0AA0BA

要求个推技术支持查询:

  1. 该 TaskID 是否触发了小米厂商通道下发逻辑
  2. 如果未触发,是策略判定问题还是 token 映射问题
  3. 如果触发但失败,小米返回的具体错误码

补充建议

根据相似案例经验,可尝试以下验证:

  • 卸载重装测试:完全卸载应用后重启手机,重新安装并获取新的 CID 测试(排除设备级缓存异常)
  • 对比测试:使用 DCloud 开发者后台的推送测试工具(非云函数)向该 CID 发送离线消息,观察是否走通(可区分是云函数配置问题还是个推账户级问题)

由于 OPPO 正常而小米异常,大概率是小米特有的通道配置或权限问题,而非代码逻辑错误。

内容为 AI 生成,仅供参考

要回复问题请先登录注册