uni-app plus.runtime.setBadgeNumber(0) ios清理后会清理掉通知中心的推送
uni-app plus.runtime.setBadgeNumber(0) ios清理后会清理掉通知中心的推送
示例代码:
onLaunch: async function () {
console.log('App Launch');
// 清除应用角标
// #ifdef APP-HARMONY
uni.setAppBadgeNumber(0)
// #endif
// #ifdef APP-PLUS
plus.runtime.setBadgeNumber(0);
// #endif
}
操作步骤:
- 收到通知栏消息后,直接打开app并调用plus.runtime.setBadgeNumber(0)
预期结果:
- 收到通知栏消息后,直接打开app并调用plus.runtime.setBadgeNumber(0),只清理角标,不清理通知栏消息
实际结果:
- 收到通知栏消息后,直接打开app并调用plus.runtime.setBadgeNumber(0),通知栏消息也被清理了
bug描述:
- plus.runtime.setBadgeNumber(0) ios清理后会清理掉通知中心的推送
| 信息类别 | 信息内容 |
|---|---|
| 产品分类 | uniapp/App |
| PC开发环境 | Mac |
| PC操作系统版本 | macOS 15.3 (24D2059) |
| HBuilderX类型 | 正式 |
| HBuilderX版本 | 4.87 |
| 手机系统 | iOS |
| 手机系统版本 | iOS 15 |
| 手机厂商 | 苹果 |
| 手机机型 | iPhone X |
| 页面类型 | vue |
| Vue版本 | vue3 |
| 打包方式 | 离线 |
| 项目创建方式 | HBuilderX |
更多关于uni-app plus.runtime.setBadgeNumber(0) ios清理后会清理掉通知中心的推送的实战教程也可以访问 https://www.itying.com/category-93-b0.html
该bug反馈内容基本完整但存在关键缺失:标题和描述清晰说明了iOS上调用plus.runtime.setBadgeNumber(0)意外清除通知中心消息的问题,提供了HBuilderX版本(4.87)、iOS 15等环境信息及代码示例。但复现步骤过于简略,未说明推送方式(uni-push/本地消息)及是否通过点击通知打开应用——这是核心疑点,因为iOS系统会在用户点击通知时自动清除该通知,与角标API无关。
经核查知识库:
iOS平台角标说明 明确角标(badge)和通知中心是独立功能,setBadgeNumber(0)仅应清除角标数字
通知栏消息操作文档 指出iOS平台"不支持获取系统通知栏消息",且创建本地消息的逻辑与角标设置无直接关联
问题很可能源于iOS系统行为而非API缺陷:当用户通过点击通知栏消息打开应用时,系统会自动清除该通知(这是iOS原生机制),用户误认为是setBadgeNumber(0)导致。建议补充复现细节确认是否属于此场景。若需保留通知仅清除角标,应避免在onLaunch中直接调用该API,改用推送服务配置badge参数(如设置为"0")或检查应用启动来源。 内容为 AI 生成,仅供参考
更多关于uni-app plus.runtime.setBadgeNumber(0) ios清理后会清理掉通知中心的推送的实战教程也可以访问 https://www.itying.com/category-93-b0.html
这是一个已知的iOS系统行为,并非uni-app的bug。
在iOS系统中,角标数字(Badge Number)和通知中心(Notification Center)的推送通知是紧密关联的。当调用plus.runtime.setBadgeNumber(0)将角标清零时,iOS系统会自动清除该应用在通知中心的所有推送通知。
这是iOS的设计机制:
- 系统级行为:iOS将角标视为未读通知的视觉指示器。角标清零意味着“所有通知已读”,因此系统会自动移除通知中心的对应推送。
- 无法分离:在iOS原生开发中,清除角标同样会导致通知被清除,这是Apple的默认设计。
- 平台差异:Android平台没有这个限制,可以单独清除角标而不影响通知栏消息。
解决方案: 如果需要在iOS上保留通知栏消息,可以考虑以下方案:
- 不主动清除角标:让用户通过下拉通知中心手动清除通知,系统会自动同步清除角标。
- 使用本地通知替代:对于需要持久显示的通知,可以使用
plus.push.createMessage()创建本地通知,这类通知不受角标清除影响。 - 自定义角标逻辑:通过修改应用图标等方式实现自定义角标效果,绕过系统角标API。
代码调整建议:
// 可以添加平台判断,在iOS上谨慎使用角标清零
// #ifdef APP-PLUS
if (uni.getSystemInfoSync().platform === 'ios') {
// iOS平台:考虑不清除角标,或提示用户手动清除
console.log('iOS平台清除角标会同时清除通知')
} else {
plus.runtime.setBadgeNumber(0)
}
// #endif

