android原生不支持角标,需依赖厂商私有实现或推送sdk;ios需原生插件桥接;鸿蒙next须用uts插件;统一api不可行,混合方案才是唯一靠谱解法。

直接调用 plus.runtime.setBadgeNumber 在 Android 上基本无效,不是你代码写错了,是 Android 原生根本不支持角标——所有“能显示”的情况,都依赖厂商私有实现或推送 SDK 的中转。
Android 桌面角标为什么调了没反应
常见错误现象包括:调用后无任何日志、不报错也不显示;小米机上只响应特定广播 android.intent.action.APPLICATION_MESSAGE_UPDATE;华为需手动开启「角标管理」权限且仅对系统通知渠道生效;vivo/OPPO 多数只认极光(JPush)推送里的 badge 字段,本地调用直接忽略。
-
plus.runtime.setBadgeNumber(5)是 H5+ 引擎提供的兜底尝试,兼容性极差,不能作为主力方案 - 清除角标必须传
-1,传0会静默失败(iOS 也一样,但 Android 这里更常被误用) - 所有方案都依赖用户已开启通知权限:
uni.authorize({scope: 'scope.notification'})必须先调且成功
iOS 角标设置要走原生插件
iOS 系统本身支持 applicationIconBadgeNumber,但 uni-app 无法直接访问,必须通过原生插件桥接。
- 在
native-plugins目录下新建 iOS 插件,核心代码就是一行:UIApplication.sharedApplication().applicationIconBadgeNumber = badgeNumber - 调用时必须包裹
#ifdef APP-PLUS条件编译,否则 H5 或小程序会报plus is not defined - 注意:App 启动后首次设置可能被系统延迟渲染,建议在
onShow后加setTimeout延迟 100ms 再执行
鸿蒙 Next 必须用 UTS 插件,plus 已失效
鸿蒙 Next 不再兼容 H5+ 的 plus 对象,plus.runtime.setBadgeNumber 会直接报错 ReferenceError: plus is not defined。
- 新建
uni_modules插件,类型选「UTS 插件-API 插件」,名称不能以uni开头(如lp-setBadgeNumber) - 在
interface.uts中调用鸿蒙原生 API:app.setAppBadgeNumber()(API 12+),低版本需通过bundleManager.getBundleInfoForSelf()兼容 - UTS 插件必须显式注册到
manifest.json的uni-app节点下,否则运行时报找不到模块
真正能落地的只有两种路径
别再纠结“统一 API”,现实就是:iOS 走原生插件,Android 走推送 SDK,鸿蒙走 UTS —— 混合方案才是唯一靠谱解法。
- 已接入 JPush:优先用
JPush.setBadge(99)(SDK ≥ 4.4.0),服务端推送时填badge: "+1"自动累加 - 已接入 HMS Push:调
HmsPush.setBadgeNumber(99),但仅对华为手机生效,且需在 AppGallery Connect 开启角标开关 - 没接推送?用现成 UTS 插件如
@/uni_modules/xtf-brage,它内部自动按机型分发:小米走广播、华为走 ContentProvider、vivo 走反射 - 所有方案都要处理“跨页面状态不同步”:角标数字不是全局变量,每次
onShow都得重新拉取未读数并设置
最易被忽略的点是:角标是否显示,80% 取决于用户是否手动开启了「桌面图标角标」权限,这个动作代码完全无法绕过,必须在首次需要时弹窗引导,而不是只调 API 就完事。











