什么是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通信,做出了

  1. 获取设施详情
  2. 监听设施高低线
  3. 设施端口转发,相似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)            }

如何应用

  1. Sonic平台用户能够不必关怀,应用起来跟以往无异,Agent层会主动调用sib,并解决了以往版本我还没修复的很多bug,实践上更稳固。
  2. 非间接应用平台的用户能够返回这里下载对应版本文件
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,心愿大家多多期待