Highlight
Xcode 12 的 Simulator 可以直接测试 iPad 指针输入、拖拽触发文件事件,并通过
simctl批量控制隐私权限、推送通知、录屏、状态栏和根证书。
核心内容
很多 iOS 开发者把 Simulator 当成 Xcode 的运行窗口:点一下 Run,看看界面,遇到权限、推送、录屏或证书问题时再找真机。这个习惯的代价很高。权限弹窗要手点,推送要连服务端,视频要开 QuickTime,截图还要后期处理状态栏。
这场 Session 把 Simulator 讲成一个完整的测试工具。Xcode 12 让它可以全屏、和 Xcode 并排,也能直接创建新的模拟设备。它还可以拖入图片、APNS 文件或证书来触发对应事件,让测试动作靠近日常开发窗口,而不是散落在不同工具里。
更大的变化在命令行。simctl 能把原来需要手动点的设备状态变成可重复脚本:授予和撤销隐私权限,发送本地推送,录制屏幕视频,改写状态栏,给模拟设备加入 CA 根证书。这样一来,截图、Bug 复现、UI 测试准备和网络调试都可以从同一条自动化链路开始。
详细内容
(02:50)用 Simulator 测试 iPad 指针和键盘输入
iPadOS 支持鼠标和触控板后,应用需要验证指针移动、滚动、键盘快捷键和系统手势。Simulator 的工具栏可以进入 pointer capture mode,让 Mac 的鼠标或触控板交给 iPad Simulator 处理。演示里,缩放、滚动、Command-H、Command-Tab 都按 iPadOS 的规则执行。
调试时,Simulator 会在窗口失焦或 Xcode 断点命中时释放捕获,回到 Simulator 后再恢复。这个细节解决的是一个很实际的问题:你可以停在断点上检查代码,同时不用手动切换鼠标控制权。退出捕获默认用 Escape,也可以在偏好设置里改成双 Command 或 Control-Option。
关键点:
- 指针捕获让桌面输入设备按 iPadOS 规则进入应用,适合检查 iPad 指针适配是否真实可用。
- 键盘捕获可以独立开启,适合调试硬件键盘快捷键,同时保留鼠标给 Mac。
- 断点触发时自动释放捕获,减少在 Simulator 和 Xcode 之间来回抢焦点的成本。
(10:20)用 simctl privacy 固定权限状态
权限弹窗会影响首次启动、功能入口和 UI 测试。Session 明确要求开发者测试权限被授予和被拒绝两种状态。simctl privacy 可以在命令行里设置 Calendar、Photos、Contacts、Location 等受保护资源的访问状态。
xcrun simctl privacy booted grant calendar com.example.MyApp
xcrun simctl privacy booted grant photos com.example.MyApp
xcrun simctl privacy booted grant contacts com.example.MyApp
关键点:
booted指向当前启动的模拟设备;多个设备同时启动时,需要改用设备名称或 UDID。grant后面接服务名称,再接应用的 bundle ID,用来提前授予目标权限。- 这些命令适合放进 UI 测试准备步骤,让测试从确定的权限状态开始。
撤销权限也走同一套入口。
xcrun simctl privacy booted revoke calendar com.example.MyApp
xcrun simctl privacy booted revoke all com.example.MyApp
xcrun simctl privacy booted reset all
关键点:
revoke可以针对单个服务,也可以用all一次撤销应用的所有权限。reset all会把权限恢复到默认状态,适合重跑首次授权流程。- Session 提到
simctl不带参数可以查看 help,完整服务列表以工具帮助页为准。
(12:35)在本机触发推送通知
Simulator 支持把 APNS 文件拖到窗口里触发推送,也支持用 simctl push 从命令行发送。这个能力让推送 UI 不必等服务端环境准备好才能验证。
xcrun simctl push booted com.example.MyApp payload.json
关键点:
push最多接收两个参数:应用 bundle ID 和 payload 文件。- 命令行里的 bundle ID 会覆盖 payload 文件里的目标 bundle。
- 成功时
simctl不输出内容,结果会直接显示在模拟设备屏幕上。
(14:08)用 simctl io 录制可复现的视频
Bug 报告、App Store 素材和内部演示经常需要视频。Session 给出的做法是直接用 simctl io 录制模拟设备,不需要启动 Simulator.app,也不用额外录屏软件。
xcrun simctl io booted recordVideo --codec h264 --mask ignored video.mp4
关键点:
recordVideo会把当前运行设备的屏幕录到指定文件。--codec h264把默认的 HEVC 改成 H.264,便于在更多工具里打开。--mask ignored录下完整矩形帧缓冲,不把设备刘海或圆角遮罩写进视频。
(16:56)用 status_bar 做稳定截图
App Store 截图或设计评审需要稳定的状态栏。时间、蜂窝信号、网络类型和 Wi-Fi 状态如果每次都不同,后期会花很多时间清理。simctl status_bar 可以把这些信息固定住。
xcrun simctl status_bar booted override --time 12:01 --cellularBars 1 --dataNetwork 3g --wifiMode failed
关键点:
override会改写模拟设备顶部状态栏的显示值。- 示例把时间设为
12:01,蜂窝信号设为一格,数据网络设为3g,Wi-Fi 显示为失败。 - 需要恢复默认状态时,Session 给出的官方命令是
xcrun simctl status_bar booted clear。
(18:32)把 CA 证书加入模拟设备信任链
调试网络功能时,开发者常常需要让模拟设备信任本地或测试环境的 CA。simctl keychain 可以把 CA 证书加入设备的 trusted root store。
xcrun simctl keychain booted add-root-cert myCA.pem
关键点:
- 命令需要传入一个有效 CA 证书文件路径。
- 证书加入 root store 后,还要在 Settings 里进入 General、About、Certificate Trust Settings 手动启用信任。
- 启用后,由这个 CA 签发的 TLS 证书可以在模拟设备里正常工作。
核心启发
固定权限矩阵的 UI 测试启动脚本
做什么:为照片、日历、联系人和定位分别准备授权、拒绝、重置三类测试入口。
为什么值得做:Session 强调应用必须测试用户授予和拒绝受保护资源的表现,simctl privacy 正好把这个状态变成命令。
怎么开始:在测试前用 xcrun simctl privacy booted grant ... 或 revoke ... 设置状态,再启动对应的 UI test case。
本地推送样式验收工具
做什么:给设计、产品和 QA 一个 payload 文件夹,双击脚本即可在 Simulator 里预览不同推送文案。
为什么值得做:simctl push 能在本机触发通知,避免每次改文案都依赖服务端推送链路。
怎么开始:为每类通知保存一个 payload JSON,用 xcrun simctl push booted com.example.MyApp payload.json 发送到当前模拟设备。
自动生成可提交的视频复现材料
做什么:把录屏命令接到 Bug 模板里,复现问题时自动输出 H.264 视频。
为什么值得做:Session 说明 simctl 录屏用 GPU 加速,适合用来记录 UI 问题、工作进度或网页演示素材。
怎么开始:用 recordVideo --codec h264 --mask ignored 录制,结束时在终端按 Control-C,再把输出文件附到问题单。
截图前统一状态栏
做什么:为 App Store 截图、设计稿验收和回归截图准备固定状态栏脚本。
为什么值得做:simctl status_bar 可以控制时间、信号、网络和 Wi-Fi 状态,让多轮截图保持一致。
怎么开始:截图前执行 status_bar booted override,完成后执行官方的 clear 命令恢复默认状态。
本地 HTTPS 调试环境
做什么:为测试服务器生成 CA 证书,把它加入 Simulator 的 root store,再验证应用的网络请求。
为什么值得做:Session 展示了 simctl keychain booted add-root-cert,它能把证书安装流程纳入开发脚本。
怎么开始:准备 myCA.pem,运行官方命令添加证书,再到 Settings 的 Certificate Trust Settings 里手动启用。
关联 Session
- Handle trackpad and mouse input — 继续深入 iPad 和 Mac Catalyst 对鼠标、触控板、滚动和指针锁定的处理方式。
- The Push Notifications primer — 理解 alert 和 background notification,再把本 session 的
simctl push用在本地验证里。 - Handle interruptions and alerts in UI tests — 结合
simctl privacy的权限状态控制,写出能处理系统弹窗的 UI 测试。 - Handle the Limited Photos Library in your app — 了解照片权限的新限制后,再用 Simulator 验证授权和受限访问路径。
- Introducing StoreKit Testing in Xcode — 学习另一类 Xcode 本地测试环境,把购买流程和 Simulator 自动化一起纳入开发循环。
评论
GitHub Issues · utterances