iOS 测试 iOS-remote 安装篇之 ios-minicap 安装使用完全指南

烟消云散 · 2017年10月16日 · 最后由 笑哼 回复于 2020年07月26日 · 6044 次阅读
本帖已被设为精华帖!

前段时间,说要做 iOS 远程真机

最开始是参考了百度项光特大佬的一篇文章:非越狱 iOS 设备的远程控制实现原理

然后有幸接触到 codeskyblue 大佬的wdaproxy(ps:这是用 go 语言实现的)

接着我就写了一篇 iOS 远程真机实现讨论帖!!

后面有幸参与 weamylady 的iOS_remote项目,iOS-remote 是结合WebDriverAgentios-minicap 开源项目做出来的基于 JAVA 的 iOS 远程真机控制的项目。

下面我讲一下其中 ios-minicap 的安装及错误指南

ios-minicap 简介

minicap 是开源项目 STF 中的高速截图工具。STF 利用此工具不断的传输图片信息并在 web 端绘制实现

以前只有 Android 版本,最近有新的 ios 版本,现在就安装过程中遇到的一些问题进行分享(ps:感谢 sorccu 在 issue 里面给我的指点)

github 地址:https://github.com/openstf/ios-minicap

你可以 git clone 或者直接下载 zip 包。

安装教程

1、准备工作

$ brew install libjpeg-turbo

$ brew install cmake

2、下载 ios-minicap

$ git clone https://github.com/openstf/ios-minicap

3、build 项目

$ cd /User/yourname/ios-minicap

$ ./build.sh

$ ./run.sh

运行成功后,不要关闭该终端窗口

4、运行 demo

重新打开一个终端端口

$ cd /User/yourname/ios-minicap/example

$ npm install

$ node app.js

全部成功运行后

5、打开浏览器,输入网址http://localhost:9002

Q&A:

在 README.MD 中请注意下面的安装需求:

这里写图片描述

我最开始没能注意这个要求,就直接./build.sh 当然是各种报错

首先安装 libjpeg-turbo

安装方式:brew install libjpeg-turbo

然后./build.sh是报这个错误

./open_xcode.sh: line 5: cmake: command not found
make: *** No targets specified and no makefile found. Stop.

然后我就去点击那个 cmake 的链接。。。最坑的来了,官网下载的都是 APP 文件,而.build.sh 里面内容如下:

#!/usr/bin/env bash

mkdir build
cd build
cmake ../
make

因为安装的 cmake 是 APP,根本无法从脚本直接启动CMakeLists.txt,我就去 issue 里面提问题,才发现原来可以通过brew直接安装。。。

安装方法:brew install cmake

安装完成之后,再次运行./build.sh,cmake 会自动编译配置文件,然后运行./run.sh

$ ./run.sh 

++ system_profiler SPUSBDataType
++ sed -n -E -e '/(iPhone|iPad)/,/Serial/s/ *Serial Number: *(.+)/\1/p'

UDID=0c6cxxxxxxxxxxe76dfdc55b57e0d1502ab92aab
PORT=12345
RESOLUTION=400x600
./build/ios_minicap --udid 0c6cxxxxxxxxxxe76dfdc55b57e0d1502ab92aab --port 12345 --resolution 400x600
EnableDALDevices
2017-07-31 12:24:26.081 ios_minicap[80709:3237274] Available devices:
2017-07-31 12:24:26.081 ios_minicap[80709:3237274] 0c6cxxxxxxxxxxe76dfdc55b57e0d1502ab92aab
2017-07-31 12:24:26.081 ios_minicap[80709:3237274] CC24414NH0XF9T9C7

由于个人隐私原因,将 udid 部分进行加密(就是用 x 去替代一部分而已啦)

我以为这个已经是启用成功
重新开启一个终端:
一步一步运行一下代码:

$ cd example

$ npm install

$ node app.js

运行到最后一步开始报错:

Listening on port 9002
Got a client
{ Error: connect ECONNREFUSED 127.0.0.1:12345
at Object.exports._errnoException (util.js:1026:11)
at exports._exceptionWithHostPort (util.js:1049:20)
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1136:14)
code: 'ECONNREFUSED',
errno: 'ECONNREFUSED',
syscall: 'connect',
address: '127.0.0.1',
port: 12345 }
Be sure to run ios-minicap on port 12345

最开始我也不知道怎么回事,后面才发现,或许是其他终端处理干净,12345 端口未被启动或者被占用。

(ps:如果address: '127.0.0.1',一栏中提示的不是127.0.0.1本地地址,那有同学更改了 host 然后导致报错,将 host 改回即可)

解决方案:

查看 12345 端口

$ lsof -i tcp:12345

kill 掉 12345 端口所有的进程(或者强制退出终端)

kill PID

再次在 ios-minicap 的目录下/run.sh 启动 12345 端口号:

启动信息如下

++ sed -n -E -e '/(iPhone|iPad)/,/Serial/s/ *Serial Number: *(.+)/\1/p'
++ system_profiler SPUSBDataType
+ UDID=0c6cxxxxxxxxxxe76dfdc55b57e0d1502ab92aab 
+ PORT=12345
+ RESOLUTION=400x600
+ ./build/ios_minicap --udid 0c6cxxxxxxxxxxe76dfdc55b57e0d1502ab92aab --port 12345 --resolution 400x600
EnableDALDevices
2017-07-31 14:43:46.851 ios_minicap[82104:3332798] Available devices:
2017-07-31 14:43:46.851 ios_minicap[82104:3332798] 0c6cxxxxxxxxxxe76dfdc55b57e0d1502ab92aab 
2017-07-31 14:43:46.851 ios_minicap[82104:3332798] CC24414NH0XF9T9C7
resolution: 400x600
Allocating 731648 bytes for JPEG encoder
== Banner ==
version: 1
size: 24
pid: 82104
real width: 400
real height: 600
desired width: 400
desired height: 600
orientation: 
quirks: 1
banner: 118b840109010058200901005820001
New client connection

重开一个终端窗口,定位到 ios-minicap 里面的 example 文件夹(就是 cd 到里面那个文件夹中)运行node app.js

提示:

Listening on port 9002
Got a client

在浏览器中打开http://localhost:9002

即可实时录制屏幕

希望我的指南能帮助你们成功安装 ios-minicap。

ios-minicap 终极大招

最后,放上终极大招——我正在使用的,已经编译好的项目文件:

ios-minicap:链接:http://pan.baidu.com/s/1skNaatR 密码:rjs2

同样,如果百度链接挂了,就去 CSDN 中下载:ios-minicap

如果使用存在问题,应该是路径问题,检查 CMakeLists.txt 中路径是否更改自己的 ios-minicap 的本地路径。

iOS-remote 安装篇

iOS-remote 安装篇之 ios-minicap 安装使用完全指南

iOS-remote 安装篇之 WebDriverAgent 安装使用完全指南

iOS-remote 安装篇之 iOS-remote 安装使用完全指南

参考文献

iOS-minicap + WDA 实现 ios 远程真机测试 https://testerhome.com/topics/10262
基于 WebDriverAgent 的 iOS 远程控制 https://testerhome.com/topics/8890
iOS 远程真机 (仅限屏幕查看) https://testerhome.com/topics/6470

致谢

@codeskyblue
@weamylady

欢迎使用以及提出宝贵意见

@seveniruby
@Lihuazhang
@xdf
@chenhengjie123

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 28 条回复 时间 点赞
GXF 回复

同遇到此情形:2020-07-26 16:36:20.371 ios_minicap[32069:266465] device with udid 'xxx' not found,不知道这个怎么解决?部分设备会有此问题

各项安装都正常,build 也没问题。卡在./run.sh 这个地方了:报错信息是:device with udid "..." not found
单独使用命令查了下连接的手机 uuid 都是正常的。minicap 从 git 上也删除重来了好几遍都不行

simple [精彩盘点] TesterHome 社区 2018 年 度精华帖 中提及了此贴 01月07日 12:08
simple 专栏文章:[精华帖] 社区历年精华帖分类归总 中提及了此贴 12月13日 14:44

补充一下,如果有同学遇见下面的 ETIMEDOUT 错误,就使用 Safari 浏览器打开 localhost:9002 别用 Chrome

Listening on port 9002
Got a client
Lost a client
Got a client
Lost a client
Got a client
{ Error: connect ETIMEDOUT 127.0.0.1:12345
    at Object._errnoException (util.js:992:11)
    at _exceptionWithHostPort (util.js:1014:20)
    at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1186:14)
  code: 'ETIMEDOUT',
  errno: 'ETIMEDOUT',
  syscall: 'connect',
  address: '127.0.0.1',
  port: 12345 }
Be sure to run ios-minicap on port 12345

严重: No error handling configured for [com.demo.ios.WebSocketController] and the following error occurred
java.io.IOException: Cannot run program "/Users/lawliet/iOS_remote/exitWDA.sh": error=13, Permission denied

我遇到了这个问题,exitWDA.sh 之前报这个文件不存在,我找到一个同名文件,但是报了如上的错误,这个文件下载的时候没有,这里应该怎么处理呀?

可以结合 minicap 实现无页面 实时 录制屏幕么😏

蓝蓝 回复

没事了,我搞定了,是 hosts 配置的问题~~~

烟消云散 回复

哎呀,我完全忘了😂 慢慢捣腾出来的吧

蓝蓝 回复

emmmm... 我最近在另一台有点老的 mac 上用 minicap 也出现你最开始的问题,一直卡在 Listen on port9002
想问下你当时怎么解决的??

MJW 回复

遇到一样的问题,你解决了吗?

请教:
修改了启动 tomcat 的端口,其他配置与命令都如教程。ios-minicap 配置没问题,单独的 WDA 也配置成功的,连接一台真机
能够成功在页面上看见当前真机的界面,但点按操作时,有报错。是在哪里配置有误
iproxy 8200 8100:

accepted connection, fd = 4
waiting for connection
Number of available devices == 1
Requesting connecion to device handle == 39 (serial: 2466e45b2af1a78ccaf858ca913230398e726d8b), port 8100
Error connecting to device!

mvn tomcat:

org.apache.tomcat.websocket.pojo.PojoEndpointBase onError
严重: No error handling configured for [com.demo.ios.WebSocketController] and the following error occurred
java.net.SocketException: Socket closed
 at java.net.SocketInputStream.socketRead0(Native Method)
 at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
 at java.net.SocketInputStream.read(SocketInputStream.java:171)
 at java.net.SocketInputStream.read(SocketInputStream.java:141)
 at org.apache.coyote.http11.upgrade.BioServletInputStream.doRead(BioServletInputStream.java:37)
 at org.apache.coyote.http11.upgrade.AbstractServletInputStream.read(AbstractServletInputStream.java:125)
 at org.apache.tomcat.websocket.server.WsFrameServer.onDataAvailable(WsFrameServer.java:45)
 at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler$WsReadListener.onDataAvailable(WsHttpUpgradeHandler.java:192)
 at org.apache.coyote.http11.upgrade.AbstractServletInputStream.onDataAvailable(AbstractServletInputStream.java:178)
 at org.apache.coyote.http11.upgrade.AbstractProcessor.upgradeDispatch(AbstractProcessor.java:92)
 at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:601)
 at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
 at java.lang.Thread.run(Thread.java:745)
蓝蓝 回复

可以了就好

@yxys01 再次感谢楼主,之前一直用 chrome 打开,总报 charles error report(我没开 charles);换成 safari 就好了哈哈哈哈

烟消云散 回复

😃 嗯嗯,灰常感谢你的指导和帮助哇!我慢慢捣腾下!

蓝蓝 回复

抱歉。。。你这个 udid 不应该存在读不到的情况啊,我也帮别人安装过几十次 ios-minicap 了,第一次遇到你这个情况。。。而且还不报错误信息,根本不知道去哪找原因。
给你两个建议
1、删掉整个 ios-minicap 文件,重新 git clone 下来一次,别改 udid 跑一次看下能不能成功?(ps:libjpeg-turbo 和 cmake 一定要确认用命令行安装好了的哈)
2、用我发的终极大招,把我上传那个下下来直接./run.sh 试试(ps:如果报错试一下重新 build.sh,还报错看下是不是 CMakeLists.txt 中路径的问题,如果是就把我的路径全部替换成你现在的路径)

别着急,iOS 测试框架的使用一大部分时间都会花在环境安装上面,我为什么想写这么详细的安装贴就是因为我当时也是安装了好久这么些东西,甚至去 github 上提 issue;当然,这也不失为一个好方法。

蓝蓝 回复

你可以把你的 run.sh 文件里面的内容贴出来我看下吗?我感觉你那里和我的不一样。。。

烟消云散 回复

这个可以的哦

蓝蓝 回复

我的 Mac 上也有很多模拟器啊。。。应该不是模拟器的问题,是 udid 的问题。。
你在终端跑下system_profiler SPUSBDataType | sed -n -E -e '/(iPhone|iPad)/,/Serial/s/ *Serial Number: *(.+)/\1/p'看看

14楼 已删除
烟消云散 回复

那样获取不到 UDID 哦,然后我 mac 上有很多模拟器的

蓝蓝 回复

能找到的话,你还是别把 udid 写死了,然后再试一下?

烟消云散 回复

可以的哦

蓝蓝 回复

可以先单独试试能不能用$ idevice_id -l获取到真机的 udid 吧
详情可见:https://testerhome.com/topics/10467
如果不行,可以尝试重新更新下 libimobiledevice 和 ideviceinstaller

$ brew uninstall ideviceinstaller
$ brew uninstall libimobiledevice
$ brew install --HEAD libimobiledevice
$ brew link --overwrite libimobiledevice
$ brew install ideviceinstaller
$ brew link --overwrite ideviceinstaller
烟消云散 回复

./run.sh 中不是有句 UDID=$(system_profiler SPUSBDataType | sed -n -E -e '/(iPhone|iPad)/,/Serial/s/ *Serial Number: *(.+)/\1/p')
这个我跑起来 UDID 获取到的为空,所以我直接写死一个真机的 UDID 了;
node app.js 我跑起来,只有一句 Listen on port 9002,像是卡着了
感谢!
libimobiledevice 和 ideviceinstaller 我应该装过了的,我再捣腾一下

蓝蓝 回复
$ cd /User/yourname/ios-minicapexample

$ npm install

$ node app.js

是不是没有npm install哦?

烟消云散 回复

嗯嗯,说错了

蓝蓝 回复

./run.sh启动吧。。。
不应该吧,一般node app.js至少会有 Error 的提示吧
eg:

{ Error: connect ECONNREFUSED 127.0.0.1:12345
at Object.exports._errnoException (util.js:1026:11)
at exports._exceptionWithHostPort (util.js:1049:20)
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1136:14)
code: 'ECONNREFUSED',
errno: 'ECONNREFUSED',
syscall: 'connect',
address: '127.0.0.1',
port: 12345 }
Be sure to run ios-minicap on port 12345

还有 udid 写死是什么意思??
你是不是没安装 libimobiledevice 和 ideviceinstaller?

$ sudo brew update
$ sudo brew install libimobiledevice
$ sudo brew install ideviceinstaller

安装试试?

node app.js 一直卡在 Listen on port9002
./run.js 启动,到 banner:xx,后面没有 New client connection,所以http://localhost:9002上咋也没有
怎么破? 咋异常日志都没有。。。
UDID 我是直接写死的

恒温 将本帖设为了精华贴 10月19日 10:46
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册