name: ios-device-screenshot description: 使用 pymobiledevice3 从通过 USB 连接的物理 iOS 设备上截取屏幕截图。适用于从真实 iPhone/iPad(非模拟器)捕获截图、在设备上调试或需要高保真设备捕获的场景。触发条件包括物理 iOS 设备截图、pymobiledevice3 使用或 USB 连接设备捕获任务。
iOS 设备截图
使用 pymobiledevice3 从通过 USB 连接的物理 iOS 设备上截取屏幕截图。
安装
# 使用 uv 安装 pymobiledevice3(推荐)
uv tool install pymobiledevice3
# 或使用 pipx
pipx install pymobiledevice3
前提条件
- 物理 iOS 设备 通过 USB 连接
- 在设备上启用开发者模式(设置 > 隐私与安全性 > 开发者模式)
- 信任设备 - 在设备上批准“信任此电脑”提示
使用方法
适用于 iOS 17+(包括 iOS 26+)
iOS 17+ 需要以 root 权限运行 tunneld 守护进程:
# 终端 1:启动 tunneld(需要 sudo,持续运行)
sudo pymobiledevice3 remote tunneld
# 终端 2:通过 DVT(开发者工具)截取屏幕截图
pymobiledevice3 developer dvt screenshot --tunnel "" /path/to/screenshot.png
--tunnel "" 标志告诉它使用 tunneld 进行设备通信。
适用于 iOS 16 及更早版本
pymobiledevice3 developer screenshot /path/to/screenshot.png
快速参考
# 列出已连接的设备
xcrun devicectl list devices
# 检查 iOS 版本
ideviceinfo -k ProductVersion
# 检查开发者镜像是否已挂载
ideviceimagemounter list
# 如果需要,自动挂载开发者镜像
pymobiledevice3 mounter auto-mount --tunnel ""
# 截取屏幕截图(iOS 17+)- 单设备
pymobiledevice3 developer dvt screenshot --tunnel "" ~/Desktop/screenshot.png
# 使用特定设备 UDID 截取屏幕截图(多设备时必须)
# 首先从以下命令获取 UDID:xcrun devicectl list devices
# 将 UDID 直接传递给 --tunnel(不是 --udid 标志,该标志与 tunneld 不兼容)
pymobiledevice3 developer dvt screenshot --tunnel "00008101-001E05A41144001E" ~/Desktop/screenshot.png
重要提示: 当连接多个设备时,将 UDID 直接传递给 --tunnel(而不是 --udid)。--tunnel "" 语法会提示交互式选择,这在非交互式 shell 中会失败。
故障排除
“InvalidServiceError” 或 “Failed to start service”
- 确保 tunneld 正在运行:
ps aux | grep tunneld - 如果未运行:
sudo pymobiledevice3 remote tunneld - 使用 DVT 命令而不是常规截图命令:
developer dvt screenshot而不是developer screenshot
“DeveloperDiskImage not mounted”
pymobiledevice3 mounter auto-mount --tunnel ""
连接了多个设备
使用 --udid 指定目标设备:
# 首先列出设备
xcrun devicectl list devices
# 使用特定 UDID
pymobiledevice3 developer dvt screenshot --tunnel "" --udid "40182233-00C8-51ED-8C68-174E14E4B4C9" /tmp/screenshot.png
关键发现
对于 iOS 17+,常规的 pymobiledevice3 developer screenshot 命令即使 tunneld 正在运行也经常失败。解决方案是使用 DVT(开发者工具)变体:
# 这在 iOS 17+ 上会失败:
pymobiledevice3 developer screenshot --tunnel "" /tmp/screenshot.png
# 这在 iOS 17+ 上有效:
pymobiledevice3 developer dvt screenshot --tunnel "" /tmp/screenshot.png
集成示例
#!/bin/bash
# 截取 iOS 设备屏幕截图并打开它
OUTPUT="/tmp/ios-screenshot-$(date +%Y%m%d-%H%M%S).png"
# 检查 tunneld 是否在运行,如果没有则启动
if ! pgrep -f "pymobiledevice3 remote tunneld" > /dev/null; then
echo "正在启动 tunneld(需要 sudo)..."
sudo pymobiledevice3 remote tunneld &
sleep 3
fi
# 截取屏幕截图
pymobiledevice3 developer dvt screenshot --tunnel "" "$OUTPUT"
if [ -f "$OUTPUT" ]; then
echo "屏幕截图已保存至:$OUTPUT"
open "$OUTPUT" # macOS:在预览中打开
else
echo "截取屏幕截图失败"
exit 1
fi