plus.push.createMessage仅在App前台或后台保活时生效,因它是纯本地消息,不走厂商通道;真正离线推送必须依赖uniPush 2.0官方链路,严格匹配manifest配置、自定义基座、厂商证书及权限声明,任一环节出错即导致cid为空、通知不弹、角标不更新。

离线推送和角标显示在 uni-app 里不是“调个 API 就行”,而是必须走 uniPush 2.0 官方链路,且每个环节配置错一个字符,plus.push.getClientInfo() 就返回空、cid 拿不到、通知压根不弹——这不是代码问题,是认证链断裂。
为什么 plus.push.createMessage 只在 App 在前台时生效
plus.push.createMessage 是纯客户端本地消息,不经过厂商通道,也不依赖网络,所以它只能在 App 进程活着时触发(即前台或后台保活状态)。它无法实现真正的“离线推送”:手机锁屏、App 被杀、网络断开时,这条消息就丢了。
- 真正离线场景下,必须依赖厂商推送服务(华为 HMS、小米 MiPush、OPPO Push 等)+
uniCloud.getPushManager服务端下发 -
plus.push.createMessage适合做“已读同步后补发的本地提醒”,比如用户点开消息列表后,再用它触发一条带跳转的本地通知 - 如果你发现真机上完全收不到通知,先别查 JS 逻辑——90% 是没走通
uniPush 2.0的云通道
manifest.json 的 push 配置必须和厂商后台一模一样
填错大小写、多一个空格、漏掉 HUAWEI- 前缀,都会导致 cid 获取失败,后续所有推送静默丢弃。这不是容错设计,是签名验证强制要求。
- 华为:
huawei.appid必须和 AGC 控制台「项目设置 → 应用信息」里显示的 **完整字符串** 完全一致(含HUAWEI-和大小写) - 小米:
xiaomi.appid和xiaomi.appkey必须从「推送服务 → 应用配置」页单独复制,首页看到的“AppKey”是错的 - OPPO/vivo:
appKey/appSecret要严格对应各自对象,不能塞进meizu字段;且需手动在手机设置里打开「自启动」「通知使用权」 - Android 12+ 必须加权限:
"permissions": ["android.permission.POST_NOTIFICATIONS"],否则连权限弹窗都不出现
角标数字不更新?先确认 badgeClass 是否正确
badgeClass 不是可选项,是 Android 厂商识别目标 Activity 的唯一路径。填错就等于告诉系统“去更新一个不存在的图标”,结果就是红点/数字全无。
- 最可靠获取方式:在 HBuilderX 中打开项目 → 查看
nativeplugins目录 → 找含PandoraEntry的 Java 类 → 完整类名形如io.dcloud.PandoraEntry - 华为设备还需额外调用
plus.runtime.setBadgeNumber(不是plus.push.setBadgeNumber),且需动态申请CHANGE_BADGE权限 - OPPO 目前只支持红点,不支持数字;vivo 需通过极光通道 + 特定 SDK 才能生效;小米则依赖用户是否开启「桌面图标角标」开关
真机调试必须用自定义基座,否则一切为零
默认基座(HBuilderX 自带调试 App)不打包任何厂商 SDK,plus.push.getClientInfo() 返回 null,uni.getPushClientId() 拿不到值——这不是 bug,是设计如此。绕过这一步,所有调试都是假象。
- 制作自定义基座前,确保已按厂商要求下载
agconnect-services.json(华为)、mipush_app_key.xml(小米)等配置文件,并放对位置 - 自定义基座打包完成后,务必在真机上卸载旧版 App 再安装,避免系统缓存旧签名导致
cid复用失败 - 首次运行时,
onLaunch中调用uni.getPushClientId()后,立刻打印返回值;为空就停在这里查 manifest 和基座,别往下写业务逻辑
最常被忽略的一点:角标数字不是由推送内容自动决定的,而是你主动调用 plus.runtime.setBadgeNumber 或厂商 SDK 接口设置的。服务端推送过来的只是消息体,未读数统计、角标增减、清零时机,全部得自己维护——没有银弹,只有状态同步。


















