uni.onusercapturescreen 在 app 端根本不会触发,仅小程序平台有效;app 端无系统级截图通知机制,android 可用 flag_secure 屏蔽截屏,ios 则完全无法监听或阻止。

uni.onUserCaptureScreen 在 App 端根本不会触发
直接说结论:uni.onUserCaptureScreen 在 Android/iOS App 环境下调用后静默失败,既不报错也不回调——它只在微信、支付宝等小程序平台有效。你在 onLoad 里写了这个监听,真机跑 App 却没反应,不是代码写错了,是平台根本不支持。
常见错误现象:开发者误以为这是跨端通用 API,把小程序逻辑直接搬进 App 页面,结果测试时截图毫无响应;更隐蔽的问题是,某些插件市场里的“截屏监听”插件,底层其实是轮询相册目录(仅 Android),但需要读存储权限,且 iOS 完全无效、Android 新版本(10+)因 Scoped Storage 权限限制也大概率失败。
- 必须确认当前运行环境:
uni.getSystemInfoSync().platform === 'app'时,别走uni.onUserCaptureScreen这条路 - App 端没有系统级「截图发生」通知机制,iOS 连废弃的
UIApplicationUserDidTakeScreenshotNotification都已不可靠,Android 的ACTION_SCREENSHOT广播也被厂商阉割或需 AccessibilityService 权限(用户拒绝率极高) - 所谓“防抖监听”,本质是混淆了两个概念:防抖(debounce)是对高频事件做节流,而截屏本身是低频、不可预测的离散事件——你没法对“用户什么时候截”做防抖,只能对“检测到截图后的响应动作”做节流
Android 端唯一靠谱方案:FLAG_SECURE + 原生插件
不是监听,是屏蔽显示内容。FLAG_SECURE 是 Android 官方支持的隐私标志,设上后系统截图/录屏/投屏捕获到的是黑屏或空白区域,连相册里都不会生成有效文件。
实操关键点全在原生层:
- 必须在 Activity 的
onCreate中设置,且顺序严格:super.onCreate()→getWindow().setFlags(FLAG_SECURE, FLAG_SECURE)→setContentView() - 若只对某页面启用,进入时设 flag,离开时必须调用
clearFlags(WindowManager.LayoutParams.FLAG_SECURE);漏掉这步会导致后续所有页面都黑屏截图 -
uni-app 无法直接写 Java/Kotlin,得通过
uni_modules自定义原生插件,在插件的MainActivity或指定页面的onCreate里注入逻辑 - 注意兼容性陷阱:MIUI/ColorOS 等定制 ROM 可能弹出“应用正在阻止截图”提示,反而暴露敏感意图;部分 WebView 内容(如 canvas 渲染、video 全屏)在新系统上仍可能被截出部分内容
iOS 端没有防截屏能力,别信任何 JS 层“监听”方案
iOS 系统层不开放禁用截屏接口,也没有稳定可用的通知机制。UIApplication.userDidTakeScreenshotNotification 自 iOS 13 起已失效,目前所有声称能在 iOS App 里监听截屏的 uni-app 插件,要么是伪造(比如监听音量键、屏幕亮度变化),要么依赖私有 API(审核必拒)。
JS 层连相册路径都读不到,plus.gallery.save 只能存图不能查图,定时轮询相册 + 像素比对?耗电、不准、iOS 权限默认拒绝,纯属徒劳。
- 别浪费时间调试
uni.setUserCaptureScreen({enable: false})在 iOS 上的效果——它在 iOS App 端无实际作用,文档里写的“支持”是历史遗留表述 - 所谓“防”,只能退到被动响应:用原生插件注册通知(即使延迟 1–3 秒)、触发后模糊当前视图或弹
uni.showToast,但无法撤回已发生的截屏 - 苹果审核明确反对干扰系统功能,频繁弹窗警告可能被拒(尤其支付类页面)
真正该做的:让截图失去价值
与其卡在“监听不到”的技术死胡同,不如转向务实策略——截了也白截。
- 敏感信息不用纯文本渲染:身份证号、订单号等用 canvas 动态绘制,或拆成多个
view+ 透明度扰动,截图后难以 OCR 识别 - 动态水印必须绑定用户身份:时间戳 + 用户 ID + 设备指纹,水印位置随机偏移,且每帧 canvas 渲染时重绘,静态截图水印易被 P 图抹除
- 核心数据不落地:视频流、加密文档用 DRM 或临时 token 加载,本地不留明文缓存;截图只能拿到模糊帧或占位图
- 最易被忽略的细节:canvas 渲染性能是否掉帧?水印字体大小在不同屏幕密度下是否可读?这些没统一标准,得逐个页面调参验证











