更新记录

1.5(2026-03-18)

1、ios录屏插件包优化

1.4(2026-03-14)

1、优化安卓录屏代码 2、增加ios录屏功能

1.3(2025-08-15)

1、修复了后台截屏报错的bug 2、优化了截屏时机,解决有时候会把授权弹窗截屏进去的bug

查看更多

平台兼容性

Android Android CPU类型 iOS
适用版本区间:8.1 - 16.0 armeabi-v7a:未测试,arm64-v8a:未测试,x86:未测试 适用版本区间:12 - 18

原生插件通用使用流程:

  1. 购买插件,选择该插件绑定的项目。
  2. 在HBuilderX里找到项目,在manifest的app原生插件配置中勾选模块,如需要填写参数则参考插件作者的文档添加。
  3. 根据插件作者的提供的文档开发代码,在代码中引用插件,调用插件功能。
  4. 打包自定义基座,选择插件,得到自定义基座,然后运行时选择自定义基座,进行log输出测试。
  5. 开发完毕后正式云打包

付费原生插件目前不支持离线打包。
Android 离线打包原生插件另见文档 https://nativesupport.dcloud.net.cn/NativePlugin/offline_package/android
iOS 离线打包原生插件另见文档 https://nativesupport.dcloud.net.cn/NativePlugin/offline_package/ios

注意事项:使用HBuilderX2.7.14以下版本,如果同一插件且同一appid下购买并绑定了多个包名,提交云打包界面提示包名绑定不一致时,需要在HBuilderX项目中manifest.json->“App原生插件配置”->”云端插件“列表中删除该插件重新选择


android屏幕录制插件使用文档(ios集成方式在下面)

使用前提与注意事项

(1)录屏的时候如果需要声音输入需录音权限(android.permission.RECORD_AUDIO),无声录制可以不用授权

(2)uniapp导入插件后需要重新制作自定义基座才生效

使用步骤

引入插件

onLoad() {
    //引入插件这个操作初始化一次就可以,把screenModule存成全局变量
    this.screenModule = uni.requireNativePlugin('cfy-screen')
},

开始录屏

//开始录屏
startRec() {
    /*
    传递参数说明:
        duration:表示最大录屏时间,接收int类型的数据,单位为秒。默认值为0,表示无时长限制,比如传60代表最长录制时间为60秒,60秒后自动停止。
        voiceStatus:是否有声音,接收int类型的数据,默认值为1,1代表开启声音录制,0代表关闭声音录制。
    */
   let that = this
    const palm = {"duration":0, "voiceStatus": 1}
    this.screenModule.jhfStartScreen(palm, initObj => {
        console.log("初始化参数",initObj)//{"code":1}
        if(initObj.code == 1){
            uni.showToast({
                title: '录屏开启成功',
                icon: 'none'
            })
            //
            that.recordStatus = "录屏中"

        }else if(initObj.code == -100){
            console.log("服务中断")
            that.recordStatus = "录屏服务中断"
        }

    },finishObj=>{
        console.log("录屏结束返回参数",finishObj)
        /*"filePath": "/storage/emulated/0/Android/data/uni.UNIC2FEEDC/files/Documents/2024-10-29-10-36-18.mp4"
        //录屏的存储路径,拿到这个路径之后可以做后续操作,上传、存相册、或者展示等
        */
        uni.showToast({
            title: '录屏完成',
            icon: 'none'
        })
        that.recordStatus = "录屏完成"
    })
},

暂停录屏

//暂停录屏
pauseRec() {
    this.screenModule.jhfPauseScreen()
    this.recordStatus = "暂停中"
},

继续录屏

resumeRec() {
    this.screenModule.jhfResumeScreen()
    this.recordStatus = "录屏中"
},

结束录制

stopRec() {
    //停止录制,结束录屏之后参数在启动录屏传递的第二个回调方法中获取
    this.screenModule.jhfStopScreen()
},

开始截屏


//开始截屏
captureScreen(){
    let that = this
    uni.showLoading({
        title:"加载中"
    })
    /*
    传递参数说明:
        imgType:保存的截屏图片类型,接收string类型,默认值是“jpg”,可以传递jpg和png
    */
    const palm = {
        "imgType":"png",
    }
    that.shortStatus = "截屏准备中"
    this.screenModule.jhfStart_CaptureScreen(palm,finishObj=>{
        console.log("截屏结束回掉",finishObj)
        uni.showToast({
            title: '截屏完成',
            icon: 'none'
        })

        uni.hideLoading()

        that.shortStatus = "截屏完成"

    })

}


iOS屏幕录制插件使用文档

一、插件概述

本插件为UniApp项目提供iOS屏幕录制功能,支持系统级录制、应用外录屏及麦克风声音采集。

⚠️ 重要提示:iOS录屏涉及应用扩展、多进程、多配置文件,集成前请仔细阅读本文档并按步骤操作。

二、核心概念

iOS录屏需要三个核心标识,它们的命名规则直接影响功能可用性(必须按照下面的规则命名):

标识类型 命名规则 示例
主应用ID 自定义 com.plugin.screen
App Group group. + 主应用ID group.com.plugin.screen
扩展ID 主应用ID + .screenRecorder com.plugin.screen.screenRecorder

三、Apple开发者后台配置

1、创建AppGroup

  • 登录 Apple Developer 中心

  • 进入 Certificates, Identifiers & Profiles → Identifiers

  • 点击 + → 选择 App Groups → Continue

  • ⚠️ AppGroups不能随便创建,名称必须为:group. + 主应用ID(如 group.com.plugin.screen)

2、创建主应用的Identifiers

  • Identifiers → + → 选择 App IDs → Continue

  • 填写Bundle ID(如 com.plugin.screen)

  • 启用 App Groups 能力,选择已创建的App Group

3、创建录屏扩展应用Extension的Identifiers

  • Identifiers → + → 选择 App IDs → Continue

  • ⚠️ Bundle ID必须为:主应用ID + .screenRecorder(如 com.plugin.screen.screenRecorder

  • ⚠️ 扩展创建的时候不能选择App Clip,要选择App,Capabilities中仅勾选 App Groups,其他不要勾选

  • 启用 App Groups 能力,选择跟主应用ID同一个App Group

  • 注意:不管是主应用的id还是扩展的id,必须启用App Groups 能力,并且主应用和扩展选择同一个AppGroups

4、生成描述文件

为主应用和扩展分别生成描述文件:

  • 调试用:类型选择 iOS App Development

  • 上架用:类型选择 App Store Connect

证书制作方式与常规iOS应用相同,本文不再赘述。

5、 最后总结一下重点:

  1. 主应用ID:随便创建,比如com.plugin.screen
  2. App Groups,不能随便创建,必须是 group. 加上主应用的Identifiers,比如group.com.plugin.screen
  3. 扩展Extension的Id,不能随便创建,必须是主应用的Identifiers 加上 .screenRecorder,比如com.plugin.screen.screenRecorder

四、插件集成

1、扩展配置

(1)、在项目跟目录下创建nativeplugins文件夹

(2)、在nativeplugins下新建文件夹cfy-screen

(3)、将生成的扩展描述文件ios-xxx.mobileprovision放到cfy-screen文件夹下

  • 根据环境选择描述文件,比如你要调试那就选择扩展的调试的描述文件,假如你要上线appstore那就选择正式的描述文件

  • ⚠️ 文件名必须以 ios- 开头(如 ios-development.mobileprovision)

(4)、在cfy-screen文件夹下新建ios-extension.json文件,内容如下。

  • ⚠️ 注意下面注释内容,替换成自己的,然后把注释去掉

  • ⚠️ 注意下面注释内容,替换成自己的,然后把注释去掉

  • ⚠️ 特别注意:下面文件中不能有注释,项目中一定把注释去掉,我这里是备注提醒大家配置

  • ⚠️ 特别注意:下面文件中不能有注释,项目中一定把注释去掉,我这里是备注提醒大家配置

{
  "ScreenRecorderExtension.appex": {
    "identifier": "com.testscreen.plugin.screenRecorder", //扩展的ID
    "profile": "ios-develop.mobileprovision", //扩展描述文件的名称(刚才移动进来的跟该文件同级目录下)
    "plists": {
      "CFBundleDisplayName": "扩展名称", //该名称录屏的时候弹窗会显示(一般跟自己主应用一致就可以)
      "NSExtension": {
        "NSExtensionAttributes": {
          "RPVideoExtensionBundleIdentifier": "com.testscreen.plugin.screenRecorder" //扩展的ID
        },
        "NSExtensionPointIdentifier": "com.apple.broadcast-services-upload",
        "NSExtensionPrincipalClass": "SampleHandler"
      }
    },
    "entitlements": {
      "com.apple.security.application-groups": ["group.com.testscreen.plugin"] //AppGroups
    }
  }
}

完成上面配置后目录如下

├── nativeplugins/
│ └── cfy-screen/
        ├── ios-develop.mobileprovision # 扩展描述文件(注意这里是扩展的描述文件,不是主应用的,名称必须以ios-开头)
│       ├── ios-extension.json #该文件中不能有注释
└──

五、项目配置

1、manifest中capabilities配置

  • 打开 manifest.json,点击最下面的 “源码视图”

  • 找到app-plus节点 ---> distribute节点 --> ios节点(没有上面节点就创建),然后在ios节点下添加下面内容:

//group.com.testscreen.plugin替换成在开发者账号中创建的AppGroups
"capabilities" : {
    "entitlements" : {
      "com.apple.security.application-groups" : [ "自己的AppGroups"  ]
    }
}
  • ⚠️ 特别注意:上面[]中的内容一定要替换成自己的AppGroups,跟上面ios-extension.json文件中com.apple.security.application-groups节点下内容一致
  • ⚠️ 特别注意:下面文件中不能有注释,项目中一定把注释去掉,我这里是备注提醒大家配置
  • 添加完后应该是像这样的(不要有注释,把所有注释去掉)
   "app-plus" : {
        /* 应用发布信息 */
        "distribute" : {
            /* ios打包配置 */
            "ios" : {
                //这里可能还有其他配置,不同项目配置不一样,不用管,只要关注下面节点有没有
                "capabilities" : {
                    "entitlements" : {
                        "com.apple.security.application-groups" : [ "自己的AppGroups" ]
                    }
                }
            },
        },

    },

2、选择插件

  • 打开 manifest.json

  • 进入 App原生插件配置 → 选择云端插件 → 选择cfy-screen插件

3、配置权限

  • 录屏需要使用到麦克风权限,需要在manifest.json基础配置中的 安卓/ios权限模块 配置麦克风权限NSMicrophoneUsageDescription
  • 描述内容尽量详细一些,比如:录屏功能需要使用麦克风权限以录制环境声音,是否允许?
  • 如果需要调用到视频保存相册,那还必须开启相册读写权限

4、制作自定义基座或者云打包

  • Bundle ID:必须选择主应用ID(如 com.plugin.screen)

  • 证书:调试选开发证书,发布选发布证书

  • 描述文件:选择主应用对应的描述文件

  • ⚠️ 云打包或者自定义基座用的是主应用的ID以及描述文件

  • ⚠️ 修改manifest.json文件或更换插件包后,必须重新制作自定义基座才能生效。

六 插件使用

插件提供两种使用方式,开发者可根据上架需求选择。

1、方式一:系统录屏按钮(推荐)

使用iOS系统原生的录屏按钮,完全遵循苹果官方规范,无上架审核风险。

  • 优点:完全遵循苹果官方规范,审核100%通过

  • 缺点:无法自定义录屏按钮以及启动事件,但可通过CSS调整按钮位置

  • 缺点:⚠️ 必须在 nvue 页面中使用 vue页面中使用会显示不出来录屏按钮

<template>
  <view class="content">
    <text class="tips">提示:下方为iOS系统录屏按钮,位置可通过CSS自定义</text>
    <text class="tips"
      >注意:网络上有非官方方式捕获录屏事件,但上架审核会被拒绝</text
    >

    <cfy-screen-component
      ref="screenComp"
      style="width: 40rpx; height: 40rpx; margin-top: 40rpx;"
    />

    <button class="button" @click="checkAndGetOmissionFile">
      获取遗漏文件
    </button>
    <button class="button" @click="getAllScreenFile">获取所有录屏文件</button>
    <button class="button" @click="deleteAllScreenFile">
      清空所有录屏文件
    </button>
    <button class="button" @click="saveFileToAlbum">保存到相册</button>
    <button class="button" @click="playRecordedVideo">播放录屏</button>
  </view>
</template>

<script>
  export default {
    data() {
      return {
        filePath: "",
      };
    },
    onLoad() {
      // 确保DOM渲染完成后再获取组件实例
      this.$nextTick(() => {
        this.initScreenRecorder();
      });
    },
    methods: {
      // 初始化录屏监听
      initScreenRecorder() {
        this.$refs.screenComp.setupScreenData({}, (ret) => {
          console.log("录屏回调", ret);
          if (ret && ret.path) {
            this.filePath = ret.path;
          }
        });
      },

      // 获取遗漏文件(因App闪退等原因未返回的文件)
      // 返回值:文件路径数组
      checkAndGetOmissionFile() {
        this.$refs.screenComp.checkAndgetOmissionFile({}, (fileArr) => {
          console.log("遗漏文件", fileArr);
        });
      },

      // 获取所有录屏文件
      // 返回值:文件路径数组
      getAllScreenFile() {
        this.$refs.screenComp.getAllAScreenFile({}, (fileArr) => {
          console.log("所有录屏文件", fileArr);
        });
      },

      // 清空所有录屏文件(建议定期清理,避免占用空间)
      deleteAllScreenFile() {
        this.$refs.screenComp.deleteAllAScreenFile({}, (ret) => {
          console.log("清空完成", ret);
        });
      },

      // 保存视频到相册
      saveFileToAlbum() {
        if (!this.filePath) {
          uni.showToast({ title: "暂无录屏文件", icon: "none" });
          return;
        }
        this.$refs.screenComp.saveToAlbum(this.filePath, (ret) => {
          console.log("保存回调", ret);
        });
      },

      // 播放录屏文件
      playRecordedVideo() {
        if (!this.filePath) {
          uni.showToast({ title: "暂无录屏文件", icon: "none" });
          return;
        }
        this.$refs.screenComp.playRecordedVideo(this.filePath, (ret) => {
          console.log("播放回调", ret);
        });
      },
    },
  };
</script>

2、方式二:自定义录屏事件(慎用)

通过非官方技术手段捕获录屏启动事件,可实现完全自定义的录屏交互。

  • 优点:可完全自定义录屏触发事件,交互更灵活
  • 优点:可以在vue以及nvue页面中使用
  • 缺点:存在上架被拒风险,不建议提交App Store的应用使用
<template>
  <view class="content">
    <text class="tips warning"
      >⚠️ 警告:此方式非苹果官方支持,上架可能被拒</text
    >
    <text class="tips">建议仅用于企业内部应用或个人测试</text>

    <button class="screen" @click="startScreen">
      {{isScreening?'停止录屏':'开始录屏'}}
    </button>

    <button class="button" @click="checkAndgetOmissionFile">
      获取遗漏文件
    </button>
    <button class="button" @click="getAllAScreenFile">获取所有录屏文件</button>
    <button class="button" @click="deleteAllAScreenFile">
      清空所有录屏文件
    </button>
    <button class="button" @click="saveFileToaum">保存相册</button>
    <button class="button" @click="playRecordedVideo">播放文件</button>
  </view>
</template>

<script>
  export default {
    data() {
      return {
        filePath: "",
        screenComp: null,
        isScreening: false,
      };
    },
    onLoad() {
      this.screenComp = uni.requireNativePlugin("cfy-screen-module");
    },
    methods: {
      //开始录屏按钮
      startScreen() {
        const that = this;
        this.screenComp.setupScreenData({}, (ret) => {
          console.log("录屏回掉", ret);
          if (!ret) return;
          if (ret.code == 0) {
            //开始录屏
            that.isScreening = true;
          } else {
            that.isScreening = false;
            if (ret.path) {
              this.filePath = ret.path;
            }
          }
        });
      },
      // 获取遗漏文件(因App闪退等原因未返回的文件)
      // 返回值:文件路径数组
      checkAndGetOmissionFile() {
        this.$refs.screenComp.checkAndgetOmissionFile({}, (fileArr) => {
          console.log("遗漏文件", fileArr);
        });
      },

      // 获取所有录屏文件
      // 返回值:文件路径数组
      getAllScreenFile() {
        this.$refs.screenComp.getAllAScreenFile({}, (fileArr) => {
          console.log("所有录屏文件", fileArr);
        });
      },

      // 清空所有录屏文件(建议定期清理,避免占用空间)
      deleteAllScreenFile() {
        this.$refs.screenComp.deleteAllAScreenFile({}, (ret) => {
          console.log("清空完成", ret);
        });
      },

      // 保存视频到相册
      saveFileToAlbum() {
        if (!this.filePath) {
          uni.showToast({ title: "暂无录屏文件", icon: "none" });
          return;
        }
        this.$refs.screenComp.saveToAlbum(this.filePath, (ret) => {
          console.log("保存回调", ret);
        });
      },

      // 播放录屏文件
      playRecordedVideo() {
        if (!this.filePath) {
          uni.showToast({ title: "暂无录屏文件", icon: "none" });
          return;
        }
        this.$refs.screenComp.playRecordedVideo(this.filePath, (ret) => {
          console.log("播放回调", ret);
        });
      },
    },
  };
</script>

隐私、权限声明

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

安卓: android.permission.RECORD_AUDIO 录音权限 (选择有声录制需要,无声录制不需要) IOS: NSMicrophoneUsageDescription 录音权限

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

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