iOS群控,指的是一台电脑同时管多台 iPhone 的方案——集中查看画面、按组分发任务、统一回收结果,不用越狱也不用签名。

这篇要回答的是:iOS 自动化脚本难在哪,坐标、等待与失败重试的三个坑。

去年阿凯把一套跑了三年的安卓脚本往 iPhone 上搬,第一天下午就停了。

停他的不是报错,是安卓脚本里最平常的那半句话:「等这个按钮出现,出现了就点」。iPhone 这边没有这个东西可以等。

他在微信上跟我说这事的时候,我还以为他版本装错了,问了一圈才发现,问题出在思路上。他前面三年一直在写安卓自动化脚本,今年才转过来做 iOS自动化脚本,本来以为就是换套接口写的事。

手机不知道你点的是什么

安卓自动化大多靠控件树,脚本里的写法是「文字是登录的那颗按钮」「id 等于 xxx」。

iOS 这边走的是另一条路。中控通过数据线把自己变成一个鼠标,往系统里注入按下、移动、抬起这些事件。系统收到的是「有人在屏幕上的 (300, 400) 这个位置按了一下」。

它不知道那个位置上面是什么,也不关心。

所以脚本只能写成坐标点击,点哪个像素就点哪个像素。

坐标是从截图和投屏画面里量出来的。量之前要先在 iOS中控 里告诉它这台机器的屏幕尺寸,跟截图的实际像素对齐,1170×2532 这种数。

这一步忘掉的后果不太好判断:脚本不报错,每次都返回成功,就是点在了旁边的位置。它知道自己点错了吗?不知道。你能看到一架子手机整整齐齐地各点各的,点了一下午。

横屏要重新设一遍,换了机型也要重新设。所以实际做法是先把一台机的坐标量全,再套到别的机器上。同型号之间坐标能通用,混着 11 和 12 的架子就不行,这两代屏幕尺寸不一样。

等待只剩等时间,等多久得自己兜

没有元素可等,就只剩等一段时间;iPhone自动化里最花时间的不是写动作,是把这些等待调对。

新手最常犯的是把等待压到最短,理由是「我试过能过」;在一台机上确实能过。三十台一起跑就乱了,因为你自己那台是新的,架子最右边那台可能已经用了两年。

页面加载更没准头。同一个页面,信号好的时候和差的时候,慢能慢出一倍。

我的建议是把等待时间收在一个地方,写成几个变量,别散落在脚本各处;散着的写法改一次要翻十几处,翻到第五处就开始漏。

等待宁可留宽一点。脚本慢三十秒没人会注意,跑错一遍你要重来十分钟。

失败了得能收场

这里跟 HID 的返回值有关系。

动作函数成功的时候返回的是「没有」,也就是 null 或者空字符串;不成功的时候返回的是一段错误说明。

很多人调用完不看返回值,直接往下走;前面那一步没生效,后面所有步骤都跟着歪;而你当场不会发现,往往要等结果不对了才回头翻。

失败重试不用写得很花:自己包一个小函数统一判断这次成没成,没成就重试一次。连着两次不行就把这台从这一轮里摘出去、记一笔,别让它拖着整批一起等。

还有一种情况是会话本身出毛病;画面还在,点了没动静,或者触摸忽然没反应。这种时候先重置会话,通常比拔线重插快,也不用去动架子上那三十根线。

会话一般一轮开头开一次,结束的时候关掉。

中文英文不一样,两种手感

输入文字有个坑,跟上面三处都无关,但一定会遇到。

中文走的是剪贴板粘贴,一直很稳;英文有两条路:逐键敲,像真人打字;或者也走粘贴,快很多。

用粘贴写英文的时候,有时候会凭空多出空格。原因多半在手机设置里,到「设置 → 通用 → 键盘」把智能标点关掉就好;这个开关平时不影响你正常打字。

不依赖控件有个副作用是好的:平台改版的时候,脚本不一定崩。

按钮换了名字、文字改了措辞,只要位置没动,照点不误;常改版的平台反而省心。

另外这套走的是免越狱、免签名的路子,不用装代理 IPA,也就不存在签名到期要重新签、重新装那一轮事。脚本改完直接跑。

写 iOS 脚本和写安卓脚本是两种手感:一边是找东西,一边是量位置。

从安卓换过来的人最难适应的,是这套东西不会告诉你「你要找的东西不在这儿」。它只会安静地返回成功。

还有一点跟规模有关。iOS群控里脚本通常不是一台一台跑,是一批一起下发的。所以本地那一步没做扎实,放大的倍数就是架子上的设备数。