app端锁屏后音频能播,但必须用uni.getbackgroundaudiomanager()而非uni.createinneraudiocontext(),ios需配置uibackgroundmodes为["audio"],android需设background.mode为"audio"并启用audio模块,且须云打包生效。

App端锁屏后音频还能播吗?必须用 uni.getBackgroundAudioManager()
不能靠 uni.createInnerAudioContext() 硬扛,它在锁屏后几秒就会被系统静音或中断,尤其 iOS 上基本必挂。真正能撑住的只有 uni.getBackgroundAudioManager(),它是专为后台音频设计的系统级接口。
常见错误现象:播放正常,一锁屏就无声;锁屏界面不显示封面/标题;耳机线控失效。根本原因就是没走对入口,或者 manifest 配置漏项。
- iOS 必须在
manifest.json的app-plus.distribute.ios.UIBackgroundModes中填["audio"](数组,不是字符串,不能拼错) - Android 必须在
app-plus.background.mode设为"audio",且app-plus.modules.Audio不能为空对象(即{}) -
src必须是有效 URL,本地资源要用/static/xxx.mp3,不能用相对路径或未打包路径 - 锁屏界面信息只认
title、singer、coverImgUrl三个字段,缺一不可
改完配置必须重新云打包,热更新和本地调试无效;真机测试前确认打包日志里有 “background audio enabled” 提示。
锁屏后定位还跑得动吗?光靠 setInterval 不行
纯 JS 定时器在锁屏后大概率被系统挂起,尤其在 MIUI、EMUI 等国产系统上,5 秒一次的 uni.getLocation 很快就停摆。要持续获取位置,必须依赖原生能力增强稳定性。
关键不是“怎么写”,而是“怎么配”:
- Android 需在
manifest.json的app-plus.distribute.android.permissions中加入"<uses-permission android:name='\"android.permission.ACCESS_BACKGROUND_LOCATION\"'></uses-permission>"和"<uses-permission android:name='\"android.permission.WAKE_LOCK\"'></uses-permission>" - iOS 需在
app-plus.distribute.ios.UIBackgroundModes中填["location"],且该能力需 Apple 审核批准 - 单纯调用
uni.getLocation不够,建议配合原生插件(如 DCloud 官方的location模块)或自定义模块实现后台服务保活
注意:iOS 后台定位权限审核严格,提交 App Store 前务必确保描述清晰、用途合理,否则可能被拒。
怎么让锁屏后屏幕不灭、亮度不降?uni.setKeepScreenOn 和 uni.setScreenBrightness 别混用
uni.setKeepScreenOn 只防息屏,不控亮度;uni.setScreenBrightness 控亮度,但不阻止锁屏。两者权限不同、作用不同,常被误当同一功能使用。
实操要点:
-
uni.setKeepScreenOn({ keepScreenOn: true })要在onShow中调,对应onHide中设为false,否则退出页面后屏幕仍常亮 - Android 需在
manifest.json中声明android.permission.WAKE_LOCK权限,否则无反应 -
uni.setScreenBrightness是异步 API,必须用await或 Promise 处理,不能直接赋值;亮度范围固定为0~1,传1.2或-0.1会被截断但不报错 - Android 还需额外申请
android.permission.WRITE_SETTINGS权限(非 WAKE_LOCK),且需运行时动态请求,iOS/HarmonyOS 不支持该 API
还原亮度不能放在 onHide,而应在全屏退出回调(如视频的 @fullscreenchange)中执行,否则用户已锁屏,再读亮度值已无意义。
锁屏状态下页面还能响应物理按键吗?得靠原生插件接管媒体会话
默认情况下,锁屏后 JS 层无法响应耳机线控、电源键等物理事件。要支持播放/暂停/下一首,必须让原生层注册 MediaSession(Android)或 AVRoute(iOS)。
uni.getBackgroundAudioManager() 内部已封装基础媒体会话,但仅限基础控制。若需定制行为(比如长按耳机键跳过 30 秒、双击唤醒 App),就得引入原生插件:
- Android 插件需在
AndroidManifest.xml中声明android.intent.action.MEDIA_BUTTON广播接收器,并处理Intent中的KeyEvent - iOS 插件需启用
AVFoundation并调用MPRemoteCommandCenter注册命令监听 - 插件与 JS 层通信需通过
uni.requireNativePlugin或plus.runtime.importScript实现双向调用
这类深度集成容易踩坑:比如 Android 上未正确调用 mediaSession.setActive(true),iOS 上未设置 nowPlayingInfo,都会导致锁屏控件不显示或按键无响应。调试时务必用 Xcode / Android Studio 抓原生日志,JS 层日志往往不完整。











