什么是sonic-ios-bridge
sonic-ios-bridge(以下简称sib),用于pc与ios通信的工具,以后版本蕴含以下根底性能
1、跨平台启动wda
2、app列表、装置、卸载、启动
3、设施高低线监听
4、设施详细信息
5、主动挂载开发者镜像
Github地址
只有你的ios有wda包,能够应用sib唤起之后,用appium等框架间接连贯对应url,就能实现跨平台(Linux、Win、Mac)自动化,能够不依赖mac和xcode(当然打wda到ios的时候须要xcode,后续跑自动化就不须要了)
Sonic为什么思考替换tidevice
tidevice是一个十分优良的工具,然而这边如果单因为tidevice让用户部署python环境无疑是微小的节约,以往不少用户部署Agent的时候都是在python环境踩了坑。而go语言打包的可执行二进制文件能够不须要部署额定的环境运行,并且go语言天生的性能与速度都是十分优的。
援用网上一篇文章的话
Go 语言的特点表明它具备轻量级线程实现(Goroutine)、智能规范库、弱小的内置安全性,且可应用最简语法进行编程。
所以,如果你本人是Sonic平台层面的用户,那么这个新技术带来的成果兴许是不痛不痒,最显著收益是部署时不须要py环境。
如果你是python语言为主做iOS自动化,那么还是举荐持续应用tidevice
如果你是java或其余语言为主做iOS自动化,那么能够思考应用sib,不要搭建py环境啦~
尝试本人造轮子
过后查找了大量usbmuxd、lockdown的文章,也有参考了tidevice的代码。用本人的形式实现了跨平台与usbmuxd的通信与iOS的lockdown通信,做出了
- 获取设施详情
- 监听设施高低线
- 设施端口转发,相似iproxy
停顿还是挺顺利,接下来搞启动wda
发现宝藏
前面着手进行启动wda这最难的性能的时候,testmanager等等一系列恶心人的逻辑让我痛不欲生,启动wda简直围绕了整个iOS协定走了一圈,偶然逛github的时候发现原来有小伙伴用go实现过ios通信了,叫gidevice,也有伴生了cli版。然而因为没有主动挂载开发者镜像的性能,还不能间接接到sonic外面,加上某些数据根底还是要联合sonic业务来开展。
于是放弃之前本人做的轮子,间接基于gidevice的根底上,来做一层sonic的cli与辅助扩大
扩大性能如下几点:
1. 获取设施型号的中文名称,如iPhone14,5 -> iPhone 13
整顿的映射表
次要从apple的wiki爬取下来的
2. 自定义输入json数据格式与格式化格局
这个次要用来联合sonic业务做的
3. 主动挂载开发者镜像
这里参考了tidevice的做法,在仓库下载对应版本号的开发者镜像并进行挂载操作
func downloadZip(url, version string) error { if versionMap[version] != "" { version = versionMap[version] } _, errT := os.Stat(fmt.Sprintf(".sib/%s.zip", version)) if errT != nil { _, err := os.Stat(".sib") if err != nil { os.MkdirAll(".sib", os.ModePerm) } client := http.Client{ Timeout: DownLoadTimeOut, } res, err := client.Get(fmt.Sprintf("%s/iOSDeviceSupport/raw/master/DeviceSupport/%s.zip", url, version)) if err != nil { return err } defer res.Body.Close() r := bufio.NewReaderSize(res.Body, 32*1024) newFile, err := os.Create(fmt.Sprintf(".sib/%s.zip", version)) w := bufio.NewWriter(newFile) io.Copy(w, r) abs, _ := filepath.Abs(newFile.Name()) errZip := unzip(abs, ".sib", version) if errZip != nil { os.Remove(newFile.Name()) return errZip } } return nil}
4. 设施离线后填充对应序列号到对应字段
离线后只能拿到deviceID,这个id是连贯时候通过自增定义的,并不是设施的序列号,须要本人做解决
5. 监听时展现设施详细信息
这个属于扩大性能,搭配sonic业务应用
6. 获取app信息,包含中文名与长版本号
原本gidevice提供的applist只有app的英文名称和短版本号,须要用gidevice另一个InstallationProxyBrowse的办法做,并且筛选用户的利用
if device.Properties().SerialNumber != "" { result, errList := device.InstallationProxyBrowse(giDevice.WithApplicationType(giDevice.ApplicationTypeUser)) if errList != nil { return util.NewErrorPrint(util.ErrSendCommand, "appList", errList) } var appList entity.AppList for _, app := range result { a := entity.Application{} mapstructure.Decode(app, &a) appList.ApplicationList = append(appList.ApplicationList, a) } data := util.ResultData(appList) fmt.Println(util.Format(data, isFormat, isJson)) } else { fmt.Println("device no found") os.Exit(0) }
如何应用
- Sonic平台用户能够不必关怀,应用起来跟以往无异,Agent层会主动调用sib,并解决了以往版本我还没修复的很多bug,实践上更稳固。
- 非间接应用平台的用户能够返回这里下载对应版本文件
sib run wda -b 你的wda包名
执行之后能够浏览器关上localhost:9100,有手机画面代表胜利
包名如果没有.xctrunner会主动补全.xctrunner,默认应用第一台手机,如果想指定手机,能够
sib run wda -u 序列号 -b 你的wda包名
如果想更改端口号,能够
sib run wda -h 来查看对应参数
获取序列号能够通过
sib devices
更多用法能够通过sib -h
或者github的文档查看哦~
结语
这里还是非常感谢gidevice作者雷系泡泡,给我省去了不少造轮子的工夫。
sib也将在v1.3.2-beta开始接入sonic,心愿大家多多期待