//应该分为两篇文章。
ReplayKit:
iOS 9 开始提供了 ReplayKit Extension 进行应用内的录制,只能进行app内的录制(通知,键盘等都无法录制进去),且录制内容不能实时返回,无法进行直播。录制结束后只能通过RPPreviewViewController来进行预览和分享
iOS10:新增了Live Broadcast。Live Broadcast具体是通过Broadcast Upload Extension和Broadcast Setup UI Extension两个扩展,来实现APP内屏幕录制和实时音视频数据获取。获取的数据可直接通过手机传输到第三方流媒体服务,实现直播的效果。
BoardcastUpload是录制开始,结束等生命周期的回调和录制内容的回调,
BoardcastUploadSetupUI,是录制唤起时,自定义的一个配置页面,一般用来关联账户等操作,在录制过程中,可通过RPBroadcastController做开始,暂停,恢复,完成等操作。当录制被其他进程打断(比如打电话)进入后台,默认是暂停录制,当进入前台后,系统会弹窗提示用户是否恢复录制,如果选择恢复,则执行恢复录制操作,反之,则执行完成录制操作。
iOS11实现了系统级的采集,可以实现跨app的录制了(即iOS System Boardcast,BoardCast可以扩展录屏功能,,用户长按录屏后,可以选择app进行录制,或进行屏幕直播。)
iOS 15之后,ReplayKit 提供了 Loop Buffer 功能,开启后应用可以随时调用 API 将最长15秒最新的录制内容导出(大概功能是一直持续缓存最新的15秒内容)
为app添加扩展target:

添加后在工程目录内会增加以下内容:

BoardcastUpload是录制开始,结束等生命周期的回调和录制内容的回调,
BoardcastUploadSetupUI,是录制唤起时,可以自定义的一个页面,一般用来让用户配置一些参数(比如账户,美颜等)
APP内有两种唤起录屏的方式:
第一种:用于唤起其他直播app,来录制并直播自己的内容。(多用于将自身的app录屏数据传给其他直播app平台)
比如:APP-1是带直播功能的app,APP-2是需要被直播的app,比如游戏,如果APP-1包含RPScreenRecorder模块。那么我们就可以让我们的APP-2 在APP-1的直播平台直播
APP-1需要添加BoardCast-Extension。并实现BoardcastUpload(数据处理模块)和BoardcastUploadSetupUI(自定义直播配置模块)
APP-2中添加以下代码:
//添加以下代码,执行时,会从底部弹出系统菜单,菜单中展示了手机上支持RPScreenRecorder的app供选择
RPBroadcastActivityViewController.load { vc, error in
guard let boardSelect = vc else {return}
vc?.delegate = self
self.present(boardSelect, animated: true)
}
//添加 代理,当系统菜单操作finish时,回调。在此方法中,一般需要将弹出的broadcastActivityViewController隐藏:
func broadcastActivityViewController(_ broadcastActivityViewController: RPBroadcastActivityViewController, didFinishWith broadcastController: RPBroadcastController?, error: Error?) {
broadcastActivityViewController.dismiss(animated: true)
broadcastController?.startBroadcast(handler: { _ in
if error == nil {
}else{
print(error)
}
})
}
第二种:一般用于自身实现了录屏直播相关功能的app,调用后开启自己的录屏服务并进行后续处理:
//定义属性:用来获取显示的
var broadPickerView :RPSystemBroadcastPickerView!
...
...
//在你的页面中添加按钮:
let broadPickerView = RPSystemBroadcastPickerView.init(frame: CGRect(x: 5, y: 5, width: 50, height: 50))
//设置唤起的页面中,仅展示指定的扩展项,参数为扩展的Bundle Identifier。可以不设置,那么在
broadPickerView.preferredExtension = "com.konka.yimutiscreen.YiMutiScreen.BoardcastUpload"
self.broadPickerView = broadPickerView //
self.view..addSubview(broadPickerView)
用于进程之间通讯,比如app_extension与主app之间通讯。
有个坑,CFNotificationCenterPostNotification的userinfo无论怎么设置,在通知接收的时候都为空。