dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
Show your iPhone screen live in the DSH right sidebar, and let the agent tap, swipe and type on it over USB. Windows, no Xcode.
把一台插在 USB 上的 iPhone 接进 DeepSeek Harness:右侧栏里是它的实时画面,agent 能在这块屏幕上点、滑、打字。
只在 Windows + USB 下验证过。macOS 理论上也能跑(go-ios 有 darwin 版),但没测。
手机上你用手指能做的那些事,它基本都能做:
所以你可以这样说:
打开小红书,找到第一条笔记,点进去,给它点个赞。
它自己开 App、截图、认坐标、点击、再截图核对数字从 562 变成 563。全程不用你碰手机。
做不到的,也提前说清楚:面容 / 指纹确认(支付、iCloud 授权这类)、锁屏状态下的操作、任何需要真人点「允许」的系统弹窗。这些是 iOS 的硬边界,不是插件偷懒。
在 Windows 上用 AI 控真机 iPhone,卡的从来不是「怎么点一下」—— 点一下是最好写的部分。麻烦的是它前面那一长串:
环节 · 没有插件的时候 拿到 go-ios · 去 GitHub releases 翻 zip,被墙了还得找代理 挂开发者镜像 · iOS 17 起必须挂 DDI。go-ios 会卡在 x509: certificate signed by unknown authority,它不认 Windows 证书库,得自己换 pymobiledevice3 起隧道 · 端口冲突、后台化、断了要重来 查 WebDriverAgent 包名 · 每次重签都会变。写死在配置里,下次连接就报错 端口转发 · 8100 和 9100,两个 断线重连 · 睡眠、拔线、WDA 崩了,都得自己发现
任何一环断了,表现都是同一个:没反应。然后你得自己猜断在哪。
这个插件把这些全接过来。剩下三件必须你自己来,因为都需要你的人和你的 Apple ID 在场:
其余全是插件的活。装完插件后包里自带 go-ios 和 WebDriverAgent,不用再去下任何东西。
dsh plugin --profile desktop add dsh-ios-connect这条命令会转发给 pnpm,把包装进你的 desktop profile。
装完还有一步:打开 %USERPROFILE%.dsh\profiles\desktop\package.json,把 "dsh-ios-connect" 加进 dsh.profile.bundles 数组里 —— 不然包在,但 DSH 不会加载它。
重启 DSH。
dsh 不在 PATH 里的话,等价写法是进 profile 目录跑 pnpm:```powershell
cd $env:USERPROFILE.dsh\profiles\desktop
pnpm add dsh-ios-connect
`包里有 bin/ios.exe(go-ios)和 wda/WebDriverAgent.ipa —— 后面几步要用的两样东西,装完插件就有了,不用另外下。
装 Apple Devices(微软商店里免费的那个)。
装完插线,手机弹「要信任此电脑吗」→ 点信任 → 输密码。
别装 iTunes。 2026-10 那版iTunes64Setup.exe实测装完启动即崩(KERNELBASE.dll、异常码0xe06d7363),Apple Application Support一整套组件根本没落地,Apple Mobile Device Service一直停在 Stopped。商店那个 Apple Devices 就够。
检查是否认出来了:设备管理器里应该出现 Apple iPhone。没有的话插件也没辙 —— 这是驱动层的事,插件没有权限替你装。iPhone 上:设置 → 隐私与安全性 → 开发者模式。
如果根本看不到这一项(正常,默认是隐藏的),插上线后跑一次(用插件包里那个 exe,ios 不在 PATH 里):
& "$env:USERPROFILE\.dsh\profiles\desktop\node_modules\dsh-ios-connect\bin\ios.exe" devmode reveal然后回去就能看到了。打开,手机会重启,重启后确认一次。
这是「手」。没有它,插件只能看不能动。
ipa 随插件一起来了,不用单独下 —— 装好插件后它在:
%USERPROFILE%\.dsh\profiles\desktop\node_modules\dsh-ios-connect\wda\WebDriverAgent.ipa插件面板上会直接把这个路径显示出来,签名工具里选它就行。
签名工具二选一:
两个插件都不替你装(装它们要 UAC 提权,也涉及第三方软件的再分发)。但 iloader 不在的话,面板上有一个「下载 iloader 安装包」按钮:点它,安装包下到你的「下载」文件夹,双击装,装完回来点连接。
签名要你的 Apple ID 和一个验证码 —— 这一步只能你自己来。装完去 设置 → 通用 → VPN 与设备管理 → 点你的 Apple ID → 信任。
7 天到期。到期后 App 打不开、插件报「没找到 WebDriverAgent」,重签一遍就好,不用重装插件。
右侧栏会多一个 iPhone 标签。点「连接」,等十几秒,手机画面就上来了。 面板上只有一个按钮和一个状态灯,画面是只读的 —— 点它不会碰到手机。这是故意的,侧栏太窄,误触代价太大。要操作手机,让 agent 去点。
连不上先别急着翻这篇文档 —— 去 DSH 的插件设置页,点进 dsh-ios-connect,最上面那张「环境检查」卡片会把还缺什么一条条列出来,缺的那条底下写着现在该干什么。这张卡片就是这篇 README 的浓缩版,随时能点「重查」。
工具 · 干什么 phone_status · 链路通不通、UDID、WDA 包名、卡在哪一步 phone_start · 拉起整条链路(隧道 + WDA + 端口转发) phone_screenshot · 截图落盘,返回路径和屏幕尺寸 phone_tap · 点一点 phone_swipe · 滑一段 phone_type · 打字 phone_ui · 读控件树(XML),每个控件带名字和坐标 phone_find · 按文字找控件,直接给能点的坐标 phone_wait · 等某段文字出现,或等画面稳定 phone_launch · 按包名直接开 App(比在桌面找图标稳) phone_home · 回桌面 phone_unlock · 点亮 + 上滑 + 输密码(密码用 DSH_IOS_PASSCODE 给,见下) phone_batch · 一次做完一串已知步骤(点、滑、打字、开 App、等),失败就停并告诉你做到第几步
后面五个是为了少走弯路:phone_find 和 phone_wait 能省掉一大堆「操作完再截一张图看看」。不装它们也能用,只是慢。
phone_batch:为什么它值得单独讲单步调用的开销大头不在手机上,在每一次「agent → 宿主 → 插件 → WDA → 回来」这一圈。手机那头点一下 680ms、读一次 970ms,而每多一次调用就多一整圈往返。步骤一多,往返的时间远超动作本身。
phone_batch 就是把这圈往返压成一次:给一张步骤清单,它按顺序做完再回话。
{"steps": [
{"op": "home"},
{"op": "launch", "bundleId": "com.tencent.xin"},
{"op": "wait"},
{"op": "tapText", "text": "某个会话"},
{"op": "tap", "x": 187, "y": 829},
{"op": "type", "text": "在忙,晚点回"},
{"op": "tapText", "text": "发送"}
]}八种动作:tap、tapText、swipe、type、launch、home、wait、sleep。两个可选项:settleMs(每步之后歇多久,默认 250)和 stopOnError(默认 true)。
三条设计上的取舍,用的时候要知道:
failedAt 和 log,能看出走到哪、错在什么上。实测:同样一件事(回桌面 → 开微信 → 点会话 → 打一行字 → 发送),分步走 8 次调用花了 97.7 秒,phone_batch 一次 15.3 秒。省下的全是往返。
截图是 828×1792,但 WDA 要的坐标是 414×896。差 2 倍。 插件的 phone_screenshot 会把 point 尺寸一起返回,照着那个算。
直接拿截图像素去点,会点偏一倍,而且偏得很稳定 —— 这种错误第一眼很像「点错了」,其实是单位。
配置不在插件目录里,在用户目录:
~/.dsh-ios-connect/config.json 普通配置
~/.dsh-ios-connect/.env 锁屏密码(只有这一项)放用户目录是因为插件装在 node_modules 下,升级时整包重建,写在里面会跟着丢掉。
config.json 一般不用动:
{
"iosPath": "",
"udid": "",
"bundleId": "",
"wdaPort": 8100,
"mjpegPort": 9100,
"dataDir": "",
"autoDownload": true,
"streamScale": 50,
"streamQuality": 65,
"streamFps": 20
}iosPath 留空就自己找(插件下 bin/ → .runtime/bin/ → PATH → SideTap 装的位置);包里那份在就永远用不到下载(autoDownload: false 可关)。bundleId 留空就在启动时现查 —— 建议留空,重签之后包名会变,写死了下次就报错。
后三个是画面的清晰度和流畅度,启动链路时自动设给手机:
streamScale:出多大。100 是手机原尺寸(828 宽),50 是一半(414 宽)。侧栏就那么宽,让手机直接按 414 出图比出 828 再让浏览器缩小清楚得多 —— 那一缩就是画面发糊的原因。streamQuality:单帧压多狠,1-100。streamFps:帧率上限。默认 20,实测能跑到 18.9。调到 50/65/20 时带宽和默认的 828 宽基本一样,帧率从 9.6 涨到 18.9。侧栏拉宽了可以试试 streamScale: 75。
在插件设置页的「锁屏密码」卡片里填一次就行,不用碰文件。填了之后智能体能替你解锁、点开 App;没填就只点亮屏幕上滑。
密码落在 ~/.dsh-ios-connect/.env 的 DSH_IOS_PASSCODE 一行:
hasPasscode 是 true 还是 false —— 所以卡片上只可能显示「已设置」;config.json 里的密码,保存时会被挪进 .env 并从 config.json 删掉。