作者 | 赵新源
移动端的远程控制是为了将手机资源更好的分配,提高利用率,可以提供给用户更丰富的选择。现阶段我们完成了 Android 的 stf 搭建,并做了一些二次开发,以适应我们的移动端管理平台(MCP)。在 IOS 方面,由于相关技术一直比较封闭,没有非常成熟的开源技术可供选择,所以我们经过一段时间调研以及试错,还有客户端组同学的帮助下,完成了 IOS 远程控制的基本功能,目前可以提供给用户使用。
远程控制就是用户通过浏览器实现远程 ios 设备的查看和操作,所以我们有以下几个主要目标:
为了解决这些问题,我们调研了比较多的技术方案。在手机操作这块我们调研了常用的 ios 自动化驱动,主要有:
经过调研分析,UIAutomation 在 xcode8 以后就被弃用了,所以不做选择。Appium 在 iOS 自动化测试中使用了 WDA 作为事件驱动,而 WDA 底层使用的是苹果的 XCTest 以及 XCUITest。所以我们选择 facebook 开源的 iOS 自动化框架 WedDriverAgent 作为 iOS 驱动技术方案。
在桌面获取技术方面有以下几个方案:
IOS-Minicap
最开始的时候因为 stf 的使用给我们留下了深刻的印象,所以在 IOS 这块第一个想到就是 openstf 里面提供的 IOS-Minicap 组件,在做示例的时候发现视频流确实非常的流畅,能够达到 30 帧的速度,但是不幸的是 IOS-Minicap 的截图方式不支持一个 mac 同时对应多台 ios 设备,其原理是使用 AVFoundation 和 CoreMediaIO 库函数实现的屏幕获取。
Airplay Mirror
Airplay 是苹果提供的一种多媒体多屏互动技术,就是将数据通过局域网的方式传输,因为这个是苹果私有协议方案,传输的数据进行了加密,只能逆向破解,技术难度很高,所以暂不做考虑。
Idevicescreenshot
idevicescreenshot 属于开源工具集 libimobiledevice 的子集,可以在 pc 上对连接的 ios 设备进行截图,将图片保存在本地,但是效率比较慢,大概在 3~5 帧左右,也有人提出过对这个工具进行修改,不保存图片到本地,直接进行图片传输,效率应该会有提高,但我们没有具体尝试过,感觉这个成本比较高。
二次开发的 wda
wda 本身就提供手机操作以及截图功能,所以对 wda 进行二次开发来实现远程控制,也能更简单的维护整个服务,二次开发主要包括通过 websocket 进行截屏数据通信,优化操作事件的效率等。这样就能提供稳定高效的远程控制服务。
因为我们已有设备管理平台,这个是对其缺失的 ios 远程控制进行的补充,所以只有 master Web 服务和连接设备的 agent 端,用户的浏览器客户端通过 Websocket 和 agent 通信,再通过 libimobiledevice 的开源工具 iproxy 对数据进行 Mac 主机和 ios 设备之间的转发。
整个项目最主要的部分就是设备的查看和操作,如何提高效率是至关重要的,因此我们对 wda 进行了二次开发,主要针对的就是截图的效率,数据的传输,事件驱动等,接下来我们就对这些点进行分析。