IOS App测试的那些坑和解决方案
- 2019 年 11 月 10 日
- 笔记
“Iphone app 测试有些坑,如何绕过这些坑呢?
苹果系统跟 Android 系统完全不一样,测试起来也有很大的不同。
在测试中常见的,如 xcode 版本问题,打包证书问题,闪退无法重现,不好抓 log, 上架被拒问题等等。本文总结一些常见的坑,可以完美绕过去。
闪退
Android 手机闪退,可以用 adb 很轻易的拿到 log. IOS 系统主要是沙盒,你没法很轻松的就拿到 log. 在 iPhone 手机上的软件发生闪退或开发 iOS 应用程序时出现的闪退,一般都会自己或系统生成崩溃日志,那么我们从哪里以及怎么获取到崩溃日志呢?
iPhone 手机一台 数据线一条 Xcode 开发工具(可选)
而由于 iOS 系统的沙盒机制,一般我们不能直接访问它获取,但可以有下面的几种方法获取。
1.在 iTunes Store 上获取。使用数据线连接手机和电脑,就可以从电脑的以下路径找到崩溃日志了。
macOS :~/Library/Logs/CrashReporter/MobileDevice/< DEVICE_NAME > Windows :C:/Users/< USERNAME > /AppDataRoamingApple/ComputerLogsCrashReporterMobileDevice/< DEVICE_NAME >
2.如果你是开发者,可以从 iTunes Connect 上获取。但前提需手机用户打开设置->隐私->诊断与用量的开关。
3.可以通过开发工具 Xcode,数据线连接电脑获取。通过在Xcode->Window->Devices,然后选中真机设备,点击View Device Logs。等待扫描后获取对应应用和日期的日志。
4.如果是应用开发者,自己代码中记录崩溃日志,并上传到服务器,发生崩溃后从网站日志管理中获取对应的崩溃日志即可。
上架流程
Mac 就一个市场,上架需要官方审核。Android 如果不上 Google play,审核相对松很多,快很多。
发布App Store 审核分 6 步进行。
1、申请 iOS 发布证书(p12)
2、申请 iOS 发布描述文件(mobileprovision)
3、打包 ipa
4、上传 ipa 到 iTunes Connect
5、TestFlight 方式安装到苹果手机测试
6、设置 APP 各项信息提交审核
TestFlight 测试
因为上线风险大,回撤成本高,一般都是灰度发布。
TestFlight 的测试方式分为两种,一种是内部测试,一种是外部测试。从功能上讲,这两种方式都可以为测试人员在测试阶段对你的 App 进行测试。内部测试最多可以邀请 25 个内部成员,而与之相对的外部测试,指的是那些不属于你的团队或者公司的测试者,外部测试人员的上限是 10000 人。这里有一点需要注意的是,在你邀请外部成员参与测试之前,需要先通过苹果的审核,一般审核会在一天左右。而这一限制在内部成员上就没有,也就是说只要你把你的 App 上传到 iTunes Connect 上之后内部成员就可以开始进行内部测试了,无需审核。
准备工作
待测试的 ipa 包(用 Application Loader 上传)或者是 archive (用 Xcode Upload to App Store)文件(需要上传到 iTunes Connect );
到 App Store 下载安装软件 TestFlight;
将打包好的 ipa 或 xcarchive 文件上传到 iTunes Connect;
登录到 iTunes Connect 进入我的 APP,选择你的 APP;
到 TestFlight 模块下,如果 App Store 有提交过的版本,内部测试员就可以了,我们只需要添加内部测试员用户即可。
iOS APP 上架被拒重新提交审核
iOS APP 审核比较严格,难免会出现被拒绝的情况,需要根据苹果反馈的问题修改后重新打包上传审核!
登录 itunesconnect、https://itunesconnect.apple.com [1]进入被拒绝的 APP 页面
点击未解决的 iOS 问题,进入查看原因。
查看具体被拒绝的原因,查看反馈的审核截图,根据问题修改 app 重新打包上传。
有些苹果要求你在下面回复反馈的问题,可以直接写中文,回复了就不用上传新的 ipa 重新提交审核了。
看具体的反馈,决定是否直接回复还是重新打包上传 ipa 提交审核!
证书有效期测试
为什么要测试这个玩意,因为 app 是跟开发者证书绑定的,证书是有有效期限的,如果过期,就不能正常使用。也许开发没注意到这点,在上线前,测试要看看这个过期时间是不是很近了。如果是,要告知风险。
Do the following:
unzip -q MyApp.ipa $ codesign -d --extract-certificates Payload/*.app $ openssl x509 -inform DER -in codesign0 -noout -nameopt -oneline -dates
自动化测试
WebDriverAgent 是由 Facebook 开发的一套开源框架,用于端对端的 UI 测试,能同时支持模拟器和真机。
因为 Mac 系统的特性,我们很难操作非越狱的手机,幸好有 Facebook 的 WebDriverAgent,通过它可以实现远程控制手机,一般自动化测试用的多,其它用途需要自己探索。如果想要 python 调用 WebDriverAgent 的功能,那么还需要 facebook-wda。
安装 WebDriverAgent
- 从 github 上下载 WebDriverAgent,
git clone https://github.com/facebook/WebDriverAgent
或者直接下载 ZIP 压缩包 - 在 WebDriverAgent 文件路径下执行
./Scripts/bootstrap.sh
- Xcode 打开 WebDriverAgent 项目(我使用的是免费证书,免费证书如何弄请百度),修改 TARGETS 下所有对象的 Bundle Id

image
- TARGETS 下所有对象的 team 替换成自己开发者账号,并勾选 Automatically

image
- 选择运行的 Scheme 与设备

image
- 执行 Test,可以看到手机上多了一个无图标的 WebDriverAgent 应用,此 app 会打开,马上又回到手机桌面,正常

image此时控制台界面可以看到设备的 IP:

image此 IP 地址加上status
,例如http://169.254.120.53:8100/status
,用浏览器打开,会显示一串 JSON 串,则代表成功,如果加上 inspector,会得到如下界面

image
- 假如上述所说的地址打不开,那也正常,我自己的手机就是这样,需要转发端口 安装 usbmuxd
brew install usbmuxd
把手机上的 8100 端口转到电脑上iproxy 8100 8100

image以后输入地址只需要输入 localhost 即可,例如:http://localhost:8100/inspector
安装 facebook-wda
- 给 python 安装 facebook-wda 扩展,
sudo pip install --pre facebook-wda
- 从 github 上下载 facebook-wda,
git clone https://github.com/openatx/facebook-wda
或者直接下载 ZIP 压缩包 - 在 facebook-wda 文件路径下执行
sudo python setup.py install
如何使用 facebook-wda
前提条件:首先启动 WebDriverAgent,运行 Test,待显示出 ip 地址,然后转换端口。给 iPhone 截屏并保存,更多功能请自己在 GitHub 上查找https://github.com/openatx/facebook-wda[2]
import wdac = wda.Client('http://localhost:8100')c.screenshot('/Users/gcf/Desktop/shotImg/%dscreen.png' % (tag))
遇到的问题
- 提示
Failed to download resource "carthage"
,需要安装 carthagebrew install carthage
参考资料
[1]
https://itunesconnect.apple.com : https://itunesconnect.apple.com/
[2]
https://github.com/openatx/facebook-wda: https://link.jianshu.com?t=https%3A%2F%2Fgithub.com%2Fopenatx%2Ffacebook-wda