共计 2914 个字符,预计需要花费 8 分钟才能阅读完成。
什么是 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,心愿大家多多期待