uni.setkeepscreenon仅防息屏,不能防止系统锁屏;真机中console.log不可见,需远程调试或日志输出;onshow中反复调用该api可能导致循环或卡死,应加标记位或延时调用,并在onhide/onunload中配对关闭。

uni-app 里没有“锁屏”功能,也不能控制手机系统级锁屏界面;所谓“常亮”只是防息屏,和锁屏无关。控制台(Console)在真机 App 中默认不可见,调试需靠远程调试或日志输出。
uni.setKeepScreenOn 能不能防止屏幕锁屏
不能。“锁屏”是系统安全机制,由用户手动触发或超时自动进入,uni.setKeepScreenOn 只影响“息屏”(即屏幕变黑关闭),不干预锁屏界面是否弹出。即使屏幕常亮,用户仍可手动按电源键锁屏,或系统在待机策略下强制锁屏(尤其 Android 厂商定制系统)。
- keepScreenOn: true → 屏幕保持点亮状态,但系统仍可显示锁屏界面(如从亮屏状态按电源键)
- keepScreenOn: false → 屏幕按系统设置时间正常熄灭,之后可能自动跳转锁屏
- iOS 上部分机型(如 iPhone X + iOS 13.11.3)存在
uni.setKeepScreenOn失效问题,需降级测试或换用plus.device.setWakelock
App 真机运行时如何看到 console.log
真机 App(Android/iOS 打包后)默认不显示浏览器 DevTools 控制台,console.log 语句不会输出到屏幕,也不会被用户看见——它只进日志管道,需主动捞取。
- 开发阶段:用 HBuilderX 的“运行到手机/模拟器” + “调试”功能,可连上 Chrome DevTools 查看 console
- 打包后真机:需调用
uni.showToast、uni.showModal或写入本地日志文件(uni.getFileSystemManager().writeFile)来暴露关键信息 - Android 可通过 ADB 查看:
adb logcat | grep "console"(前提是 HBuilderX 打包时勾选了“调试模式”) - iOS 需用 Xcode 连接设备,在 Console.app 中筛选进程名(如 com.xxx.xxx)查看日志
为什么 onShow 里反复调用 setKeepScreenOn 会出问题
不是“会出问题”,而是某些 Android 设备在屏幕亮度/状态变化时会误触发 onShow,形成循环调用,甚至卡死页面。官方明确禁止无防护地在 onShow 中直接调用 uni.setKeepScreenOn 或 uni.setScreenBrightness。
- 正确做法:加标记位,例如
this._keepOnSet = true,仅首次进入设一次 - 更稳妥:改用
onReady+setTimeout延迟 100ms 再调,避开初始化抖动 - 必须配对:在
onHide或onUnload中显式关掉,否则退出页面后仍耗电 - 注意生命周期差异:
onHide在切后台时触发,onUnload在页面卸载时触发(如 navigateBack),两者都可能不执行(比如用户强杀 App),所以不能依赖它们 100% 清理
最易被忽略的一点:权限声明后必须重新打包,且 Android 12+ 厂商系统(如小米 HyperOS、华为 HarmonyOS NEXT)可能静默拒绝 WAKE_LOCK,不报错也不生效——此时只能引导用户手动去「电池优化白名单」中授权。别指望代码能绕过系统限制。











