BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

iOS 7使用脚本关闭VoIP APP进程

| 作者 杨志伟 张晨 关注 0 他的粉丝 发布于 2014年6月26日. 估计阅读时间: 9 分钟 | 都知道硅谷人工智能做的好,你知道 硅谷的运维技术 也值得参考吗?QCon上海带你探索其中的奥义

背景介绍

VoIP 类型的APP有个特性,就是需要一直在后台保持运行,以便能够随时接收来电。正因为系统提供给VoIP进程的这种特殊机制,导致我们没法直接用kill命令完全查杀VoIP进程。关于这点更加详细的信息,可参考如下Apple developer网站的介绍:

“Because VoIP apps need to stay running in order to receive incoming calls, the system automatically relaunches the app if it exits with a nonzero exit code. (This type of exit could happen when there is memory pressure and your app is terminated as a result.) However, terminating the app also releases all of its sockets, including the one used to maintain the VoIP service connection. Therefore, when the app is launched, it always needs to create its sockets from scratch.”

在详细介绍用脚本查杀VoIP进程实践之前,先花点篇幅说下我们为什么需要查杀VoIP进程。

在IOS中,可以使用instruments这个工具来启动被测应用,并执行UI Automation所编写的自动化测试用例。二次启动instruments时,因为进程已经被启动过,会在控制台抛出如下错误:”Executable ‘XXX’ is already running as process XXXX which was launched from the ‘launchd’ process.” 为了避免这种错误,只能启动一次instruments,跑完所有的自动化用例. 因为在命令行下启动instruments,只能指定一个执行的JS文件,所以只能把所有的自动化用例封装到这唯一的JS文件里。这很难满足实际的需求。现实中我们已自动化用例数目比较大,需要对自动化用例按用例优先级进行分类处理,按照类型将自动化用例存在对应的JS文件里,所以需要启动多次instruments来执行用例。因此,我们需要在启动instruments前先查杀下已经存在的VoIP进程。

显然我们不可能在自动化脚本运行的过程中,手动通过连按主屏幕,向上滑动APP图标来查杀VoIP进程。那接着就来看下我们的实践过程吧。

应用的工具

我们结合了如下这些工具:

  • SimulateTouch: 提供坐标方式点击或者滑动屏幕的方法
  • Activator: 可以设置在任意位置按一下顶部状态栏激活多任务栏
  • KillBackgroud7:在多任务栏提供按钮,点击该按钮可以查杀所有后台进程
  • AutoTouch: 可以用来录制动作存到脚本里,我们主要用这个工具来查看坐标

这几个工具在越狱的iPhone,都可以通过Cydia下载到。

实践过程介绍

首先,我们在设置里找到并点击Activator, 然后选择并点击任意位置,选择并点击按一下顶部状态栏,选择并点击激活任务栏,这些步骤的目的是为了在任意位置点击一下顶部状态栏打开多任务栏页面。上面的步骤如以下截图所示:

接着,通过跟上面绑定激活任务栏到单击顶部状态栏的步骤一样,我们可以绑定启动AutoTouch到双击顶部状态栏这一动作 (主要用来录制,然后获取坐标供SimulateTouch使用)

现在我们需要录制如下的动作,点击顶部状态栏(如上所述,用来打开任务栏),然后点击KillBackgroud7在任务栏右下方的出现的按钮(点击该按钮KillBackground7会帮我们杀掉所有后台进程),该按钮如下截图所示:

现在双击顶部状态栏,打开AutoTouch录制功能,点击Record按钮

录制如下的动作,点击一下状态栏,接着点击一下KillBackground7在多任务栏右下角的按钮,双击顶部状态栏结束录制。

在手机桌面找到AutoTouch图标,点击该图标,按时间排序找到你刚录制的脚本,点击该脚本右边的感叹号图标,可以看到脚本内容,提取出状态栏坐标,KillBackgroud7在多任务栏右下角图标的坐标

从上面的步骤中,我们已经获得了需要的坐标,可以用SimulateTouch来编写杀进程的脚本了。在这里或许有人会有以下的疑问,为什么不直接回放AutoTouch录制的脚,通过SimulateTouch来编写脚本,不是多此一举吗? Good question, 但遗憾的是,现在AutoTouch还不支持命令行下回放脚本。

那我们只有继续脚本的编写了,假设脚本命名为toush.sh吧,编写脚本如下:

OK, 加上如上的注释总共6行脚本就解决这个棘手的问题了,但SimulateTouch提供的命令要在iPhone上执行,所以我们可以通过SSH连接iPhone,然后执行命令。 SSH连接需要输入密码,为了避免每次跑脚本的过程中,再手动去输入密码,可以通过参考下面链接的步骤实现:

http://hi.baidu.com/youngfragnet/item/405c78009f9708883c42e296

接着把touch.sh脚本拷贝到iPhone上SSH连接默认的目录下,最后,把SSH连接,执行touch.sh的命令整合到一个shell脚本里,取个霸气点的名称,如kill.sh,假设手机的IP地址为10.32.60.85,编写kill.sh如下

至此,所有的精华都浓缩到kill.sh脚本里了,需要kill 进程的地方,调用下kill.sh这个shell脚本就可以搞定了。

以上实验,在iPhone 5s , 版本 7.0.4上进行。

总结

在前面也提到了,SimulateTouch还提供了在命令行下执行的stouch swipe,来实现滑动的功能。结合SimulateTouch的stouch touch和stouch swipe命令,我们可以实现屏幕上的单击,双击,左滑,右滑操作。我们可以根据具体的应用场景来组织调用对应的命令,最后封装到shell脚本里,来实现我们的需求。需要注意的一点是,在整合这些命令的过程中最好设置间隔等待时间,如上面编写的脚本中出现的sleep 2s。 这是为了确保前面一个命令执行完毕后才开始后面命令的执行。

通过SimulateTouch提供的支持,我们就可以很好的处理被测应用外的操作,弥补了UI Automation不能操作应用外的元素这一局限性。接着可以打开如下的链接所示的UI Automation的官方reference进行被测应用内的自动化操作了。

https://developer.apple.com/library/ios/documentation/DeveloperTools/Reference/UIAutomationRef/_index.html

本文主要介绍了如何实现在脚本中查杀进程,希望对你在IOS自动化过程中会有些许帮助。


感谢高嘉峻对本文的审校。

给InfoQ中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ)或者腾讯微博(@InfoQ)关注我们,并与我们的编辑和其他读者朋友交流。

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT