uni-app无法在app端真正禁止截屏,仅android可通过flag_secure实现黑屏防护,ios无系统级支持;uni.onusercapturescreen仅小程序可用,app端调用静默失败。

uni-app 无法在 App 端真正“禁止截屏”,只能对 Android 做有限防护(FLAG_SECURE),iOS 完全无系统级支持;所谓“监听截图”在 App 环境下是无效的,uni.onUserCaptureScreen 仅在微信/支付宝等小程序中可用,App 端调用会静默失败。
Android 端用 FLAG_SECURE 防截屏(唯一可靠方式)
这不是监听,而是让系统截图/录屏时捕获到黑屏或空白内容,是 Android 官方支持的隐私保护机制。
-
FLAG_SECURE必须在 Activity 的onCreate()中设置,且严格要求在super.onCreate()之后、setContentView()之前调用 - uni-app 无法直接写 Java/Kotlin,必须通过原生插件实现:常见做法是用
plus.android.invoke调用getWindow().addFlags(0x00002000) - 若只对某页面启用,进入时加 flag,离开时必须调用
clearFlags(0x00002000),否则后续所有页面都黑屏截图 - 注意国产 ROM(如 MIUI、OriginOS)可能绕过该 flag,或弹出“应用正在阻止截图”提示,反而暴露敏感性
- WebView 内容、
<canvas></canvas>渲染区域、部分<video></video>播放画面也可能变黑,需实测兼容性
iOS 端没有防截屏能力,所有 JS 层方案均无效
苹果未开放任何系统接口允许 App 拦截或监听截图行为,UIApplicationUserDidTakeScreenshotNotification 自 iOS 13 起已彻底移除,监听必然失败。
- JS 无法访问相册路径、无法轮询最新图片、无法读取截图文件——iOS 权限模型和 App Store 审核规则双重封死
- 所谓“动态检测截图”的插件,基本依赖伪造逻辑(如监听音量键、屏幕亮度变化),在 iOS 上完全不可靠
-
UIScreen.isProtectedData或UIView.isSecureTextEntry类属性对界面渲染无实际遮蔽效果 - 不要在项目里写
uni.onUserCaptureScreen并期望它在 iOS App 中触发——它根本不会执行回调
别信“一键禁用截屏”的插件,重点看它是否真调用了原生层
市面上很多名为 Ba-ScreenShot、uni-usercapturescreen 的插件,表面封装了 disable() / enable() 方法,但实际效果取决于底层实现。
- 检查插件源码:是否在 Android 侧调用了
addFlags(FLAG_SECURE)?是否做了clearFlags清理? - 是否声明仅支持 Android?若宣称“iOS 同样生效”,基本可判定为虚假宣传
-
uni.setUserCaptureScreen({enable: false})是 DCloud 提供的扩展 API,但它本质仍是封装原生 flag 调用,不改变 iOS 无能力的事实 - 使用前务必真机测试:截一张图 → 查看相册是否有新图 → 截图内容是否为空/黑屏 → 切换页面后是否恢复正常
真正容易被忽略的点是:FLAG_SECURE 不影响用户用电脑(如 scrcpy、QuickTime)投屏截取,也不阻止硬件按键组合(如电源+音量下)在部分 ROM 上的绕过;与其花精力堵漏洞,不如让截图内容本身失效——比如敏感字段用 <canvas></canvas> 动态绘制、叠加带 userId 和时间戳的浮动水印、关键页禁用长按和复制。这些才是 App 端现阶段更务实的防线。











