跳至内容

找菜:统一的原生做菜入口 ​

「找菜」首屏优先展示紧凑输入框和食材快选。知道菜名可以直接输入,有食材可以说一句话或点选。场景和饮食目标集中在原有「筛选」中;三道灵感、换批和「帮我决定」排在食材、厨具选择区之后。用户无需先选择自己的类型或操作模式。

底部导航为「找菜/冰箱/菜谱/我的」。菜谱页右上角的骰子图标打开「今天吃什么」面板,首次立即给一道,点「换一道」播放骰子与卡片换位动效。找菜页的「帮我决定」复用同一面板;它只从当前三道灵感抽取,菜谱骰子从完整共享候选池抽取。两者共用食材、厨具、忌口、饮食目标和场景规则;菜谱入口忽略找菜页的菜名关键词,不修改原搜索,灵感入口遵守当前菜名。列表与云厨房仍是找菜的两种布局;右上角使用清空图标和视图图标,菜单保留「食材快选/云厨房」及当前项。首次默认快选,之后记住展示偏好。没有新增 WebView 或 AI 后端。

页面上的几种行动 ​

当前想法直接操作结果
「今晚做番茄炒蛋」输入菜名并提交在当前共同条件内按菜名找菜;输入结果和当前条件都有说明
「有土豆和鸡蛋,不要辣」在同一个输入框说一句话识别食材、厨具、忌口和已有支持的做法条件,合入共享会话
「下班了,想省点心」在「筛选」中点「省点心」等场景用短故事解释想法,并立即收窄真实候选;再次点同一场景可取消
「先看看再说」向下浏览选择区后的灵感默认不预选场景,给最多三道候选;点开任一道进入既有详情
「这几道里替我选一道」点「帮我决定」,或在灵感可见时摇一摇面板从当前批次给一道,点「看做法」进入带匹配和目标的既有详情
「还想多看一些」点「换三道」或「查看全部 N 道菜」前者在当前条件内换一批,后者进入完整候选列表

食材、厨具、筛选、饮食目标和冰箱快捷选择仍然可用。明确诉求、模糊诉求和随意浏览对应同一页上的不同动作;同一个人在一次使用中可以自然改变方向。

条件与状态边界 ​

表达对应的数据
省点心difficulty == 简单;没有记录难度的条目不当作简单
来点热乎的共享推荐规则的「汤羹」分组,依赖菜谱中的「汤」标签
换个家常口味recipe.tags 包含「家常菜」;不推断个人历史口味
不选场景不增加场景限制,继续使用当前共同条件

源候选和食材匹配来自 CookSession.candidateSnapshot(in: store);选过食材时,候选数组和 matchesByID 出自同一次推荐查询。会话层统一处理关键词、场景和饮食目标,三道建议、完整结果、结果计数和厨房布局取相同条件。关键词在无食材、无厨具的全目录分支也生效,不由页面单独补一份过滤。

菜名搜索、食材、厨具、场景和已有做法/难度条件用于本次找菜。场景保存在共享 CookSession 的临时状态,切换列表/云厨房不丢失,不写入 AppStorage 或长期偏好。句子中的忌口和「不吃辣」继续复用现有输入规则,会更新对应的长期偏好;不是一套独立的探索偏好。

「清除菜名」只撤销关键词;空态的「取消这次场景」只撤销场景,保留食材、厨具、关键词、忌口和饮食目标。「清空」撤销本次找菜条件,保留长期忌口、常备调料和已记住的目标设置。没有候选时不自动放宽条件、不从普通目录补齐目标菜谱。目标核对数据不可用时展示已有 dietaryUnavailableMessage(for:)。

场景「简单」只描述已记录的难度,不承诺时长、少洗锅或少用料。「热乎」「家常」是浏览方向,不代表低油、低糖、营养达标或疾病饮食。未选食材时不暗示家中用料齐全;有食材时保留真实匹配和缺料信息。每批按菜名去重,候选不足三道时按实际数量展示。

原生组件的复用 ​

  • CookQueryField 提供同一个原生行内输入框,普通字号的搜索行取消额外上下内边距,保留至少 44pt 交互高度;只在提交后显示反馈,大辅助字号允许提交操作换行。列表顶部只保留 8pt 内容边距。提交交给 CookSession.applyDiscoveryInput,无需先展开搜索或选择模式;有文字时提供「预览条件」,沿用主线原生 SearchIntentSheet 与会员 AI 设置、发送前确认;普通提交仍采用本地搜索与规则识别。
  • CookDiscoveryScenePrompt 放在既有 FilterSheet,与饮食目标、做法、难度和忌口集中设置。CookActiveConditions 仅在已选场景、目标或菜名时出现在搜索框后,允许逐项取消;默认不占首屏。取消目标沿用原“不限目标”语义,包括取消已记住目标;顶部“清空”仍保留目标记忆。
  • CookInspirationSection 提供三道候选、换批、决定和空态。列表中位于食材及厨具之后,云厨房中位于台面及食材篮之后。标题、当前条件和随机操作位于同一原生推荐卡片的首行,三道菜继续使用独立列表行;按钮在窄屏或大字号自动换行。随机决定面板由 CookDecideSheet 共用,不恢复原来的探索模式选择。
  • 窄屏在同一导航栈中输入、浏览和打开详情,固定底部“查看全部”进入完整结果页。iPad 左侧优先搜索与食材,右侧恢复 ResultsView(isEmbedded: true) 的完整实时结果,移除右侧重复输入/目标选择器和查看全部的中间步骤;左栏后置灵感的打开与随机决定显式路由到右栏详情。
  • 云厨房在紧凑输入后直接展示 3D 台面、旋转操作和食材篮,推荐后置;保留原有相机、投影命中、加载与生命周期逻辑。
  • RecipeRow、.recipeActions、FavoriteActions 和 RecipeRoute 共用现有行、收藏、预览与详情实现。菜名、元信息和缺料允许纵向展开;有食材时把同一个候选快照中的 match 传进详情,目标说明和已核对正文继续使用现有能力。
  • 推荐方式共用 RecommendationMode.displayTitle,选过食材时显示在当前条件中。不能把「只看食材齐全」造成的空结果误解释为场景失效。
  • 摇一摇桥接由 App/DeviceShake.swift 共用。找菜的灵感未显示时,摇动从整个当前候选池打开决定面板;灵感显示时仅从当前批次抽取。详情、筛选、条件预览或决定面板已打开时,背景页面不再响应;决定面板自身仅在 App 活跃且未展示筛选时换一道。候选变动会取消旧换牌任务,空批次不扩大到目录,确认时再次读取有效候选与匹配。菜谱随机有其他菜名可选时避开上一道同名菜。iPad 的明确选择及确认随机结果仍可替换右侧现有详情。
  • 「换三道/帮我决定」收在随内容滚动的推荐卡片内,辅助字号可纵向排列,不在分组标题上放交互。固定底部仅保留现有「查看全部」安全区操作栏,找菜与厨房使用对应页面底色连续覆盖底部,避免灵感文字从浮动 Tab 栏周围露出;其他页面继续沿用原有玻璃边缘。

采用系统颜色、动态字体和现有主按钮样式;场景与换批遵守减少动态效果设置。辅助字号直接打开全高筛选,常规字号保留半屏/全屏,避免固定结果计数挤占选项视口。筛选弹窗的展示配置由 FilterSheet 自身统一管理,列表与厨房不会分开维护。换批提供简短播报,候选的无障碍内容包含菜名、理由和缺料。

当前验收范围 ​

  • 小屏首屏无需滚动即可点选常用蔬菜;默认不展示场景和目标卡片,随机与推荐不挤占快选区域。菜谱页骰子图标保持常驻,旧探索模式选择不恢复。
  • 同一个输入框分别验证菜名搜索和一句话食材/忌口;清除菜名后保留其他条件。
  • 场景可选择和取消;零候选时只撤销场景,食材和厨具继续保留。
  • 换批只在当前条件内进行,候选充足时避开上批;「帮我决定」先给当前批次中的一道,确认后进入真实详情并保留匹配和饮食目标。
  • 长按收藏、详情收藏状态和既有收藏列表共用数据;厨房布局首屏可操作台面食材,后置灵感仍共享相同场景与候选,并保留原有 3D 操作。
  • iPhone 打开完整结果后验证指定菜谱;iPad 直接验证右侧完整结果与左侧食材联动,不再先点查看全部。取消饮食目标后继续浏览目录。
  • 最大辅助字号检查输入、场景、候选、操作区和真实详情;VoiceOver、减少动态效果和最终分发构建验收按实际结果单独记录。

骰子入口不受菜谱页的「全部/收藏/最近浏览」和本地目录搜索限制;这些状态在随机面板关闭后保持。确认随机菜谱后,手机进入原有详情列,iPad 更新右侧详情,即使当前收藏为空也可正常打开。减少动态效果时不显示背景牌、不转骰子,只保留短透明度过渡。

当前没有新增匿名统计。产品效果仍需观察首次打开详情的比例与耗时、收藏和查看做法、连续换批及零结果,并结合访谈判断用户是否理解场景。不能仅凭点击量或自动化通过断言选菜更轻松。

历史试验说明 ​

以下记录保留各阶段的实际结果:2026-10-28 比较探索弹层的三种方式,2026-10-30 先整合共享候选,再合并找菜入口。2026-10-31 的布局调整将食材和厨房台面恢复首屏,并将场景收进筛选。旧版的实际通过、失败与清理记录保留,但不作为新布局的验收证据。

本轮验证(2026-10-28) ​

本轮最终交付收敛到原生 iOS。先前 Web 版本仅作为交互草图验证参考,相关试验代码回收;其浏览器验证不作为原生构建、导航、无障碍或真实用户效果的验收证据。

验证已知结果范围与限制
App 单元测试CookTests 133 项通过覆盖本轮候选规则及已有 App 单元回归
iPhone 15 Pro/iOS 27.0 首轮 UI6 项中 4 项通过、2 项失败通过项为已有做菜流程、云厨房基线、探索空态撤销、三种方式及双入口;失败位于测试 helper 的导航快照竞态与最大字号滚动定位
iPhone 失败项复验饮食目标流程通过,48.729 秒;最大辅助字号流程通过,122.370 秒修正测试 helper 后完整重跑两项,期间 App 源码与首轮相同。结果为 phone-retest.xcresult,不把两轮结果表述为同一次六项全部通过
iPad Pro 13 英寸 M5/iOS 27.02 项通过修正后的测试 helper,空态撤销 90.635 秒,三种方式、换批、详情及双入口 97.396 秒;结果为 ui-ipad.xcresult

饮食目标复验确认「减少添加糖」在探索、现有详情、已核对正文及关闭探索后保留。最大字号复验确认菜单式方式选择、家常场景按钮、拼句候选及「直接找菜」流程可操作;截图中家常按钮完整位于 sheet 内。原失败发生在将离屏按钮滚入视口的测试辅助步骤,未触及按钮边界断言。

本轮保留标准字号场景、最大字号场景、最大字号拼句结果及饮食目标已核对正文截图,另在现有 iPhone 模拟器打开实际页面,检查了浅色与深色并恢复浅色。截图与功能断言不替代完整 VoiceOver 人工验收、独立无障碍审计或真实用户效果验证;最大字号截图中已有菜谱行的厨具/难度元信息仍有省略,不据此宣称所有文本均无截断。当前没有发布结论。

测试操作复用现有共享模拟器并显式使用 -parallel-testing-enabled NO,没有新建设备。MCP 单次测试观察在 300 秒超时后,原 xcodebuild 进程继续执行并正常结束,未据此重启测试。另一次 build_sim 显式传入 testProductsPath 时,被工具的 scheme 前置校验拒绝,未真正进入编译;后续改用相同 Xcode/SDK、UDID 和 DerivedData 的 CLI 串行构建与复验。

导出结果摘要、App 源码指纹和关键截图后,已回收任务临时 DerivedData、原始结果包及三份工具生成的测试产品副本。删除文件按 du 计 497.4 MiB,卷可用空间实测增加 472.8 MiB;依赖、模拟器和唯一源码保留。iPhone 15 Pro 留在原生探索页面用于体验,本轮未发布 TestFlight。

整合收尾(2026-10-30) ​

本轮将探索与既有 iOS 功能收敛到共享实现:关键词过滤归入 CookSession 的候选快照,探索候选与匹配只查询一次;随机页沿用相同快照并补传食材匹配;探索复用现有收藏操作;推荐方式共用显示标签并加入探索条件摘要;菜谱行从结果页提取为共享组件,并调整辅助字号下的纵向显示。「换三道」复用现有 bottomActionBar 和主按钮样式,为滚动内容预留操作栏空间。列表/云厨房仍是做菜页的两种布局,三种找灵感方式仍在同一张探索 sheet 中,不新增主导航分支。

本轮验证当前状态需要确认的行为
App 单元回归最终底栏版本重新运行,152 项通过,0 失败、0 跳过iPhone 15 Pro/iOS 27.0;包含新增 5 项候选快照测试、6 项探索模型测试,以及已有 App 单元回归
探索 UI 最终回归三种表达、双入口、换批、收藏详情联动通过iPhone 15 Pro/iOS 27.0;底栏修复后使用同一测试产品再次完整运行
探索条件 UI 回归空态撤销、推荐方式摘要、饮食目标与已核对正文通过底栏调整前通过;随后仅改变底栏布局,候选与状态逻辑保持不变
随机页 UI 回归通过从随机卡片打开既有详情,保留已有食材和缺料分组
辅助字号 UI 回归最终底栏版本完整通过原生菜单、场景、拼句、共享行换行及单次点击返回入口均通过;保留修复前两次失败结果与修复后截图

最大辅助字号测试首次在返回入口关闭断言失败;只增加点击前后截图、不改 App 源码复验,仍在同一断言失败。截图确认两行返回按钮与底部浮动工具栏重叠。随后将探索的独立底部工具栏替换为做菜页已有的安全区操作栏,保留原来的单次点击与关闭断言,不通过增加点击次数或放宽断言处理。最终构建的 152 项 App 单测与 1 项最大字号 UI 一起通过;返回文字不再被换批按钮遮挡,单次点击成功关闭探索。

最终底栏版本另一次 UI 冒烟完整验证三种表达、换批、长按收藏到详情的状态联动,以及列表/云厨房双入口。两项最终 UI 与 152 项单测使用同一组 App 源码,导出时核对源码指纹一致。本轮未新增 iPad 或真机验收结论。

保留约 2.75 MiB 的结果摘要、源码指纹、失败点击事件和关键截图后,已回收本轮临时 DerivedData、原始结果包、诊断录像、三份测试产品及工具日志。删除文件按 du 计 557.3 MiB,卷可用空间实测增加 433.7 MiB;模拟器设备池保持原样,测试使用的 iPhone 15 Pro 已回到原先的关机状态,未触动原已启动的 iPhone 18 Pro。

2026-10-28 的历史结果保留在上节;不能据此认定本轮改动已通过。

发布前还需在最终构建上完成 VoiceOver 的选择状态、候选理由、收藏操作与换批焦点人工检查,并核验减少动态效果设置和真机显示;自动化截图不能代替这些验收。若准备分发,再执行对应的签名、安装与 TestFlight 验证。本轮实现不增加匿名统计,因此三种方式是否帮助用户更快选菜仍待实际体验与访谈验证;这是产品效果验证,不作为代码回归通过的替代。

统一入口收敛(2026-10-30,后续调整) ​

本次按统一操作流程重写找菜主页面,移除三种表达方式的切换和独立随机 Tab。原生搜索、场景、三道建议、换批与随机决定直接在主页面完成;经典列表与云厨房共用组件、会话、收藏和详情。

当前版本验证状态覆盖
App 构建与单元测试最终构建成功,160 项单测通过统一输入、共享场景、候选快照及已有 App 单元回归
iPhone 15 Pro/iOS 27.0最终 6 项 UI 通过默认目录与筛选数量一致、三候选/换批/决定、食材别名联想清旧菜名、最大辅助字号、一句话食材与缺料详情、菜名搜索与清除
iPad Pro 13 英寸 M5/iOS 27.0最终 3 项 UI 通过饮食目标与已核对正文、空态取消场景且保留食材厨具、场景/收藏/厨房布局及真实详情;确认操作文字完整显示
原有流程接入测试目标均编译成功,未重跑全套已有 UI菜谱用量、个人食材与厨房相机测试已更新入口;本轮不新增完整 3D 交互或全套无障碍审计结论

测试代码已改为通过真实控件操作,不为测试设置场景或预选菜谱。iPad 从默认三道进入完整结果时,也明确点击「查看全部」,不沿用旧版右栏自动显示完整结果的假设。当前没有基于历史测试结果宣称新版通过;最终结果由本轮构建和设备回归补充。

同一个冻结测试产品覆盖最终 160 项 App 单测与跨设备 9 项 UI 回归,0 失败、0 跳过;导出证据时核对 App 源码指纹一致。两个设备内均显式串行执行,没有新建或克隆模拟器。iPad 已恢复原先的关机状态,iPhone 15 Pro 保留在隔离数据的原生找菜页,供继续体验。

首版曾通过手机 160 项单测与 3 项 UI、iPad 2 项 UI;手机的菜名搜索运行超过 MCP 300 秒观察时限后,原进程继续执行并通过,未据此重启。随后补齐联想输入清除旧关键词、默认筛选数量、筛选弹层场景说明,以及操作按钮的显式文字;行内输入反馈移除旧提示卡片沿用的整体列表动画。最终使用新产品重跑上述全部验收范围。

完整 VoiceOver、减少动态效果、真机摇一摇和最终分发验证仍以实际验收为准。随机抽取现在遵守当前菜名搜索,不再另有忽略关键词的随机页面;这属于统一入口行为调整。功能回归不能替代真实用户选菜效率的验证。

本次保留约 2.18 MiB 的结果摘要、源码指纹和关键截图后,已回收任务 DerivedData、两份测试产品、原始结果包与诊断中间文件;删除文件按 du 计 414.6 MiB,卷可用空间实测增加 350.5 MiB。演示中的 App 与其在用日志保留,未提交代码或发布 TestFlight。

首屏密度与快选恢复(2026-10-31) ​

本轮恢复搜索与食材快选的优先级:普通字号输入行保留至少 44pt 交互高度,取消额外上下内边距,列表顶部内容边距为 8pt。默认不展示大标题、输入说明、场景或目标卡;已选条件才在输入框后出现可取消状态。场景与饮食目标归入现有筛选,三道灵感与随机操作排在食材、厨具之后。云厨房先展示台面和食材篮;iPad 左侧选食材,右侧直接显示完整实时结果,不再先展示三道灵感或要求点“查看全部”。

输入仍接受菜名、食材和一句话,后续可以沿用此入口接入 AI;本轮没有新增 AI 服务。iPad 左栏灵感行和“帮我决定”显式路由到右侧详情,避免写入未展示的手机导航栈。辅助字号使用全高筛选,常规字号保留半屏和全屏;完整底部计数区域提供统一的无障碍容器边界。

验证轮次实际结果说明
iPhone 首轮160 项 App 单测、6 项 UI 通过;1 项 UI 失败快选首屏、厨房选材及打开真实菜谱、默认计数、换批/决定、别名、菜名清除和一句话输入通过;最大字号场景点击失败
最大字号仅修 helper 的复验1 项失败按计数文字估算底边仍不准确,手势落在固定底栏背景;保留失败结果,不归并为通过
iPhone 最终定向复验2 项通过使用完整计数容器边界和辅助字号全高弹窗,默认计数及最大字号的场景选择/取消、菜名输入、后置候选、随机决定和详情均通过;分别 16.179 秒、103.508 秒
iPad 串行首轮5 项 UI 通过、1 项失败厨房旋转/点选/复位/后台返回、目标保留与已核对正文、空场景取消、收藏与厨房共享、完整选菜收藏主流程通过。双栏测试错误要求随机按钮必须离屏;13 英寸屏幕能够同时显示后置推荐
iPad 双栏定向复验1 项通过仅将断言改为“随机操作在厨具之后”,产品未改;实际点击番茄,验证右栏完整匹配结果实时更新、左栏仍可操作,并导出左右栏截图

组合证据覆盖 160 项 App 单元测试和 13 项手机/平板 UI 场景,不表述为一次完整测试运行全部通过。其余既有 UI 套件已同步入口并编译,本轮未全量重跑。最终 App 源码在 iPhone 最终复验与 iPad 验证之间未改变;之后只有 iPad 测试的可见性断言修正。源码指纹、各轮摘要、失败现场与实际截图保存在本轮精简验证记录中。

最初并行启动设备时,iPad 没有进入任何用例,采样停在 CoreSimulator 的 launchApplicationWithID → _sendBridgeRequest;手机测试也一度等待启动。保留原结果后,中断该 iPad 启动并改为串行。中断包里的“Testing was canceled”是运行器错误,不作为产品断言失败。串行启动和后续验收正常;未修改全局服务、重建、克隆或清空模拟器,所有测试显式设置 -parallel-testing-enabled NO。

实际检查了标准字号首屏、后置灵感、厨房台面、最大辅助字号筛选与候选,以及 iPad 双栏。自动化结果不替代完整 VoiceOver 人工审计、真机摇一摇或真实用户效率评估;本轮没有签名分发或发布 TestFlight。iPhone 15 Pro 留在标准字号的找菜快选页供体验;iPad 验证后恢复 Shutdown。

验证结束后,已导出并核对精简证据,回收本轮独占 DerivedData、原始结果包、附件中间件、四份测试产品和已结束的构建日志。删除文件按 du 计 645.6 MiB,卷可用空间实测增加 478.7 MiB;源码、依赖、共享缓存、全部模拟器及运行中的手机预览保留。

灵感卡片与底部透出修正(2026-10-31) ​

针对“给你一点灵感/换三道/帮我决定”露在浮动 Tab 栏下方的截图,移除分组标题中的交互控件,将标题、当前条件和操作合入原生推荐卡片的首行;三道菜仍是独立列表行,继续支持原来的收藏、匹配及详情导航。列表与云厨房均复用此组件,保持食材优先、推荐后置。找菜与厨房的固定主按钮使用各自页面底色延伸至屏幕底端,避免后方滚动文字从 Tab 栏周围露出;冰箱等其他页面继续使用既有玻璃边缘。

本轮仅复用 iPhone 15 Pro/iOS 27.0,使用 Xcode 27.1 的本机 CLI 构建并串行验证,显式设置 -parallel-testing-enabled NO。首次测试命令误用了不存在的 SDK 后缀 xctestrun,尚未执行用例;改用构建输出路径后,列表的首屏快选、换批和随机进入详情通过(38.338 秒)。厨房用例首次在无障碍父容器 frame 包含子按钮的断言失败;按实际固定底栏的遮挡边界验证后,厨房卡片完整滚入可操作区、按钮完整露出及随机进入做法复验通过。两次实际 UI 运行之间 App 源码未变,仅修正测试的几何断言;不把两轮结果描述为一次无失败的完整运行。

已人工核对厨房首屏与滚动后的卡片实图,Tab 栏周围不再露出操作文字。本轮没有重跑全量单元、iPad、最大辅助字号或完整 VoiceOver,相关旧记录仅作为历史证据。截图、各轮摘要及源码指纹保留在本轮精简验证记录中;未提交、签名或发布。

导出精简证据后,回收本轮任务独占 DerivedData、原始结果和附件中间件;删除文件按 du 计 302.3 MiB,卷可用空间实测变化 +304.2 MiB。保留已安装的标准字号厨房预览、全部源码和共享模拟器。

明确的视图菜单(2026-10-31) ​

将右上角仅靠图标的一键切换改为“视图⌄”原生菜单。展开后同时显示“食材快选”和“云厨房”,使用系统 Picker 勾选当前项;首次仍默认快选,展示偏好继续保存在原来的 cook.presentation,食材、厨具及筛选共用原会话。菜单占用原来的标题栏位置,不新增内容行、Tab 或探索模式。

实际工具栏会把 Label 折成纯图标,并且 Menu 的 accessibilityValue 未被原生工具栏按钮公开。首轮两项 UI 因此失败;最终使用明确的文字与下箭头,并在无障碍标签中说明当前视图,测试读取实际可用的标签。两项定向复验均通过:菜单展开、两个选项的原生勾选、双向切换保留番茄(29.356 秒),以及列表选择、厨房同步、点锅、真实做法与返回(65.153 秒)。不是一次全量套件通过;其他相关旧测试已适配菜单操作并编译,本轮未逐项执行,也没有新增 iPad 或完整 VoiceOver 验收结论。

验证复用既有 iPhone 15 Pro/iOS 27.0,显式使用 -parallel-testing-enabled NO;没有新建、克隆或擦除设备。保留两种布局下的真实展开截图、返回快选状态、各轮摘要和源码指纹,未提交或分发。

验证后已回收本轮独占构建与测试目录:删除文件按 du 计 296.4 MiB,卷可用空间实测变化 +298.8 MiB;保留源码、共享设备、精简截图与已安装的快选预览。

视图菜单的 iPad 与辅助字号收尾(2026-10-31) ​

保留“视图⌄”单一入口。实际边缘触摸发现,SwiftUI 工具栏 Menu 仅增加标签最小高度仍无法命中完整 44pt 区域;当前用小型 UIViewRepresentable 承载系统 UIButton / UIMenu,显式申请至少 44pt,并在按钮中心上下各 21pt 真实点按验证展开。无障碍标签说明“切换视图”,独立值说明当前视图,避免重复播报。普通字号保留原生勾选;辅助字号用“当前视图”副标题标记当前项,避免最大字号下系统勾号栏与首字笔画接触,菜单文字继续遵守系统字号。实际字号由页面传入,避开工具栏对自身字号环境的限制。

厨房的辅助字号布局同时收尾:旋转说明与按钮、食材篮标题与计数纵向排列,格子宽度随字号增长,名称允许换行,不再缩小食材文字。实际滚动验证“胡萝卜”完整进入固定开火按钮上方。iPad 左栏显式选择另一道灵感或点击“帮我决定”会替换右栏现有详情;仅摇动触发受详情已打开的保护,手机仍避免重复压入详情。

本轮验证阶段实际结果与处理
手机工具栏入口初始 AX 高度断言和标签加高复验失败;改用真实触摸后,原 SwiftUI Menu 及外层包装的上下边缘仍无法展开。换为系统按钮后通过,厨房字号布局完善后再次通过
iPad 首轮五项最大辅助字号、标准菜单切换、双栏实时结果通过;横屏被系统菜单项 AX 行高 38pt 的固定阈值阻断,连续详情用例被懒加载列表中“三条必须同时存在”的等待阻断,尚未执行详情替换
iPad 定向修正仅修正上述两处测试假设,入口仍通过实际上下边缘触摸验证;横屏双向切换及实时结果通过(76.718 秒),按稳定 ID 连续点菜、连续决定替换右栏详情通过(43.432 秒)
辅助字号标记首轮普通字号横屏再次通过(98.565 秒),iPad 和手机辅助字号的当前标记断言失败;手机现场截图与 AX 树确认仍是旧勾选状态,工具栏字号环境限制导致文字标记分支未启用。补充等待和读取 value 不能修复产品分支,最终改为页面传入实际字号
最终手机最大辅助字号通过(101.375 秒):两种视图的当前文字标记、真实 44pt 边缘触摸、原生菜单选取、土豆保留、食材篮完整显示胡萝卜及返回快选
最终 11 英寸 iPad 最大辅助字号同一冻结产品通过(70.501 秒):当前文字标记、真实边缘点击、完整食材篮、双向切换及食材保留

最后一项 13 英寸 iPad 辅助字号复验在 CoreSimulator 的 launchApplicationWithID → _sendBridgeRequest 阶段持续等待,没有启动测试 Runner 或执行 App 断言。核对原进程、启动状态和采样并保留结果后,中断本轮自有进程,恢复设备原先的 Shutdown,改用共享池内已有的 11 英寸 iPad 继续验证同一冻结产品的辅助字号布局;未新建、克隆或清空设备。该次启动中断不计作产品用例失败,也不计作通过。

本轮为 Xcode 27.1 / iOS 27.0 共享模拟器的串行定向 UI 验证,显式关闭并行测试。13 英寸的标准菜单、横屏和双栏导航记录与 11 英寸、手机的最终最大字号记录组成此次验收证据,不表述为一次无失败的全量运行。原生菜单项的 AX 行高由平台决定,仍检查实际可点、位于窗口内和真实选择;入口的 44pt 命中范围则继续用实际边缘触摸验证。

已查看实际展开菜单、厨房食材篮与左右栏详情截图。初期应用截图方向处理产生黑边,后续改为全屏 XCTest 截图,完整横屏布局已核对。各阶段通过、失败和启动中断的摘要、日志、源码指纹与关键图保留供审核;本轮不替代完整 VoiceOver 人工审计、真机摇动或真实用户选菜效率评估。

完成后回收任务独占 DerivedData、原始结果包、录屏和附件中间件:按 du 删除 389.3 MiB,卷可用空间实测增加 388.4 MiB。源码、依赖、共享缓存、六台既有模拟器和精简验证证据保留;两台 iPad 均恢复 Shutdown,iPhone 15 Pro 留在标准字号的食材快选预览。

TestFlight 主线整合(2026-10-31) ​

发布候选基于主线 0c1757b 整合本页菜单和适配,保留已发布版本的会员 AI、显式文本发送确认和饮食目标默认保存语义。紧凑输入仅在有文字时显示「预览条件」,通过原生条件预览继续智能识别;回车和「查找」仍在本地处理。首屏不重新加入目标引导卡或随机 Tab。新增场景和候选计算继续复用主会话,清空本餐条件保留默认目标设置,选择「不限目标」才撤销目标默认值。

此前章节记录的是独立原型各阶段的实际结果,不能替代主线整合后的发布回归。原工作目录中的 Web、账号和其他任务改动保留,发布仅收录相关 iOS 产品、测试、文档和版本来源。

主线整合后的发布回归(2026-11-01) ​

实际归档源码为 dc20115605244c68c925063f8ce76d231ebeeb92,基于 main 0c1757b1f2b4951d1f23e6715954c356e3b3cc08。209 项原生测试通过;iPhone 的普通/最大辅助字号菜单、口语条件到详情、目标默认保存及重启、AI 本地预览确认共六条定向流程完成。首轮五条 UI 通过,一条在取消预览后的番茄可见性断言失败:旧定位持续向顶部滑动,而当前最大字号快选页的番茄位于土豆、胡萝卜和西兰花之后。仅在测试提交 d7c3a2e1 修正有界滚动定位后,该条复验通过,仍断言番茄和鸡蛋未选中;没有修改产品源码或 IPA,也没有把两轮描述为一次无失败的全量运行。

同一产品在共享 11 英寸 iPad/iOS 27.0 的三条流程通过:横屏双向菜单切换与双栏实时结果(63.746 秒)、最大辅助字号菜单与食材篮(69.993 秒)、左栏连续点菜和连续「帮我决定」替换右栏详情(54.542 秒)。各测试串行运行,关闭并行测试;没有新建、克隆或擦除设备。实际截图、各轮摘要、测试补丁和产品/资源指纹保存在发布目录 validation/。此记录仍不替代完整 VoiceOver 人工朗读或维护者的 TestFlight 真机体验。

Release 归档和本地 IPA 导出成功。分发签名、内部标记、Production CloudKit/推送权限、Associated Domains、正式反馈与会员 AI 地址、877 道菜、隐私资源及 App/dSYM UUID 一致性均通过核验。同一 SHA-256 的 IPA 通过 Apple altool --validate-app 后才上传,版本及服务端分发结果见 TestFlight 发布记录。

恢复独立随机入口(2026-11-02) ​

按维护者决定恢复「随机」Tab,保留打开即给一道、点击换一道的轻量流程。抽取复用共享候选快照,仅忽略找菜页的菜名搜索;食材、厨具、忌口、不吃辣、场景和饮食目标继续生效。候选有其他菜名时避开上一道同名菜,条件变化使当前菜失效时重新抽取。详情携带同一快照的食材匹配和目标,零候选保持空态。随机页可直接打开既有筛选,摇一摇仅由当前可见且未展示筛选或详情的页面处理。

找菜和云厨房右上角改用清空图标与当前视图图标;列表/立方体图标打开原生菜单,保留两个选项的文字、当前标记、辅助朗读和值,以及原有至少 44pt 的视图入口。三道灵感仍在食材/台面之后;3D 场景交互沿用现有实现。

iPhone 15 Pro/iOS 27.0 的 211 项单元测试通过。六条定向 UI 首轮四条通过、两条失败:最大字号等待了屏幕外的厨房工作台按钮,另一条使用当前词典未识别的香菜忌口输入。仅修正测试定位和输入后,原两条流程均复验通过,仍验证食材匹配、忌口、目标详情及牛肉零候选,不将两轮描述为一次无失败的全量运行。共享 11 英寸 M5 iPad/iOS 27.0 的横屏图标菜单与双栏结果、立即随机与换一道、最大字号目标与空结果三条均通过。此次未复验真机摇动。

每次运行均关闭并行测试,复用现有设备;iPad 恢复原先 Shutdown,iPhone 留在标准字号的隔离数据预览。精简截图、结果摘要和源码指纹保存在本地忽略目录 artifacts/ios-random-tab-2026-11-02/,维护者体验及合并完成后可回收。已删除任务独占构建、结果包、录屏和解码中间件,按 du 回收 422.3 MiB,卷可用空间实测增加 423.1 MiB;源码、依赖缓存和共享模拟器保留。

菜谱骰子与 PR #188 融合(2026-11-02) ​

采用四 Tab 的菜谱骰子入口,融合 PR #188(cf694fef)的骰子与卡片换位动效、共用决定面板及找菜摇动逻辑。首页继续使用原有图标布局;菜谱的全部、收藏、最近浏览和目录搜索保持独立,关闭随机面板后保留状态。即使收藏为空,确认随机菜谱也能在手机打开详情、在 iPad 更新右栏。首次打开直接给一道,换一道才播放换位;菜谱入口忽略首页菜名关键词,灵感入口保留关键词并限定捕获的批次。空批次不扩大到目录,候选变化取消旧动画,确认时重新验证候选与食材匹配。

iPhone 首轮 213 项单元测试和五条定向 UI 全部通过,11 英寸 M5 iPad 的四条 UI 全部通过。截图复核发现辅助字号的装饰挤占菜名区域,随后仅在辅助字号收起骰子、大插画和背景牌;同一版本的手机最大字号随机及浏览记录/收藏两条复验通过,iPad 最大字号随机一条复验通过。上述各阶段均无失败或跳过,仍按阶段记录,不表述为一次全量测试。已查看普通和最大字号截图;减少动态效果分支经代码检查,本轮不替代完整 VoiceOver 人工朗读或真机摇动验收。

测试继续复用现有共享设备并关闭并行;iPad 恢复原先 Shutdown,iPhone 保留标准字号隔离数据预览。最终源码补丁、来源指纹、阶段摘要和精简截图保存在本地忽略目录 artifacts/ios-library-random-pr188-2026-11-02/,交互验收及合并完成后可回收。本轮任务独占构建、原始结果包和附件中间件已回收,按 du 删除 347.1 MiB,卷可用空间实测增加 347.0 MiB。