更新记录

1.0.0(2026-05-26)

  • feat: Android / iOS / HarmonyOS 防截屏防录屏(key 叠加)
  • feat: Android / iOS 截图监听;HarmonyOS 暂不支持
  • feat: Android / iOS 录屏状态回调(Android 尽力检测)
  • feat: iOS App Switcher 模糊保护
  • feat: resetAllSecure、截图权限检测与跳转设置 API
  • docs: readme 补充 key 叠加机制说明
  • refactor: 插件 id 重命名为 ly028-NScreenshot(≤20 字符)

平台兼容性

uni-app(3.7.7)

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
- - × × - - 5.0 12 -
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 小红书小程序 快应用-华为 快应用-联盟
× × × × × × × × × × × ×

uni-app x(4.0)

Chrome Safari Android iOS 鸿蒙 微信小程序
- - 5.0 12 - -

ly028-NScreenshot

UTS 防截屏防录屏插件,支持 Android / iOS / HarmonyOS。

平台能力

能力 Android iOS HarmonyOS
禁止截屏/录屏 √ FLAG_SECURE √ secure layer √ privacy mode
截图监听 √ 尽力而为 √ 系统通知 ×
录屏状态 √ 尽力检测 √ isCaptured 有限
App Switcher 模糊 × ×

快速开始

  1. 导入 uni_modules/ly028-NScreenshot
  2. 制作自定义调试基座(必须)
  3. 业务代码:
import { enableSecure, disableSecure } from '@/uni_modules/ly028-NScreenshot'

enableSecure({ key: 'pay-page' })
// ...
disableSecure({ key: 'pay-page' })

API

防截屏 / 防录屏

方法 说明
enableSecure(options?) 开启保护,支持 key 叠加
disableSecure(options?) 关闭指定 key;全部 key 关闭后才解除保护
isSecureEnabled(key?) 查询状态(不传 key 查全局;传 key 查指定 key)
setSecureEnabled(enabled, options?) 便捷开关
resetAllSecure() 清除全部 key 并同步关闭原生保护

key 叠加机制(重要)

enableSecure / disableSecure 的可选参数 key,用于多处同时开启防截屏、互不误关

作用

插件内部用 Map<key, 引用次数> 管理保护状态:

  • enableSecure({ key: 'xxx' }) → 该 key 计数 +1
  • disableSecure({ key: 'xxx' }) → 该 key 计数 -1,减到 0 时移除
  • 仅当所有 key 都关闭,才会真正解除系统级防截屏/防录屏(如 Android FLAG_SECURE

不传 key 时,默认使用 default

典型场景

场景 用法
支付页 onShowenableSecure({ key: 'pay-page' })onHidedisableSecure({ key: 'pay-page' })
详情页 使用独立 key,如 'detail-page'
全 App 单点开关 不传 key,或统一使用 default

这样 A 页面 onHide 关闭自己的 key 时,若 B 页面仍持有 key,不会误关 B 页面的保护。

key 命名

可自定义,只要是字符串且 enable/disable 成对使用即可,例如 'pay-page''order-detail''secure-page'

建议:

  1. 语义化:见名知意,表示哪个页面/模块
  2. 成对使用:同一处 enable/disable 必须用同一 key
  3. 避免冲突:不同页面/模块使用不同 key
  4. 集中管理:复杂项目可将 key 定义为常量,避免拼写不一致

查询状态

调用 含义
isSecureEnabled() 是否有任意 key 仍处于保护中(全局状态)
isSecureEnabled('pay-page') 仅查询 pay-page 这个 key 是否开启

注意事项

1. 同一 key 多次 enable 需对应多次 disable

enableSecure({ key: 'pay-page' })
enableSecure({ key: 'pay-page' })  // 计数 = 2

disableSecure({ key: 'pay-page' })  // 计数 = 1,保护仍在
disableSecure({ key: 'pay-page' })  // 计数 = 0,才真正关闭

一般每个页面在 onShow enable 一次、onHide disable 一次即可,避免重复调用。

2. 一键清除所有 key

import { resetAllSecure } from '@/uni_modules/ly028-NScreenshot'

resetAllSecure()

页面级示例

import { enableSecure, disableSecure } from '@/uni_modules/ly028-NScreenshot'

const PAGE_KEY = 'pay-page'

export default {
  onShow() {
    enableSecure({ key: PAGE_KEY })
  },
  onHide() {
    disableSecure({ key: PAGE_KEY })
  }
}

截图监听

方法 说明
hasScreenshotListenPermission() 是否已授予截图监听所需读取权限(Android)
getScreenshotListenPermissionName() 当前宿主应申请的权限名(Android)
openScreenshotPermissionSettings() 跳转应用权限设置页(Android)
onScreenshot(callback) 注册监听,返回 { id, remove() }
offScreenshot(subscription?) 取消监听

HBuilderX 4.25+ 请使用 onScreenshot 命名以支持持续回调。

录屏状态

方法 说明
onCaptureStateChange(callback) { captured: boolean }
offCaptureStateChange(subscription?) 取消监听

iOS 多任务保护

方法 说明
setAppSwitcherProtection({ enabled, intensity }) 切后台时模糊

调试

方法 说明
setLogEnabled(boolean) 开关日志
isLogEnabled() 查询日志开关

日志前缀:[ly028-NScreenshot]

截图 / 录屏监听(Android 注意)

场景 说明
已开启防截屏 请先关闭再测截图监听;FLAG_SECURE 下系统往往无法截图,监听收不到事件
截图监听 需读取相册/存储权限;通过 MediaStore 变化尽力检测,不同厂商路径可能漏报
录屏监听 Android 尽力检测(音频会话 + 录屏视频路径);非 100% 准确;iOS 用 isCaptured
开始录屏监听 注册后应立即收到一条 captured=false;若没有,请重新制作自定义基座

正确测试顺序:

  1. 关闭所有防截屏 key
  2. 点「开始截图监听」→ 授予权限 → 用系统按键截屏
  3. 点「开始录屏监听」→ 确认日志出现 captured=false → 再开系统录屏测试

权限

  • Android 禁止截屏/录屏:无额外权限
  • Android 截图监听:按宿主 targetSdkVersion 选择权限——targetSdk ≥ 33READ_MEDIA_IMAGES(需在 manifest.json 声明);targetSdk ≤ 32READ_EXTERNAL_STORAGE(插件 manifest 已声明)
  • iOS / HarmonyOS 禁止能力:无额外权限;HarmonyOS 插件 module.json5 已声明 ohos.permission.PRIVACY_WINDOW

targetSdk ≥ 33 且需要截图监听时,请在宿主 manifest.json → App 权限配置 中添加 READ_MEDIA_IMAGES。无权限时不应开启截图监听,需引导用户到系统设置授权。

iOS 限制 FAQ

  • 苹果无官方「禁止截图」API;插件使用 secure layer 使截图内容变黑
  • 物理拍照、部分辅助功能场景无法完全拦截
  • 录屏时插件可展示全屏遮罩

HarmonyOS 说明

  • 使用 setWindowPrivacyMode 系统级拦截截屏/录屏
  • 截图监听暂无稳定公开 API
  • 请在真机验证(模拟器可能无法体现效果)

本地调试

HBuilderX 打开 ly028-NScreenshot → 自定义基座 → 真机运行。

修改 utssdk/**/*.uts 后需重新制作自定义基座。

隐私、权限声明

1. 本插件需要申请的系统权限列表:

Android 禁止截屏/录屏:无额外权限;Android 截图监听:targetSdk≥33 用 READ_MEDIA_IMAGES(宿主 manifest 声明)、targetSdk≤32 用 READ_EXTERNAL_STORAGE;iOS/HarmonyOS 禁止能力本身无额外权限

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集任何数据

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率: