app端无法监听截屏事件,uni.onusercapturescreen仅在小程序生效;android可轮询相册但延迟高、权限受限且rom兼容性差,ios完全不可行;应转向防泄露策略,如canvas动态渲染、动态水印、敏感数据不落地等。

不能直接监听,也无法可靠获取截图内容。 App 端(Android/iOS)原生系统不提供「截屏发生时通知 App」的 API,uni-app 作为 JS 层框架更不可能绕过限制。所谓“监听截屏并拿到图片”,在当前技术条件下是伪需求,实际能做的只有被动响应或提前防御。
uni.onUserCaptureScreen 在 App 端根本不起作用
这个 API 名字很有迷惑性,但它只在微信、支付宝等小程序环境生效。App 端调用 uni.onUserCaptureScreen 会静默失败——不报错、不触发回调、也不抛异常。真机调试时毫无反应,不是代码写错了,而是平台根本不支持。
- Android 实际依赖相册监听(如监听
Pictures/Screenshots/目录新增文件),但需要READ_MEDIA_IMAGES权限,且 iOS 完全不可行 - 插件市场里标榜“App 截屏监听”的插件,多数是轮询相册 + 文件名匹配,延迟高、漏检多、iOS 上因隐私限制根本读不到截图路径
-
uni.setUserCaptureScreen({ enable: false })这类接口,本质是调用 Android 的FLAG_SECURE,它不监听,只让截图变黑——且 iOS 无效
Android 上“监听”本质是相册文件轮询(不推荐)
部分插件(如 uni-usercapturescreen)在 Android 端走的是监听 MediaStore.Images.Media.EXTERNAL_CONTENT_URI 变化的方式。但这不是实时监听,而是定时扫描,问题一堆:
- 首次截图后可能要等 1–5 秒才被发现,用户早把图发出去了
- 需要
android.permission.READ_MEDIA_IMAGES(targetSdkVersion ≥ 30),用户拒绝权限就彻底失效 - 国产 ROM(如 MIUI、OriginOS)常把截图存到私有目录或重命名,导致漏判
- iOS 上此方案完全不可用:
PHPhotoLibrary访问受限,App Store 审核禁止后台相册扫描
真正该做的事:放弃监听,转向防泄露
与其卡在“怎么抓到截图”,不如解决“截图了也白截”。这是目前唯一落地、合规、跨端可行的思路:
- 敏感字段不用 DOM 渲染,改用
canvas动态绘制,每次坐标偏移 1–2px,截图后文字错位或缺失 - 关键页面叠加动态水印:
userId+timestamp+ 设备指纹,每秒微调旋转角度和透明度 - 身份证、银行卡号等不落地:服务端返回加密片段,前端用 WebCrypto 解密后仅内存中短暂显示
- 避免使用
<image src="..."></image>直接加载敏感图,改用canvas.drawImage或 base64 内联生成
FLAG_SECURE 是 Android 唯一靠谱的“防”手段,但它必须在原生层设置,JS 无法触达;iOS 连这个都没有。所有声称“iOS 可监听截图”的方案,要么基于已废弃的 UIApplicationUserDidTakeScreenshotNotification(iOS 13+ 彻底移除),要么是伪造逻辑。别在审核前一刻才发现插件失效。











