接到一个跨应用录屏的需求,要求封装成SDK给到别的团队去使用,调研了一波录屏相关的实现,iOS目前唯一能实现的怕也只是基于ReplayKitBroadcast Upload Extension

但是有一定局限性,在控制中心启动录屏,如果手机存在多个应用支持该方式录屏,长按出现一个可选列表,很容易选错或者误操作, 可能苹果也想到了这一点在iOS12以上则可以在应用内调用启动录屏,就是UI不易定制,得用苹果自带的UI或者hack按钮点击(hack有一定风险 后续版本如果UI层级改变或者实现方式改变就得跟着改 万一出现问题容易出现生产事故)

主要思路

  • 宿主需要获得视频文件或者视频流进行业务处理, 这里就涉及到进程间通信,目前了解到的实现方案有

    • 如果是录制视频文件则可以采用 App Groups 实现文件沙盒共享

    • 如果是视频流数据 可以通过本地Socket服务, 建立长链接进行通信

  • 录屏回调事件转发,采用底层的通知中心(CFNotificationCenterGetDarwinNotifyCenter)从拓展发送给宿主,然后宿主进行转发处理

  • 创建Broadcast Upload ExtensionSampleHandler里处理视频数据的写入,转发回调等逻辑,也可以封装一个framework专门处理视频写入以及进程通信

目前遇到的问题

  1. 应用切到后台,点击左上角红点结束录屏,使用CFNotificationCenterGetDarwinNotifyCenter通知宿主,控制台打印没有及时显示,而是等应用切到前台才有打印, 这里涉及到停止录屏的后续操作,跨应用录屏的话停止录屏时,宿主应用应该需要知道已经结束录屏了,然后回到宿主应用内进行下一步的业务逻辑… 这一个问题还需进一步验证,那就是在拓展里SampleHandler结束回调时,尝试直接打开唤醒宿主应用 (PS: 目前没有找到好的办法,只能手动返回宿主应用才能收到回调)

  2. 集成问题也比较复杂,不像普通SDK只需拖拽一个framework就完事了,这个还需项目新建target Broadcast Upload Extension 添加录屏处理的代码,然后还要新建App Group进行关联

未经作者授权,禁止转载

THE END