plus.runtime.setBadgeNumber(0) 仅对iOS有效,可清除应用图标角标;Android需厂商通道支持且该API无效,清通知栏须用plus.notification.clear()或原生代码。
plus.runtime.setBadgeNumber(0) 能清角标,但只对 iOS 有效
android 没有“应用角标”这个系统级概念,所谓“角标”其实是厂商通道(如华为、小米)自己加的 ui 元素,plus.runtime.setbadgenumber 对它们完全无效。ios 则原生支持,调用后能立刻清掉右上角红点。
常见错误是:在 onShow 里只写这一句,以为全平台都清了——结果 Android 用户打开 App 后通知栏红点还在,甚至误以为消息没处理。
-
plus.runtime.setBadgeNumber(0)必须在 iOS 真机或模拟器运行才生效,H5 和微信小程序下无效果 - 它不清理通知栏里的具体消息,只清角标数字;如果之前设过非零值(比如
setBadgeNumber(3)),必须显式设为0才会消失 - 部分 iOS 版本(尤其是 iOS 16.4+)要求 App 已请求并获得通知权限,否则调用静默失败,控制台也不报错
plus.push.clear() 清的是推送消息队列,不是系统通知栏
plus.push.clear() 的作用是清空 HBuilderX 运行时维护的“推送消息缓存列表”,比如你用 plus.push.createMessage 发的本地通知,或 UniPush 收到但还没展示的离线消息。但它不会触达系统通知栏(Notification Center)本身。
也就是说:调了 plus.push.clear(),App 内部记录清了,但用户下拉通知中心,那条“您有新订单”的通知依然挂着——这不是 bug,是设计如此。
- Android 上真正清除系统通知栏某条消息,得用
plus.notification.clear()并传入id;清全部需遍历plus.notification.getNotifications() - iOS 不允许第三方 App 主动清除其他 App 的通知,所以
plus.push.clear()在 iOS 上实际只清内存缓存,对通知中心无影响 - 如果你用的是 UniPush2.0 或极光等 SDK,它们的“清通知”逻辑往往封装在自定义点击回调里,别直接依赖
plus.push.clear()
App 启动时自动清通知栏,得靠原生层配合
UniApp JS 层无法直接调用系统 API 清除所有属于本 App 的系统通知(尤其 Android 8.0+ 限制更严),必须借助原生代码桥接。HBuilderX 默认不提供这能力,得手动补。
典型场景:用户点击通知启动 App,你希望一进来就让那条通知消失。这时候仅靠 JS 监听 click 事件 + plus.notification.clear() 往往失败——因为通知 ID 可能未正确透传,或 Android 系统已回收上下文。
- Android 需在
MainActivity.java里写一个 public 方法,调用NotificationManager.cancelAll(),再用plus.android.invoke()从 JS 调用 - iOS 需在
AppDelegate.m里调用[[UIApplication sharedApplication] setApplicationIconBadgeNumber:0]和[[UNUserNotificationCenter currentNotificationCenter] removeAllDeliveredNotifications] - 鸿蒙平台(API 12+)需用 UTS 插件调用
notification.cancelAll(),纯 JS 无法访问 - 千万别在
onLaunch里直接循环getNotifications()后 clear——某些 Android 厂商(如 OPPO、vivo)会返回空数组,即使通知明明存在
别混淆「关闭推送」和「清除通知」
用户问“如何关闭推送通知”,常被误解为“清掉已有通知”。其实这是两件事:plus.push.clear() 是清消息缓存,uni.removePush()(已废弃)或配置禁用才是停推送服务本身。
如果你真想彻底关推送,得改 manifest.json:删掉 "push" 模块引用,Android 下还要手动删 AndroidManifest.xml 里的 <receiver> 和 <service> 声明——否则即使 JS 层不调用,系统仍可能保活推送进程。
- 关闭推送 ≠ 清除历史通知;已送达的通知,系统会保留,直到用户手动划掉或你通过原生方式清除
- 测试时注意:iOS 模拟器不支持推送,真机调试必须配好 APNs 证书;Android 真机要确认厂商通道是否开启(比如华为手机需打开“电池优化白名单”)
- 最易忽略的一点:通知角标和通知栏消息是两个独立系统状态,清一个不等于清另一个,必须分开处理










