Goldie:用编码Agent自动化App Store截图与上架合规校验

发布时间:2026/9/12 6:49:42
Goldie:用编码Agent自动化App Store截图与上架合规校验 如果你每天也刷GitHub热榜大概率这几天注意到Goldie了。这个项目的定位非常清楚一款面向App上架素材生产的编码Agent主打自动化生成App Store截图与预览视频同时内置苹果上架合规校验。我第一次看到的时候第一反应是“这又是一个套壳脚本”直到把一个真实项目的素材跑完才发现它把苹果审核那套元数据规则确实吃得很透。这篇文章就围绕Goldie把它的设计思路、核心实现、合规校验机制、实操配置和踩坑记录完整拆一遍。想少熬夜传截图、批量更新多语言素材、或者给团队引入上架自动化流程的同学这期内容值得看完。1. Goldie项目概述它到底解决的是哪类痛点1.1 为什么我会在GitHub热榜上多看了它一眼做iOS开发的人都有体会功能开发可能一周就结束但App Store上架素材整理能拖你两三天。截图尺寸要按设备匹配每张图不能带模拟器边框状态栏时间要固定成9:41预览视频必须15到30秒而且每种语言都要单独准备一套。如果你的App做了中英日法四种语言五台设备规格光截图就是几十张加上预览视频重复劳动非常夸张。更麻烦的是这类素材属于“高重复、低创造性”工作但它又必须真实反映App功能。如果你拿设计稿去拼一个假截图苹果审核的2.3元数据条款直接拒绝说你误导用户。所以很多团队的做法是让测试工程师写UI自动化用例跑起来后一张张截图再交给设计师去PS。这个流程看似可靠实际每次都等于一个小项目写脚本、维护选择器、处理权限弹窗、调状态栏、处理视频转码。Goldie的核心思路就是把这整条链路封装成一个Agent用一个自然语言目标去驱动而不是人肉维护一整套脚本。1.2 编码Agent与传统自动化脚本的本质区别这里要先说清楚“编码Agent”这个概念的含金量。传统UI自动化测试比如XCUITest或Appium你是先写死每一步操作打开App点击某个按钮输入文字断言页面出现某元素然后截图。这套方案的问题是脆iOS版本一升级某元素的accessibility identifier变了脚本就挂。你还要花大量时间维护定位方式。Goldie这类Agent的思路不一样。它把任务当成一个目标比如“进入首页切到深色模式展示今日数据卡片截图”然后自己拆解步骤、生成可执行的测试代码、运行并收集结果。如果某一步因为元素找不到而失败它能看到报错信息自己修正选择器再重新执行一次。这一点在复杂App上非常关键因为真实的UI层级经常和开发者预期不一样只有能自我调试的Agent才撑得起自动化截图这个场景。另外还有一层Agent不是只生成一张截图就完事它会主动检查生成结果是否符合苹果上架规范。比如状态栏里出现了真实的当前时间它会识别出来并在下一个版本里做状态栏覆盖比如截图中带了开发者环境的调试浮层它也会在合规校验阶段提出来。这种“闭环”能力正是它区别于普通脚本工具的地方。1.3 一次完整上架素材生产的工作流闭环用Goldie跑一次任务时它实际覆盖了下面这些环节解析任务描述、读取当前App的页面层级、生成UI操作脚本、执行并截图、从连续帧里抽取关键画面、合成预览视频、跑合规校验、输出素材包和检测报告。整个流程结束之后你拿到的不只是一堆图片和一个mp4还有一份和苹果指南逐条对应的自查清单。我在本地跑通之后最大的感受是它把“上架素材”从一个纯手工活变成了“声明式”任务。你需要提供给Goldie的不再是每一步脚本而是一个配置App的Bundle ID、需要的设备尺寸、每个场景的描述、语言、截图数量。剩下的事情它会自己处理。这种体验对经常做多语言包发布的团队来说是质的改变。2. 核心技术拆解一个Agent如何从0到1完成截图与视频生成2.1 任务解析与代码生成从自然语言到可执行用例Goldie的第一步是任务解析。如果你想让它截图首页不能只说“截个图”它需要更结构化的描述。比如“打开App后停留在首页当前用户已经登录页面顶部是个人头像与通知按钮中部是数据概览卡片底部是Tab栏请截取一张展示数据概览的完整页面”。这个描述会被Agent拆解成几部分需要启动App、需要确保登录态、需要定位数据卡片区域、需要决定截图的时机等待数据加载完成后再截。它最核心的技术点是生成可执行的XCUITest代码。这里不是简单的录制回放而是根据当前模拟器里的真实UI层级动态生成。我在看日志时注意到它是先读取一次UI层级树再决定用什么选择器来定位元素。比如某个按钮没有设置accessibilityIdentifier它会退而求其次用静态文本和坐标结合的方式去定位。这很实用因为很多团队的代码并没有良好的可测试性标注。实际运行中Agent还会处理失败重试。如果生成的第一版代码在运行时找不到某个元素它不会直接告诉你说“失败了”而是读取失败日志自动调整定位策略。这个过程可以在日志里看到第一次点击目标元素失败定位器改为匹配文本关键字第二次成功。这种自由探索能力意味着它对UI改版的容忍度很高。2.2 截图与预览视频的实现细节尺寸、状态栏与合成策略App Store截图是有严格尺寸要求的不同设备必须使用苹果指定的像素尺寸。Goldie在设备配置上做得比较聪明你不必手动填每个分辨率只需要指定目标模拟器设备型号它会自动匹配对应的截图规格。比如iPhone 15 Pro Max对应6.7英寸的1290 x 2796iPhone 15 Pro对应6.1英寸的1179 x 2556。很多自动截图工具在这个环节会翻车因为它们直接用模拟器窗口像素忽略设备缩放比例。Goldie是先将模拟器启动为标准的物理尺寸然后用xcrun simctl io booted screenshot命令截取再按设备规格做像素级校验。输出图片如果不满足尺寸会被标记为error并重新截取。预览视频的合成是另一套逻辑。苹果要求预览视频长度为15到30秒而且不能是纯幻灯片。Goldie的做法是在运行UI自动化脚本时连续按帧采样通常每秒5到10帧拿到一段真实操作过程的画面序列再根据场景自动选帧停留时间长的页面会多保留几帧快速跳转的页面则缩短时长。最后用FFmpeg合成视频支持添加转场、字幕覆盖和背景音乐。这里有个值得说的点合成完视频后它还会检查视频编码和参数。苹果推荐使用H.264编码帧率不超过60fps文件格式是.mov或.mp4。如果编码不对上传App Store Connect时会遇到奇怪的错误Goldie在本地就把这层校验做了能省掉很多上传阶段的来回。2.3 内置合规规则引擎的检查维度我一开始以为合规校验就是个免责声明真正跑完后发现它内置了一条相当完整的检测链。规则大体分成五类格式规则、内容规则、元数据规则、内购规则和隐私规则。格式规则检查尺寸、数量、格式、文件大小。比如iPhone设备最多支持10张截图超过会直接报错。内容规则检查截图中是否出现模拟器边框、状态栏时间是否异常、是否出现开发环境的调试按钮、是否有测试数据泄露。元数据规则检查App标题长度、副标题长度、隐私政策URL、支持URL、版权信息等。内购规则会分析截图中的购买按钮对比App Store Connect里配置的商品ID是否一致。隐私规则主要看是否使用了IDFA、是否申请了位置权限并在App Store Connect的隐私声明里做对应说明。这些规则的严重级别不是一概而论的。格式问题和内容问题是error级别直接阻塞上传某些元数据问题属于warning级别比如版权信息缺省允许人工确认后再继续。这种分级设计很合理因为合规校验本身不是“零容忍一切异常”而是帮你把真正会被苹果审核拒绝的点抓出来。3. 实操配置与运行实录让Goldie产出第一套素材3.1 环境准备你需要一台标配的MacGoldie当前对环境的依赖不算复杂但基本锁定在macOS生态毕竟模拟器和Xcode只有在Mac上才能完整工作。我的测试机配置是Mac mini M216GB内存系统版本macOS 14Xcode 15.4iOS 17.4模拟器。这个配置跑下来整体流畅如果内存只有8GB会比较吃力因为要同时起模拟器、编译测试包、还要跑Agent进程。安装过程并不复杂。假设你已经把仓库克隆到本地首先要创建Python虚拟环境并安装依赖。Goldie的依赖里有几个重量级库比如fastapi用于本地服务Pillow用于图像处理openai或同类SDK用于调用大模型能力。官方推荐用uv或pip安装我实测pip没问题。安装完依赖后接下来就是初始化配置git clone https://github.com/your-path/goldie.git cd goldie python3 -m venv .venv source .venv/bin/activate pip install -e . goldie init --project-dir ./my_app_assets需要注意的是Goldie并不仅仅调用一个本地模型它依赖LLM来实现任务分解和代码生成。所以你需要在本机配置一个可用的模型API访问方式不管是用OpenAI兼容接口、本地模型服务还是公司内部的Agent网关只要它在底层实现了LLM的能力就行。官方默认走的是一个可插拔的Provider接口配置项在config.yaml里。3.2 编写一次截图任务配置初始化完成后会在目标目录生成一个config.yaml。这个文件是整个任务的声明中心。我用一个真实案例来说明结构假设我的App叫“每日清单”Bundle ID是com.example.dailycheck需要为iPhone 15 Pro Max生成首页、添加任务、统计页三个场景的中文截图。project: bundle_id: com.example.dailycheck platform: ios devices: - model: iPhone 15 Pro Max size: 1290x2796 scenes: - name: home description: 用户已登录首页展示今日任务列表顶部有个人头像和天气信息底部Tab栏处于第一个选中状态截一张整体首页 max_screenshots: 3 - name: add_task description: 从首页点击右下角加号进入添加任务页输入框已填写“买牛奶”点击日期选择器展示日期选择面板截一张状态 max_screenshots: 2 - name: stats description: 切换到统计页展示近7天完成率的柱状图数值突出截一张统计页完整画面 max_screenshots: 2 compliance: language: zh-Hans title: 每日清单 subtitle: 让每天更有序 privacy_url: https://example.com/privacy support_url: https://example.com/support copyright: 2024 Example Inc. idfa: false初看这个配置你可能觉得和写一份“人工截图需求文档”没有区别。这正是它的价值点你不再需要把“点击哪个坐标”这种底层细节交给工具只把业务目标说清楚剩下的定位和操作都由Agent去完成。description写得越具体截图出来的内容越准确特别是登录态、Tab选中状态、弹窗状态这类细节千万要写明。3.3 运行过程与产物目录解读配置写好后执行运行命令goldie run --project-dir ./my_app_assets --scene home --lang zh-Hans这时候Goldie会做一串事情启动指定模拟器安装最新构建的App读取UI层级生成XCUITest代码编译并运行测试在目标页面执行截图。如果是第一次跑耗时一般比较长因为要编译测试包。后续复用同一模拟器实例会明显变快。我跑home场景时第一次失败了。原因是Agent生成的脚本想点击用户头像进入个人中心但我的首页此时有一个新人引导弹窗挡住了头像。这个在人工测试时很常见自动化脚本遇到这种状态很容易困惑。Goldie的处理方式是读取当前页面元素发现弹窗存在先生成代码点击“跳过”按钮再重新定位头像。整个运行过程会在终端打印非常详细的步骤日志当前正在执行什么操作、为什么这样决策、截图保存路径、校验结果。最终产物输出在output/目录下组织结构是按场景、语言、设备分目录。每个场景目录里除了截图还有一个description.json记录这个场景的任务描述、实际执行步骤、截图时间点方便追溯。审核如果不通过可以快速定位是哪张图出了问题。4. 合规校验机制详解苹果上架最容易踩的坑4.1 元数据与截图的常见被拒原因对照苹果审核对元数据和截图的态度非常严格很多开发者容易忽略的细节会直接被判定为2.3项违规。我整理了和截图、预览视频关系最密切的几个高频被拒原因Goldie的规则引擎也主要是围绕这些点做的。截图数量超过上限是常见问题。iPhone端最多10张iPad端最多10张如果超出上传数量App Store Connect在网页端就会拦截。格式问题和尺寸不匹配也是一类比如用了iPhone 15的截图尺寸但实际分辨率不对或者图片包含圆角遮罩、设备边框这些都会被判定为“包含与实际设备展示不符的内容”。更隐蔽的坑是状态栏。苹果推荐截图的状态栏时间显示为9:41信号满格电池约为100%这不是强制条款但如果截图中状态栏显示的是开发者测试时的真实时间和低电量视觉上就很业余也容易让审核人员怀疑截图不是从真实设备上获取的。预览视频的问题主要是超时、尺寸不对、或者画面看起来像静态幻灯片后者是明确会被拒的。我见过很多团队因为预览视频是Keynote动画套模板而被拒。苹果要求预览视频必须真实展现App功能不能是宣传动画也不能是静态截图的连续展示。Goldie在这个点上有个设计优势它的视频素材来自真实的UI自动化操作画面天然是真实功能演示不太可能因为“描述与事实不符”被打回。4.2 规则引擎如何工作与自定义规则Goldie的合规规则引擎不是写死的它采用声明式规则配置。默认规则文件在config/rules/目录下每个规则包含检查类型、目标对象、判定逻辑和严重级别。如果你想增加团队自定义规则只需要按相同格式追加一个规则即可。举个例子假设你公司要求所有面向海外用户的截图不能出现中文硬编码测试数据你可以配置一条这样的规则扫描截图中是否有特定关键词如果命中则输出warning。这看起来简单真正实现起来需要OCR能力。Goldie底层有OCR引擎会在生成截图后对图片做文本识别再把识别结果喂给规则判定器。这种机制对多语言团队特别有用。不同语言的合规要求不完全一样比如欧盟区对个人数据保护相关表述更敏感你可以针对性的加规则。我往里面加过一条“德语截图中的隐私相关文案必须包含Datenschutz字样”从实际效果看规则能正常识别并给出提示。4.3 上线前的合规自查清单无论你的素材是Goldie生成还是人工制作在上传前都建议按下面这份清单过一轮截图尺寸是否严格匹配所选设备截图数量是否在对应设备的限制内截图是否含模拟器边框、圆角遮罩、开发工具栏状态栏时间与信号是否已标准化截图中的文案是否与App实际功能一致版本号或文案里是否出现占位符隐私政策URL、支持URL、版权信息是否完整填写若使用广告标识符IDFA是否在App Store Connect中声明App内购买的展示文案和商品ID对照是否一致预览视频长度是否在15到30秒之间视频编码是否为H.264或HEVC且大小正常。这些检查项看着细碎但每一条背后都是真实踩坑换来的经验。Goldie把这些规则数字化以后等于把资深审核人员的经验沉淀成了工具这一点在团队协作场景里特别值钱。5. 实测中的问题与心得哪些环节会卡住你5.1 常见问题与排查速查表我在实际操作中遇到过一些典型问题整理成一张速查表方便你直接对照排查。现象可能原因处理方式Agent一直循环尝试但截图失败模拟器出现系统权限弹窗阻塞测试流程在模拟器上预先允许通知/定位权限或在配置中启用自动权限处理截图状态栏显示真实时间未启用状态栏覆盖设置在config.yaml中设置status_bar.override为true并指定时间9:41视频合成后提示编码错误输出编码与苹果要求不匹配检查FFmpeg参数确认使用H.264编码并关闭B帧的某些参数模式截图数量超过限制场景配置中max_screenshots过大拆分场景或减少关键帧截图内容出现其他App图标模拟器没有清理干净页面有推送横幅运行前重置模拟器或禁用模拟器通知生成的测试代码反复调用模型导致耗时过长场景描述不够清强化场景描述补充页面状态和登录态信息减少Agent试错轮次权限弹窗问题是自动化场景里最影响成功率的一环。新版iOS对隐私权限管理很严格定位、通知、通讯录等权限第一次弹窗出来时XCUITest如果没处理好就会卡住。我的经验是在运行任务前先用一个简单的自动化脚本把目标App的权限都预置一遍这样Goldie真正跑场景时就不会被弹窗打断。5.2 我的几条实操经验与避坑建议第一第一次运行前一定要准备一个已登录的模拟器镜像。很多App的核心页面必须在登录状态下才能展示Agent虽然可以自动处理部分弹窗但登录凭据这种东西它没法凭空生成。我的做法是预先在模拟器上手动登录一次之后全程保持模拟器不重置让登录态一直有效。第二截图之间如果涉及异步加载一定要在description里写明“等待数据加载完成”。我一开始写首页场景时没说这个条件Agent有时在列表刷出来之前就截图了导致图片里是空白骨架。后来我在描述里补了一句“等loading结束后再截”成功率高了很多。第三token消耗需要关注。编码Agent类工具本质是在用模型能力换免维护成本每执行一次任务可能产生好几轮模型请求。如果你的场景很多且每次都从零开始让Agent探索单次成本会比较高。建议为高频场景开启结果缓存或者把已跑通的场景固化成脚本模板减少重复模型调用。第四不建议把Goldie生成的结果直接自动上传到App Store Connect。毕竟上架是不可逆的关键操作最好保留一次人工审核环节。最合理的流程是Goldie生成素材并过合规规则人工在产物目录里快速浏览一遍确认符合预期后再用Fastlane或手动上传。5.3 什么项目适合用Goldie什么场景不建议用从我的实践看Goldie最适合的场景是UI改版后的批量素材更新。比如新版首页改版需要重新截取所有语言的首页截图和预览视频这种需求高度重复且时效性强用Agent驱动的收益非常明显。另一个合适场景是团队没有专职测试工程师但需要维护一套定期更新的上架素材Gil算是把一部分测试自动化的能力封装成了开箱即用工具。不太建议的场景有三个一是App本身还在频繁迭代每个版本UI都不稳定自动截图产出的素材可能几天就过期二是场景内部有复杂的物理环境依赖比如需要蓝牙外设、需要真实定位、需要外部硬件配合模拟器很难模拟到位三是内容极其敏感的金融、医疗类App截图中包含真实用户数据的风险很高即便有规则检查也建议保留更强的人工审核机制。在实际使用过程中我还摸索出一个比较顺的工作流每周四晚上让Goldie在CI上跑一遍全场景截图任务周五上午人工审图并更新素材。这样既不会占用开发时间也能保证上架素材始终和当前版本保持同步。如果你原本上架素材要花上两天试试让Agent先跑一遍省下的时间会非常可观。最后分享一个细节心得Goldie生成的预览视频虽然不是电影级动效但好在全部来自真实操作苹果审核对这类素材天然友好。我在一次版本更新中直接用它产出的视频一次通过没有收到2.3相关的元数据问题。对长期维护上架素材的开发者来说少一次审核打回就是实打实的效率提升。