uni.showLocalNotification在Android上静默失效的直接原因是channelId未提前注册或打包未启用通知渠道支持,需在onLaunch/onShow调用plus.notification.setChannel并设置name和importance。

uni.showLocalNotification 调用失败:Android 通知不显示的直接原因
绝大多数“通知没出来”的问题,根本不是代码写错,而是 uni.showLocalNotification 在 Android 上静默失效——它根本不会报错,但也不触发通知栏。核心卡点就两个:channelId 没提前注册,或打包时没执行渠道初始化。
- 必须在
onLaunch或onShow里调用plus.notification.setChannel,且不能只传id,得带name和importance(Android ≥ 26 强制要求) -
manifest.json里无需额外配置,但云打包前务必确认 HBuilderX 已启用 “Android 10+ 通知渠道支持”(新版默认开启,旧版需手动勾选) - 测试时别只看模拟器——真机上若未弹出权限提示,说明
uni.getSetting查到的notification是denied,此时uni.openSetting才能唤起设置页
播放器控件与本地通知共存时的生命周期冲突
当你的播放器页面(比如 player.vue)处于前台,又想触发定时本地通知(如“30秒后自动暂停”),uni.showLocalNotification 的时间戳逻辑容易被误用。
- 时间参数必须是毫秒级绝对时间戳,例如
Date.now() + 30 * 1000;写成new Date().setSeconds(30)会返回 NaN,通知直接丢弃 - App 进入后台后,Android 可能限制 JS 定时器精度(尤其 MIUI、EMUI),建议用
plus.ios.invoke(iOS)或plus.android.invoke(Android)调用原生方法触发,而非纯 JSsetTimeout - 播放器全屏时,部分厂商系统会冻结 WebView 线程,导致通知延迟数秒甚至丢失——此时应改用
plus.push.createMessage+plus.push.send组合(需服务端配合),而非依赖本地 JS 计时
自定义播放器控件覆盖通知栏图标的兼容方案
很多播放器需要在视频区域叠加“震动提醒图标”或“音效开关”,但这类 UI 元素在不同端渲染层级差异极大,极易和系统通知栏图标打架。
- 微信小程序端:用
cover-view包裹图标按钮,否则会被video原生组件盖住;但cover-view不支持z-index,必须靠父子嵌套顺序控制层级 - H5 端:直接用 CSS
position: fixed+z-index: 9999,但需监听window.orientation防横竖屏切换时错位 - App 端:优先用
plus.nativeObj.View创建原生视图层,比view标签更稳定;若用cover-view,需确保父容器style="overflow: hidden",否则可能溢出遮挡状态栏
音频路径与通知声音绑定的硬性限制
想让本地通知带自定义铃声(比如播放器结束时的“叮”一声),iOS 和 Android 对音频文件路径、格式、存放位置的要求完全不同,且无法统一处理。
- iOS 必须把音频文件放在
static/audio/xxx.caf(仅支持 caf/aiff/wav),且sound字段填"xxx.caf";填 mp3 或相对路径(如"./audio/end.mp3")直接静音 - Android 要求音频在
android/res/raw/目录下(打包时自动转为资源 ID),sound字段填"res://raw/end";放static目录下无效 - 两者都要求 App 后台运行时音频能播放——iOS 需在 Xcode 中开启
Background Modes → Audio, AirPlay and Picture in Picture,Android 需在manifest.json里声明android.permission.FOREGROUND_SERVICE
真机调试时最容易忽略的是:iOS 模拟器不校验 Background Modes,但上架后只要没勾选,通知就永远不响;Android 则对 res/raw 路径极其敏感,少一个字母或大小写错误,sound 就退化成默认音效。



















