如果你做过 iOS 自动化,大概率绕不开 WebDriverAgent,也就是大家熟悉的 WDA。
WDA 很经典,它把 XCTest 的能力封装成 WebDriver 接口,让 Appium 等工具可以操作 iPhone。
但到了 AI Agent 时代,需求发生了变化。
以前自动化测试关心的是:
我能不能通过 XPath / class chain 找到某个元素?
现在 AI 自动化更关心的是:
AI 能不能像人一样快速看懂当前屏幕,知道哪里可以点,然后直接执行操作?
这正是 iOS MCP 在 UI 节点获取方案上重新设计的原因。
下面这张图,是 iOS MCP 对同花顺 App 多个页面获取 UI 节点后的效果。
左边是原始页面,右边是 iOS MCP 获取到的节点覆盖效果。

从图中可以看到,在「首页、行情、自选、交易、资讯、理财」等多个复杂页面中,iOS MCP 都能识别出大量可操作 UI 节点,并用矩形框标出节点范围,同时给出可点击坐标。
这类金融 App 页面非常复杂:
传统自动化框架面对这种页面,经常会返回一棵非常大的 XML 树,AI 需要再从复杂层级里自己推理。
而 iOS MCP 返回的是更直接的结果:
{"text": "立即开户","rect": {"x": 243,"y": 218,"width": 58,"height": 36 },"tap": {"x": 272,"y": 236 },"clickable": true}也就是说,AI 不只是知道页面上有一个「立即开户」,还直接知道:
它在哪里,以及应该点哪个坐标。
这就是 iOS MCP UI 节点方案最核心的价值:它不是给 AI 一棵树,而是给 AI 一张可以直接执行的屏幕操作地图。
iOS MCP 中获取 UI 节点的工具是:
get_ui_elements入口位于:
MCPServer.m核心调用链大致如下:
MCPServer.m -> executeGetUIElementsAccessibilityManager.m -> getCompactUIElementsWithMaxElementsMCPAXRemoteContextResolver.m -> frontmostContextMCPAXAttributeBridge.m -> AXRuntime direct bridgeMCPAXNodeSource.m -> compactElementsForPid传统方案一般是:
拿到完整 UI 树 -> 递归遍历 children -> 转成 XML / JSON -> 再由上层查询而 iOS MCP 的思路是:
先定位当前前台 App -> 直接连接 AXRuntime -> 获取系统级候选节点集合 -> 合并可见节点、语义节点、可聚焦节点、hit-test 节点 -> 输出 compact 可点击列表它不是先生成一棵巨大的树,而是直接获取 AI 最需要的东西:
当前屏幕有哪些可见元素?哪些元素可点击?它们的文本是什么?它们的位置在哪里?推荐点击坐标是多少?在获取 UI 节点之前,iOS MCP 会先解析当前前台 App 的上下文。
核心类是:
MCPAXRemoteContextResolver它会尝试从多个系统来源获取信息:
AXFrontBoardFocusedAppsAXFrontBoardFocusedAppProcessAXFrontBoardVisibleAppProcessesAXFrontBoardFocusedAppPIDSpringBoard _accessibilityFrontMostApplicationWorkspace ScenesCADisplay.mainDisplay.displayId最终得到:
pidbundleIdprocessNamesceneIdentifiercontextIddisplayId这一步非常关键。
因为在 iOS 上,一个 App 不只是一个进程,它还和 scene、window context、display id、Accessibility runtime 状态有关。
WDA 更多是站在 XCTest 的视角看 App;iOS MCP 则是站在 SpringBoard 和 AXRuntime 的视角看整个系统当前状态。
iOS MCP 的底层桥接在:
MCPAXAttributeBridge.m它会动态绑定 AXRuntime 相关符号,例如:
AXUIElementCreateApplicationAXUIElementCreateSystemWideAXUIElementCopyAttributeValueAXUIElementCopyMultipleAttributeValuesAXUIElementCopyParameterizedAttributeValueAXUIElementCopyElementAtPositionAXUIElementCopyElementWithParametersAXUIElementCopyElementUsingContextIdAtPositionAXUIElementGetPid_AXAddAssociatedPid__AXSetRequestingClient_AXOverrideRequestingClientType也就是说,iOS MCP 不是通过 XCTest 间接获取 UI,而是直接进入系统 AXRuntime。
它还会执行:
ensureAssociationWithRemotePid(pid)这一步会把当前进程和目标 App 的 pid 做 AX 关联,让当前服务具备读取目标 App 无障碍节点的能力。
这也是 iOS MCP 能够在 SpringBoard 侧直接获取前台 App UI 节点的关键。
真正厉害的地方在:
MCPAXNodeSource.m核心方法是:
compactElementsForPidiOS MCP 会创建目标 App 的 AX 元素:
AXUIElementCreateApplication(pid)然后读取一组系统内部的 numeric AX attributes:
3015 visibleElements3025 elementsWithSemanticContext3022 explorerElements3029 nativeFocusableElements3031 siriContentNativeFocusableElements3032 siriContentElementsWithSemanticContext5001 children这些属性非常关键。
它们不是普通自动化框架常用的公开 UI 树属性,而是更接近系统无障碍运行时内部的候选节点集合。
可以理解为:
iOS MCP 直接问系统:当前屏幕上有哪些元素是可见的、可语义理解的、可聚焦的、适合无障碍操作的?
这比单纯递归 children 更适合 AI。
iOS MCP 不只读取一个来源,而是融合多类数据。
例如:
labelframevaluewindowContextIdwindowDisplayId例如:
framelabelvaluevisibleFrameisVisiblewindowContextIdwindowDisplayId例如:
centerPointfocusableFrameForZoomuserInputLabelsvisibleFrame最后统一归一化成 compact element:
textrectvisible_recttapclickableindexidpath这就是为什么效果图中可以看到大量红框精准覆盖在真实 UI 上。
iOS MCP 不只是拿到了文本,还拿到了:
节点范围可见范围推荐点击点是否可点击节点索引这对 AI 来说非常友好。
iOS MCP 还有一个很实用的机制:
compact_numeric_candidate_arrays_sampled_hits也就是:
候选节点数组 + 屏幕采样 hit-test 合并。
它会在屏幕上选择多个探测点,然后调用底层 hit-test:
AXUIElementCopyElementWithParametersAXUIElementCopyElementAtPositionWithParamsAXUIElementCopyElementAtPosition如果候选数组漏掉了某些节点,采样 hit-test 可能把它补回来。
所以 iOS MCP 的节点获取不是单点依赖,而是:
App 级候选节点+ Window 级候选节点+ 采样 hit-test 节点+ 多源属性融合+ fingerprint 去重+ compact 输出这也是它在复杂页面中表现稳定的原因。
本地抓到的同花顺首页结果中,可以看到类似信息:
{"source": "direct_ax_compact_attribute_crawl","direct_ax_strategy": "compact_numeric_candidate_arrays_sampled_hits","bundleId": "cn.com.10jqka.IHexin","root_count": 202,"serialized_candidate_count": 61,"element_count": 61}返回的节点里直接包含:
用户861994940消息中心搜索查看所需材料立即开户同花顺热榜学投资模拟炒股每个节点都带有可点击坐标。
对 AI Agent 来说,这就是“可执行的屏幕理解”。
WDA 的 /source 实现在:
WebDriverAgentLib/Commands/FBDebugCommands.m核心逻辑是:
FBApplication *application = request.session.application ?: [FBApplication fb_activeApplication];[application fb_waitUntilSnapshotIsStable];result = [FBXPath xmlStringWithSnapshot:application.fb_lastSnapshot];JSON 树则来自:
XCUIApplication+FBHelpers.m核心逻辑是:
return [self.class dictionaryForElement:self.fb_lastSnapshot];而 dictionaryForElement 本质上是递归遍历:
snapshot.children然后输出:
typerawIdentifiernamevaluelabelrectframeisEnabledisVisiblechildren所以 WDA 的路径可以概括为:
XCTest -> XCUIApplication -> XCElementSnapshot -> snapshot.children -> XML / JSON -> XPath 查询而 iOS MCP 的路径是:
SpringBoard / MCP Server -> frontmost pid/context/display -> AXRuntime direct bridge -> numeric candidate arrays -> sampled hit-test -> compact actionable elementsWDA 的 XML / JSON 很适合测试脚本。
但 AI 更需要的是:
{"text": "搜索","tap": {"x": 145,"y": 42 },"clickable": true}AI 拿到之后可以直接决策:
我要点击搜索框,坐标是 145,42。WDA 的优势是 WebDriver 生态。
但 iOS MCP 更靠近系统无障碍运行时,能拿到更多系统内部候选节点,例如:
visibleElementselementsWithSemanticContextnativeFocusableElementssiriContentElementsWithSemanticContext这让 iOS MCP 更像是在复用系统给 VoiceOver / Siri 使用的语义视图。
iOS MCP 不只知道 App 的 pid,还知道:
sceneIdentifiercontextIddisplayIdAXRuntime 状态Accessibility registrar 状态解析路径 trace这对复杂场景非常重要。
传统 XML 很大,层级深,噪声多。
iOS MCP compact UI 节点更像这样:
index: 7text: 立即开户rect: 243,218,58,36tap: 272,236clickable: true这对大模型来说更容易理解,也更容易执行。
WDA 是 iOS 自动化测试时代的经典方案。
它的核心是:
XCTest snapshot + XML/JSON tree + XPath 查询而 iOS MCP 面向的是 AI Agent 时代。
它的核心是:
AXRuntime 直连+ 系统候选节点+ 多源属性融合+ hit-test 补洞+ compact 可点击列表+ MCP 工具协议如果说 WDA 提供的是:
给测试脚本看的 UI 树
那么 iOS MCP 提供的是:
给 AI Agent 用的屏幕行动地图
它不只是告诉 AI 屏幕上有什么,还直接告诉 AI:
这个节点叫什么?它在哪里?是否可见?是否可点?应该点哪个坐标?属于哪个 App / pid / context / display?这就是 iOS MCP UI 节点获取方案真正厉害的地方。
在 AI 自动化时代,UI 节点不应该只是 XML。
它应该是模型可以直接理解、直接决策、直接执行的操作地图。
而这,正是 iOS MCP 正在做的事情。
iOS MCP 已开源,欢迎 Star、Issue、PR,也欢迎一起交流 iOS 设备自动化、AI Agent 控机、AXRuntime、越狱环境下的系统能力调用等相关技术。
项目地址:
https://github.com/witchan/ios-mcpGitHub:
https://github.com/witchan/ios-mcp
iOS MCP 已经聚集了不少开发者和用户持续交流,目前已建立多个微信交流群。
移动端Android和iOS开发技术分享 | |
![]() | ![]() |
6 群二维|码|如已过期,请添加微信
witchan028或关注公众号移动端Android和iOS开发技术分享获取最新入群方式。
欢迎添加微信或关注公众号,获取最新动态与入群方式。
witchan028witchan028@126.com
# 【iOS逆向与安全】iOS
# MCP
# 获取
# UI
# 节点的实现原理:为什么它比传统
# WDA
# 更适合
# AI
# 自动化?
# 软件教程
# 的是
# 已满
# 这就是
# 递归
# 多个
# 遍历
# 这对
# 可以看到
# 可以直接
# 无障碍
# 它在
# 站在
# 同花顺
# 一棵
# 它会
# 单点
# 首页
# 绑定
# 更像
相关栏目:
【
设计资讯7769 】
【
行业资讯35393 】
相关文章:
经典平面广告设计软件
咖啡色在平面广告设计中的魅力与应用
特色农产品平面广告设计
新推出的地铁平面广告设计
宝宝平面广告设计:
西门子平面广告设计
水晶平面广告设计
电脑平面广告设计动漫
膜法世家平面广告设计
平面广告设计内容阐述
户外平面广告设计案例
平面广告设计与制作知识点
平面广告设计应用
平面广告设计加盟
时尚芭莎平面广告设计案例
平面广告设计制作收费
平面广告设计要素
平面广告设计后记
平面广告设计常用网站
奥妙平面广告设计创意
平面广告设计软件测试需要
10年平面广告设计师
平面广告设计及鉴赏
平面广告设计制作安装:用创意点亮城市
箱包类的平面广告设计软件
欧洲平面广告设计
关于家庭的平面广告设计
平面广告设计进货价:
服装优秀平面广告设计
一站式平面广告设计理念
转账支票平面广告设计说明
平面广告设计工作室改造
平面广告设计功底分析论文
吸尘器平面广告设计说明
缤纷盛夏平面广告设计分析
平面广告设计西游记:颠覆传统的创意之旅
知名平面广告设计价格
清肠平面广告设计
零食平面广告设计:创意与效果共存
杂志平面广告设计
平面广告设计师的工作要求
戛纳创意平面广告设计
平面广告设计赏析
博日平面广告设计
平面广告设计霸王洗发露
一加8T平面广告设计
平面广告设计对称型
平面广告设计室名:创意无限
小米手机平面广告设计
平面广告设计信息设计