
plus.runtime.setBadgeNumber(0) 在 iOS 上能清,但 Android 上基本没用
调用 plus.runtime.setBadgeNumber(0) 后角标还在?不是你代码写错了,是 Android 原生根本不支持这个 API 的语义。它在华为、小米等机型上可能偶尔生效,但属于厂商私有实现的“意外行为”,不是标准能力。你看到的“清掉了”,大概率是某次广播被监听到或 ContentProvider 被触发了,下次重启 App 或换台手机就失效。
常见错误现象包括:
- 调用后控制台无报错,但桌面图标数字纹丝不动
- 小米机上必须发
android.intent.action.APPLICATION_MESSAGE_UPDATE广播才响应,setBadgeNumber直接被忽略 - 华为需用户手动开启「角标管理」权限,且仅对 HMS Push 通知渠道生效
- vivo/OPPO 几乎只认 JPush 推送 payload 里的
badge字段,本地 JS 调用无效
所以别把它当清理入口,它只是 H5+ 引擎提供的一个兼容性极差的兜底尝试。
uni.setAppBadgeNumber(0) 是鸿蒙 Next 的唯一可行路径
鸿蒙 Next 已彻底移除 plus 对象,plus.runtime.setBadgeNumber 会直接报错 ReferenceError: plus is not defined。必须用标准鸿蒙原生能力桥接,而 uni.setAppBadgeNumber 是目前官方唯一暴露的跨平台接口(截至 2026 年 6 月)。
注意三点:
- 该 API 仅在
#ifdef app-harmony条件编译块内有效,其他平台调用无反应 - 传参为
0才清零,传''或null会被忽略 - 必须确保应用已申请通知权限:
uni.authorize({scope: 'scope.notification'}),否则静默失败
示例:
onShow() {
//#ifdef app-harmony
uni.setAppBadgeNumber(0);
//#endif
}
iOS 角标清不掉?先检查三件事:权限、manifest、tabbar 配置
uni.setTabBarBadge 和 plus.runtime.setBadgeNumber 在 iOS 上都可能失效,根本原因不是 API 问题,而是系统级限制未满足。
必须确认:
-
manifest.json→「iOS 设置」→「启用 iOS Badge」是否勾选?没勾就完全不走原生链路 -
pages.json中对应 tab 是否配置了完整tabBar.list,且iconPath/selectedIconPath存在?缺失任一字段会导致 badge 渲染中断 - 是否已调用
plus.push.register()并监听register事件?iOS 12+ 要求至少注册过一次推送,UIApplication.sharedApplication().applicationIconBadgeNumber才允许被修改
如果仍无效,可条件编译调用原生:
// #ifdef APP-PLUS && !app-harmony
const UIApplication = plus.ios.import('UIApplication');
const app = UIApplication.sharedApplication();
app.setApplicationIconBadgeNumber(0);
// #endif
真正可靠的清理逻辑:按平台分发 + 权限兜底
单一 API 搞定全平台角标清理,不存在。实际落地必须分层处理:
- iOS:优先走
plus.runtime.setBadgeNumber(0),失败时 fallback 到plus.ios.invoke直接调原生 - Android:放弃
plus.runtime.setBadgeNumber,改用推送 SDK 的清除能力(如 JPush 的JPush.clearAllNotifications()+JPush.setBadge(0)) - 鸿蒙:只认
uni.setAppBadgeNumber(0),且必须在onShow或通知点击回调中调用 - 所有平台:清理前务必检查
uni.getProvider和uni.authorize状态,权限关闭时任何操作都白搭
最容易被忽略的是:角标数字和通知栏消息是两套系统。清了角标,不代表通知消失了;清了通知,也不代表角标归零。两者必须独立控制,且 Android 上还需额外处理 Notification Channel 的 badge 开关状态。











