云测平台iOS环境搭建
前言
远程办公作为疫情常态化下的热门词汇,催生了各种远程办公,远程会议等工具.远程操作一台PC已经不是什么难事,那么如何远程操作一台iOS手机呢?
iOS 云真机的几个痛点:
1.图像传输
2.真机操作
3.键盘输入文本
文章目录
- 云测平台iOS环境搭建
- 前言
- 一、图像传输
- 二、真机操作
- 三、键盘输入
一、图像传输
图像传输是一切远程的基础,那么假设一台远程的iOS设备在机房内,如何在家中看到这台手机的图像呢?答案有很多,最简单的实现依赖于WebdriverAgent(WDA)。是的,WDA是iOS远程真机的基础,图像,操作等等一切都可以依赖于WDA进行实现。市面上你能找到的云真机厂商都在使用自己修改过WDA,笔者作为一名云平台的开发者,几年前也修改过WDA的源码。但是随着WDA的迭代更新,使用原版的WDA也能完美的满足云真机的功能实现。当然,后面有些功能我们使用了WDA,但也没用WDA,这里后续会做详细的解释。此处只介绍图像传输部分。
首先,在WDA启动参数中添加MJPEG_SERVER_PORT = 10872,当然端口可以随意指定。
然后使用iproxy转发一下端口,接着用浏览器打开localhost:10872,图像就出来了,EZ。
高清不卡,帧率,压缩比,清晰度都可以通过WDA进行实时调整,既然图像流已经通过WDA拿到了,剩下的转发就很简单了,这里就不做过的的解释了。
二、真机操作
远程真机能看到图像只是第一步,下一步需要将用户在浏览器上的操作同步到iOS手机上,点击,滑动,HOME键等都可以用WDA实现,但真正用起来你会发现,WDA的反应真的慢,一个滑动翻页的操作,通过WDA封装过的接口/wda/dragfromtoforduration"实现的话,可能要1-3秒才能完成,那么有没有更快的办法呢?
当年因为这个问题,我们也修改过WDA的源码,但是随着WDA和苹果接口的迭代,慢慢的有些API不再允许使用了,直到我找到了WDA中直接调用W3C的接口,当然这部分在WDA 中没有过多的文档进行说明,所以主要需要参照W3C的文档实现。
https://www.w3.org/TR/webdriver/#perform-actionshttps://github.com/jlipps/simple-wd-spec#perform-actions
调用WDA的Actions接口,我们可以直接通过W3C实现滑动,点击等动作,相比于WDA乌龟速度能提升一个档次。当然要实现多指的操作也是可以的,只不过对于浏览器用户来说此功能过于鸡肋,我们的产品并没有做,不知道开发此功能的某厂商的产品经理是如何思考的
举个例子:从屏幕上的x:100,y:100作为起点,向左滑动50
URL: “http://localhost:” + WDAPort+ “/session/” + sessionID + “/actions”
参数:
{
"actions": [
{
"type": "pointer",
"id": "finger1",
"parameters": {"pointerType": "touch"},
"actions": [
{"type": "pointerMove", "duration": 0, "x": 100, "y": 100},
{"type": "pointerDown"},
{"type": "pause", "duration": 100},
{"type": "pointerMove", "duration": 200, "origin": "pointer", "x": -50, "y": 0},
{"type": "pointerUp"}
]
}
]
}
第一个动作pointerMove作为起点移动光标,第二个动作为pointerDown将光标落下,pause为停留时间,下一个pointerMove中"origin": "pointer"指定当前光标位置为此次移动的起点(不指定的话会以0,0为起点),指定后x,y的数值为相对移动的数值。duration为间隔时间可自行调整,最后pointerUp抬起光标,完成动作。
三、键盘输入
图像有了,点击、滑动也能模拟了,那么用户需要输入文本内容怎么办,一下一下在键盘上点太繁琐了,最简单的暴力的就是直接通过键盘输入,WDA提供了时间键盘输入的接口,只不过很难找到相关的文档和介绍。
URL:“http://localhost:” + WDAport+ “/session/” + sessionID + "/wda/keys"
参数的话就是value和frequency两个,VALUE是内容,frequency是次数默认使用1就可以了
实现后你会发现效果并不理想,首先输入的效率很低,如果连续依次输入123456,很有可能输入的124365,顺序会错乱,另外如果输入的是一串中文的话,实际的效果会是一个字一个字的输。效率很低,目前市面上多数的云真机厂商所实现的iOS云真机的输入功能都没有达到和安卓设备同样的流畅度。主要是因为iOS并不像安卓那样可以随意的开发一个键盘应用放到手机里直接用。那么如何实现如安卓般丝滑的输入呢?
有的,依然是依靠W3C的actions
URL: “http://localhost:” + WDAPort+ “/session/” + sessionID + “/actions”
参数:
{
"actions": [
{
"type": "key",
"id": "keyboard",
"actions": [
{"type": "keyDown", "value": "a"},
{"type": "keyUp", "value": "a"}
]
}
]
}
速度直接提升一个档次,缺点是每次只能输入一个字符,如果是一串中文的话需要循环调一下,不过还是比WDA的接口快很多,而且顺序不会错乱。