iOS群控,指的是一台电脑同时管多台 iPhone 的方案——集中查看画面、按组分发任务、统一回收结果,不用越狱也不用签名。
这篇要回答的是:iOS 自动化脚本难在哪,坐标、等待与失败重试的三个坑。
去年阿凯把一套跑了三年的安卓脚本往 iPhone 上搬,第一天下午就停了。
停他的不是报错,是安卓脚本里最平常的那半句话:「等这个按钮出现,出现了就点」。iPhone 这边没有这个东西可以等。
他在微信上跟我说这事的时候,我还以为他版本装错了,问了一圈才发现,问题出在思路上。他前面三年一直在写安卓自动化脚本,今年才转过来做 iOS自动化脚本,本来以为就是换套接口写的事。
手机不知道你点的是什么
安卓自动化大多靠控件树,脚本里的写法是「文字是登录的那颗按钮」「id 等于 xxx」。
iOS 这边走的是另一条路。中控通过数据线把自己变成一个鼠标,往系统里注入按下、移动、抬起这些事件。系统收到的是「有人在屏幕上的 (300, 400) 这个位置按了一下」。
它不知道那个位置上面是什么,也不关心。
所以脚本只能写成坐标点击,点哪个像素就点哪个像素。
坐标是从截图和投屏画面里量出来的。量之前要先在 iOS中控 里告诉它这台机器的屏幕尺寸,跟截图的实际像素对齐,1170×2532 这种数。
这一步忘掉的后果不太好判断:脚本不报错,每次都返回成功,就是点在了旁边的位置。它知道自己点错了吗?不知道。你能看到一架子手机整整齐齐地各点各的,点了一下午。
横屏要重新设一遍,换了机型也要重新设。所以实际做法是先把一台机的坐标量全,再套到别的机器上。同型号之间坐标能通用,混着 11 和 12 的架子就不行,这两代屏幕尺寸不一样。
等待只剩等时间,等多久得自己兜
没有元素可等,就只剩等一段时间;iPhone自动化里最花时间的不是写动作,是把这些等待调对。
新手最常犯的是把等待压到最短,理由是「我试过能过」;在一台机上确实能过。三十台一起跑就乱了,因为你自己那台是新的,架子最右边那台可能已经用了两年。
页面加载更没准头。同一个页面,信号好的时候和差的时候,慢能慢出一倍。
我的建议是把等待时间收在一个地方,写成几个变量,别散落在脚本各处;散着的写法改一次要翻十几处,翻到第五处就开始漏。
等待宁可留宽一点。脚本慢三十秒没人会注意,跑错一遍你要重来十分钟。
失败了得能收场
这里跟 HID 的返回值有关系。
动作函数成功的时候返回的是「没有」,也就是 null 或者空字符串;不成功的时候返回的是一段错误说明。
很多人调用完不看返回值,直接往下走;前面那一步没生效,后面所有步骤都跟着歪;而你当场不会发现,往往要等结果不对了才回头翻。
失败重试不用写得很花:自己包一个小函数统一判断这次成没成,没成就重试一次。连着两次不行就把这台从这一轮里摘出去、记一笔,别让它拖着整批一起等。
还有一种情况是会话本身出毛病;画面还在,点了没动静,或者触摸忽然没反应。这种时候先重置会话,通常比拔线重插快,也不用去动架子上那三十根线。
会话一般一轮开头开一次,结束的时候关掉。
中文英文不一样,两种手感
输入文字有个坑,跟上面三处都无关,但一定会遇到。
中文走的是剪贴板粘贴,一直很稳;英文有两条路:逐键敲,像真人打字;或者也走粘贴,快很多。
用粘贴写英文的时候,有时候会凭空多出空格。原因多半在手机设置里,到「设置 → 通用 → 键盘」把智能标点关掉就好;这个开关平时不影响你正常打字。
不依赖控件有个副作用是好的:平台改版的时候,脚本不一定崩。
按钮换了名字、文字改了措辞,只要位置没动,照点不误;常改版的平台反而省心。
另外这套走的是免越狱、免签名的路子,不用装代理 IPA,也就不存在签名到期要重新签、重新装那一轮事。脚本改完直接跑。
写 iOS 脚本和写安卓脚本是两种手感:一边是找东西,一边是量位置。
从安卓换过来的人最难适应的,是这套东西不会告诉你「你要找的东西不在这儿」。它只会安静地返回成功。
还有一点跟规模有关。iOS群控里脚本通常不是一台一台跑,是一批一起下发的。所以本地那一步没做扎实,放大的倍数就是架子上的设备数。