用途:该技能用于在真实 iPhone 或 iPad 上构建、签名、安装并启动应用,全程在终端完成,不使用 Xcode 的 Run 按钮。它与 run-simulator 技能互补,对应硬件路径,使用 devicectl 而非 simctl,并需要真实代码签名。构建成功说明代码可编译且能签名,启动成功说明应用能在真机安装运行;启动崩溃或安装失败即视为失败。适用场景包括从命令行在真机运行或测试、不打开 Xcode 完成安装、复现仅真机出现的问题(相机、传感器、性能、推送)以及截取真机运行画面。不适用于模拟器,也不用于 xcodebuild test。
前置条件(部分需人工交互,无法脚本化):设备通过 USB 连接或经 Wi-Fi 配对;iOS 16+ 需开启开发者模式(设置 → 隐私与安全性 → 开发者模式,重启后生效);设备需信任并配对;需配置自动签名,目标需 CODE_SIGN_STYLE = Automatic 与 DEVELOPMENT_TEAM,且签名用 Apple ID 已登录 Xcode。构建前先用 xcrun devicectl list devices 确认可达,Identifier 列为 CoreDevice UUID。
主要能力与流程:1)构建与签名,使用 -destination 'generic/platform=iOS' 与 -allowProvisioningUpdates,成功会显示 ** BUILD SUCCEEDED **;2)通过 xcodebuild -showBuildSettings 读出 TARGET_BUILD_DIR 与 FULL_PRODUCT_NAME,定位 Debug-iphoneos 下的 .app,并用 PlistBuddy 读取 CFBundleIdentifier;3)安装:xcrun devicectl device install app --device "$DEV" "$APP";4)启动:xcrun devicectl device process launch --device "$DEV" "$BID";5)截图需借助 libimobiledevice,先 brew install libimobiledevice,再用 idevicescreenshot 捕获,且需在启动应用后执行以挂载开发者磁盘映像。
限制与注意事项:xcodebuild 不能直接用 devicectl 的标识作为目的地,否则会报无法找到匹配设备,应改为 generic/platform=iOS;-quiet 会隐藏成功标记;启动时加 --terminate-existing 可能误报 CoreDeviceError 10004,可用 device info processes 确认进程是否存活;开发者模式与信任无法从命令行开启,需用户在设备上完成;免费个人团队的应用 7 天后过期需重新构建;Wi-Fi 设备需保持唤醒且在同一网络;若行为看似未更新,可先卸载再重装。截图在无 Homebrew 的无头或 CI 环境不可用,只能改为设备手动截图。