成为 Simulator 高手
Become a Simulator expert
2020年6月24日
一句话判断
Simulator 是日常开发中用得最多但了解最少的工具——这场 Session 把那些藏在命令行和菜单深处的效率技巧全部翻了出来,看完之后你会发现自己以前用 Simulator 的方式太原始了。
这场 Session 讲了什么
这场 Session 是一个全面的 Simulator(iOS 模拟器)使用指南,涵盖了 Xcode 12 中 Simulator 的各项功能,包括设备管理、调试技巧、自动化操作和性能优化。
核心内容包括:xcrun simctl 命令行工具的完整用法、Simulator 的多窗口支持、拖拽安装 app、快速截图和录屏、自定义地理位置模拟、以及如何利用 Simulator 进行 UI 测试自动化。Session 还介绍了 Xcode 12 中 Simulator 作为独立应用运行的新架构,不再与 Xcode 共享进程,稳定性大幅提升。
对于日常以 Simulator 为主要测试环境的开发者来说,这些技巧可以直接影响开发效率。
值得深挖的点
simctl 是隐藏的瑞士军刀
xcrun simctl 是命令行下操控 Simulator 的核心工具,大部分开发者只知道 simctl boot 和 simctl install。实际上它能做的事远超想象:直接从命令行推送通知(simctl push)、模拟深层链接(simctl openurl)、修改状态栏时间运营商信息(simctl status_bar)、甚至给模拟器截屏和录屏(simctl io)。把这些命令封装成脚本,可以大幅减少 UI 测试的准备工作量。
Simulator 的多窗口模式
Xcode 12 让 Simulator 脱离 Xcode 主进程,成为独立应用。这意味着你可以同时打开多个 Simulator 窗口,每个窗口运行不同的设备类型,互不干扰。在调试 Universal App(iPhone + iPad)时,你可以同时看到两个设备上的运行效果,而不是切来切去。
代码片段
# simctl 常用但少有人知的命令
# 列出所有可用设备和运行时
xcrun simctl list devices available
# 启动指定设备(不需要打开 Simulator UI)
xcrun simctl boot "iPhone 11 Pro"
# 安装并启动 app
xcrun simctl install booted /path/to/MyApp.app
xcrun simctl launch booted com.example.myapp
# 模拟推送通知(无需后端)
xcrun simctl push booted com.example.myapp apns.json
# apns.json 格式:
# {
# "aps": {
# "alert": { "title": "测试", "body": "这是一条推送" },
# "sound": "default"
# }
# }
# 模拟深层链接
xcrun simctl openurl booted "myapp://detail/123"
# 修改状态栏(截图利器)
xcrun simctl status_bar booted override --time "9:41" --operatorName "中国联通" --batteryState charged --wifiBars 3
# 截图和录屏
xcrun simctl io booted screenshot ~/Desktop/sim_screenshot.png
xcrun simctl io booted recordVideo ~/Desktop/sim_video.mp4
# 批量创建和配置测试设备
#!/bin/bash
# 创建一组测试设备
DEVICES=("iPhone 8" "iPhone 11" "iPhone 11 Pro Max" "iPad Pro (12.9-inch) (4th generation)")
for device in "${DEVICES[@]}"; do
# 创建设备
UDID=$(xcrun simctl create "$device" "$device" "com.apple.CoreSimulator.SimRuntime.iOS-14-0")
echo "创建设备: $device ($UDID)"
# 启动并预热
xcrun simctl boot "$UDID"
xcrun simctl shutdown "$UDID"
done
最佳实践
- 用
simctl status_bar override统一截图风格。App Store 截图要求运营商、时间、电池状态一致。在截图前执行status_bar override命令,省去后期修图的麻烦。 - 定期清理旧设备。
xcrun simctl list devices会显示一堆不可用的旧设备。用xcrun simctl delete unavailable清理,能释放几十 GB 磁盘空间。 - 录屏用于 Bug 报告。遇到 UI 问题时用
simctl io booted recordVideo直接录屏,比截图+文字描述有效 10 倍。录屏文件可以直接拖进 bug tracker。
还有什么值得关注
- Xcode 12 的 Simulator 支持直接拖拽文件到模拟器窗口来触发「打开文件」操作,测试文档类型关联时非常方便。
- Simulator 现在支持模拟低电量模式(Low Power Mode),不需要真机就能测试省电模式下的行为。
simctl spawn可以在模拟器中直接执行命令行工具,调试网络、文件系统问题时比 SSH 进模拟器方便得多。