plus.runtime.setBadgeNumber在安卓上基本无效,因各厂商系统未统一支持该API,仅少数旧版华为/小米ROM有微弱响应,且需手动开启隐藏的桌面角标权限;iOS因原生支持可正常工作。
plus.runtime.setBadgeNumber 在安卓上基本无效,别白费力气
你调了 plus.runtime.setbadgenumber(5),打包安装后图标没反应?不是代码写错了,是这个 h5+ api 在绝大多数安卓机型上根本没用。ios 能跑通是因为系统原生支持;安卓端它只对极少数旧版华为/小米 rom 有微弱响应,且严重依赖用户手动开启“桌面角标”权限——而这个开关藏得深、命名不统一、甚至在某些系统版本里直接被移除了。
- 华为 EMUI 12+、小米 HyperOS 1.0+ 已默认禁用第三方应用角标控制能力
- OPPO ColorOS、vivo OriginOS 完全不响应该 API,连日志都不打
- 即使生效,也仅限于前台运行时,App 进入后台或被杀后数字立即丢失
必须用厂商专属通道:华为 HMS、小米 MiPush、vivo Push SDK
安卓角标不是“设一个数”就能成的事,本质是通知系统的延伸功能。各厂商把角标逻辑绑定在自家推送通道里,想显示数字,得先走通他们的推送链路。
- 华为:必须集成
HMS Core(Push Kit),并在发送通知时通过badgeClass和badgeCount字段透传角标值,且需在 AppGallery Connect 后台开启“角标管理”开关 - 小米:依赖
MiPush SDK,调用setNotificationBadge前必须确保miui_notification_badge权限已声明并由用户授权 - vivo/OPPO:角标仅随系统级通知触发,且只认自家推送服务下发的通知,
plus.runtime类 API 完全不可达
注意:这些 SDK 都要求你在 manifest 或 build.json 中显式配置 vendor-specific 权限和 service 声明,漏一项就静默失败。
uni-app 项目里怎么组织多通道角标逻辑?
不能靠 if-else 判断 brand 写一堆分支,容易失控。推荐用“策略模式”抽象:定义统一接口 updateBadge(num: number),运行时自动加载对应厂商的实现模块。
- 检测当前设备:用
uni.getSystemInfoSync().brand+plus.os.name组合判断,比单看 brand 更稳(比如“HONOR”要归到华为通道) - 华为通道示例:调用
hms.push.sendNotification时带上{ badgeClass: 'com.example.app', badgeCount: num } - 小米通道示例:先
miPush.setNotificationBadge(num),再发一条空内容通知触发刷新(否则不显示) - 不支持机型(如三星、一加、Pixel):直接降级为本地存储未读数,下次启动时同步到服务端,不抛错、不阻塞主流程
用户权限和系统设置才是最大拦路虎
你代码全对、SDK 全集成、推送也发出去了,角标还是不显示?90% 概率卡在用户侧。
- 华为:设置 → 应用和服务 → 应用通知管理 → [你的App] → 桌面角标 → 必须打开
- 小米:设置 → 推送服务 → [你的App] → 允许桌面角标 → 打开(注意:MIUI 14 后该选项默认关闭)
- vivo/OPPO:设置 → 通知与状态栏 → [你的App] → 允许通知 → 必须开启,且“锁屏通知”“悬浮通知”最好也开,否则角标不触发
- Android 13+:还需额外申请
POST_NOTIFICATIONS权限,否则通知压根收不到,角标更无从谈起
真正的难点从来不在代码里,而在那个用户可能永远找不到、也懒得点开的系统开关里。










