屏幕共享
融云 RTCLib SDK 为开发者提供了屏幕共享插件,屏幕共享功能以插件库形式提供,开发者可自行选择是否向项目中集成 RongRTCReplayKitExt 插件库来实现屏幕共享功能。RongRTCReplayKitExt 插件用于拓展 target 上使用。
- 屏幕共享功能在 RongRTCLib 5.1.8.1 及以后支持。
- 屏幕共享库 RongRTCReplayKitExt 依赖的 RongRTCLib 版本必须大于等于 5.1.8.1
环境要求
- iOS: iOS12 及以上。
- RongRTCLib: 5.1.8.1 及以上。
- RongRTCReplayKitExt: 5.1.8.1 及以上。
实现方式
我们可以通过苹果的 Extension 来实现屏幕共享技术。这里我们将通过使用 iOS11 之后新增的系统级别的录屏能力,来实现录制自身 App 以外,手机屏幕内容的效果(受 iOS 系统的 ReplayKit 库限制, iOS12 前在 App 中调用 Extension 启动屏幕共享时, 只能作用于 App 内, 如果退出 App 则无法得到屏幕内容)。
iOS 端的屏幕共享是通过在 Extension 中使用 RongRTCReplayKitExt 框架实现录制屏幕流的接收,然后将屏幕共享流传输到 RTCLib 实现的。由于 Apple 不支持 Extension 进程与主 app 进程通信,因此您需要为屏幕共享流单独创建一个进程。
实现屏幕共享的主要步骤如下:
- 创建 App Group,并在 XCode 中进行配置。目的是让 Extension 录屏进程可以同主 App 进程进行跨进程通信。
- 创建一个 Broadcast Upload Extension 用于开启屏幕共享的进程。
- 宿主 APP 开启屏幕共享并发布屏幕共享流。
- 屏幕共享 Extension 收到消息,初始化 RongRTCReplayKitExt 库, 接收系统录制数据。
集成说明
创建 App Group:
使用您的帐号登录 苹果开发者后台 ,进行以下操作,注意完成后需要重新下载对应的 Provisioning Profile。
- 单击【Certificates, IDs & Profiles】。
- 在右侧的界面中单击加号。
- 选择【App Groups】,单击【Continue】。
- 在弹出的表单中填写 Description 和 Identifier, 其中 Identifier 需要传入接口中的对应的 AppGroup 参数。完成后单击【Continue】。
- 回到 Identifier 页面,左上边的菜单中选择【App IDs】,然后单击您的 App ID(主 App 与 Extension 的 AppID 需要进行同样的配置)。
- 选中【App Groups】并单击【Edit】。
- 在弹出的表单中选择您之前创建的 App Group,单击【Continue】返回编辑页,单击【Save】保存。
- 重新下载 Provisioning Profile 并配置到 XCode 中。
创建 Broadcast Upload Extension:
-
在 Xcode 菜单依次单击【File】、【New】 、【Target...】,选择【Broadcast Upload Extension】,创建类型为
Broadcast Upload Extension
的新 target。 -
在弹出的对话框中填写相关信息,不用勾选【Include UI Extension】,单击【Finish】完成创建。
-
在您的 屏幕共享 Target - Build Phases - Compile Sources 中添加您可能在屏幕共享 Extension 里引用类的 .m 文件名。
-
受限于
RongIMLib
库中的默认 2 分钟断开连接的限制,需要修改如下 pod 路径下的 .plist 配置文件:您的工程名/Pods/RongCloudIM/IMLibCore/RCConfig.plist
在此文件中添加:
<key>Connection</key>
<dict>
<key>ForceKeepAlive</key>
<true/>
</dict>其中:
Connection
和ForceKeepAlive
类型为 Key 值,ture 的类型为 Bool。 -
选中新增加的 Target,依次单击【+ Capability】,双击【App Groups】,如下图:
操作完成后,会在文件列表中生成一个以您自己创建的 Target 命名的 Target名.entitlements 的文件,如下图所示,选中该文件并单击 + 号填写上述步骤中的 App Group 即可。
-
选中宿主 App 的 Target ,并按照上述步骤对宿主 App 的 Target 做同样的处理。