Become a Simulator expert
Developer Tools 进阶 16m

成为 Simulator 高手

Become a Simulator expert

2020年6月24日

在 Apple 官方观看视频

一句话判断

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 bootsimctl 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

最佳实践

  1. simctl status_bar override 统一截图风格。App Store 截图要求运营商、时间、电池状态一致。在截图前执行 status_bar override 命令,省去后期修图的麻烦。
  2. 定期清理旧设备xcrun simctl list devices 会显示一堆不可用的旧设备。用 xcrun simctl delete unavailable 清理,能释放几十 GB 磁盘空间。
  3. 录屏用于 Bug 报告。遇到 UI 问题时用 simctl io booted recordVideo 直接录屏,比截图+文字描述有效 10 倍。录屏文件可以直接拖进 bug tracker。

还有什么值得关注

  • Xcode 12 的 Simulator 支持直接拖拽文件到模拟器窗口来触发「打开文件」操作,测试文档类型关联时非常方便。
  • Simulator 现在支持模拟低电量模式(Low Power Mode),不需要真机就能测试省电模式下的行为。
  • simctl spawn 可以在模拟器中直接执行命令行工具,调试网络、文件系统问题时比 SSH 进模拟器方便得多。
WWDC 2020