跳至内容

2026-10-24 上架前模拟器验收 ​

维护者在完成构建 6 的真实 Production 冲突复测后,明确决定:检查最新 CI 后合并 #142,剩余验收使用模拟器,不再要求真机。本文记录这次范围调整及其证据,不将本地替代测试表述为真实 Apple 账号切换或 CloudKit 服务器传输。

此前已取得的生产证据见 CloudKit 生产同步验收。构建 4 首次离线新增缺失仍没有可复现根因;构建 6 的受控新增通过及 #142 正文清理修复不等于该首次事件已定位。

本地数据与首次导入 ​

新增 ReleaseAcceptanceTests,使用五模型 Schema、任务独占临时目录和禁用 CloudKit 的磁盘存储;测试结束回收数据库。

场景实际验证边界
未登录时本地保留收藏、历史、偏好、冰箱、私人菜谱保存后关闭并重开 SQLite,逐项核对内容不代表已执行系统 iCloud 退出
数据隔离两份独立本地库使用同一菜谱编号,第二份新增和删除不影响第一份不代表另一 Apple 账号的服务端权限或账号切换行为
离线收藏与历史清空.none 存储中取消旧收藏、添加新收藏、清空历史,再重开;其他收藏和私人菜谱保留,重新浏览可恢复单条历史不建立 CloudKit 网络连接
首次偏好导入实际挂载 RootView;首次显示不写默认偏好,另一 ModelContext 导入后由根视图 Query 自动更新,立即编辑保留导入值且仍只有一行不手工调用刷新;不是第二个 Apple 设备的网络导入
文件往返私人菜谱和个人词典实际写入 JSON 文件,再读取导入并重开;重复导入不复制,已有收藏保留不包含真机系统文件选择器或外部文件提供方

首轮 iPhone iOS 27 定点回归 22/22 通过:上述五项、10 项 PreferencesSyncTests、7 项 FridgeTests,零失败或跳过。设备系统设置显示 Apple 账号登录入口,未登录个人账号。

历史与通知 ​

通知拒绝路径已在模拟器实际操作:拒绝系统通知授权后,App 保持提醒关闭,显示“通知没有打开”及“去设置”入口。iOS 27 模拟器的系统设置自动化触控未稳定命中,不能将该操作记为重新授权成功。

新增历史界面回归验证:取消清空后记录仍在;确认清空后出现空状态;已有收藏保留。iPhone 与 iPad 均通过。

新增根视图回归实际挂载 RootView,验证冷启动的待处理通知、运行中通知广播都进入冰箱首页,并清除待处理标记。为此 RootView 允许注入 AppRouter,默认行为不变。这是应用内路由验证,不能替代系统通知真正送达和点击。

iPad iOS 27 完整单元与集成测试 68 项,加历史界面验收 1 项,69/69 通过,零失败或跳过。iPhone 的 6 项新增集成回归及历史界面验收均通过;同轮实验性通知 UI 测试没有稳定操作系统开关,已移除,失败现场保留,不计入通过结果。

正常启动 App 后手工添加今天到期的土豆、开启提醒并设置未来时间,尚未观察到通知。临时诊断发现系统 getPendingNotificationRequests 和 getNotificationSettings 的回调均未返回,随后该独立 iOS 27 模拟器重启报 launchd failed to respond。这不足以断定应用通知代码存在缺陷,也不能记录为通知送达通过。临时诊断代码已移除。另建 iOS 18.6 模拟器时出现启动超时;这项环境限制仍需解除后复核,不要求真机。

10 月 25 日另一次独立 iOS 18.6 模拟器复测已成功授权,并在 App 退到主屏幕后于 02:22 收到系统排程的“土豆今天到期”通知。点击通知时发生 NSInternalInconsistencyException: Call must be made on main thread;日志堆栈指向 NotificationDelegate.didReceive 的 async 桥接完成回调,UIKit 此时更新后台快照。仅在 MainActor.run 中发路由广播不足以保证桥接完成回调也在主线程。现使用显式 completion handler,将路由与系统完成回调放在同一个主队列任务;非冰箱通知也正常完成。新增回归从后台调用响应处理,检查主线程、路由先于完成且各发生一次,以及厨房通知不跳转冰箱。系统点击复测及新提交完整 CI 仍需通过,尚不将本项记为完全通过。

构建与发布边界 ​

Debug、Release 模拟器编译通过。Release 中的隐私政策逐字等于 docs/privacy.md;二进制不含本轮诊断字符串或 -ui-testing 测试入口。文档 ESLint 与补丁空白检查通过。

当前不能宣称所有上架门禁完成:真实本地通知的送达与点击仍待模拟器复测;公开隐私政策已通过普通浏览器核验:https://cook-docs.pages.dev/privacy 可直接读取完整正文(含冰箱、私人菜谱及统计同意说明);此前命令行请求的 403 不代表该页面不可访问。维护者重新登录后已核验 App Store Connect:商店隐私政策 URL 原为空,现已保存为上述公开地址。App 隐私七类数据声明(含客户支持和反馈访客 ID)已逐项保存为草稿,尚未发布;版本草稿已调整为 2.0.0,推广文本、描述、关键词、支持网址、营销网址、个人版权和审核联系方式均已保存,并选择手动发布;尚未选择构建。首次免费与全球 175 个国家或地区的供应范围已设置,包含中国大陆;维护者要求完成备案后再上线。主要类别已保存为“美食佳饮”,副标题为“有什么食材,就做什么菜”;内容版权声明尚未设置;年龄分级已保存,多数地区为 13+(iOS 26 之前为 12+,区域例外以后台为准)。已查看的 iPhone 中等显示屏和 iPad 13 英寸两组截屏均为 0/10。构建 6 为内部测试专用,不能直接用于 App Store 提审。文案和隐私声明映射已整理为任务附件。维护者已确认使用个人版权;审核联系方式仅保存到 Apple 后台,不进入仓库。本地独立库测试也不代表真实 Apple 账号切换已实测,维护者已明确接受其不在本轮真机范围内。

CI 复核 ​

5abe304 的 CI run 40096049640 首次运行卡在 UI 等待,终止后第二次运行有 139/140 通过:iPhone 全部通过,iPad 的隐私同意 UI 测试在首次开启开关后等待状态超时。失败附件显示合成点击点 (962.5, 801.5) 位于实际开关中心,未发现点错行的证据。

在独立 iPad 模拟器上运行相同测试且不改动实现或断言,已完成开启、重启保留、撤回和政策入口检查。该结果不能证明 CI 失败的根因已定位;保存失败截图、无障碍树、合成事件和定点复测日志,合并仍须以新增验收提交的最新完整 CI 为准。

ea44020 的 CI run 40104014910 在与最新主分支合成后完成 160 项测试,158 项通过。两台设备均仅在投稿失败后的“去支持中心”断言失败;隐私同意用例已通过。日志与主分支 da110d6 的实现一致:新引入的测试反馈模式会隐藏正式支持中心兜底入口,原 UI 用例仍在断言正式模式的界面。

现已同步主分支,允许 -ui-testing 的本地失败传输选择正式或测试界面。原用例明确选择正式界面,保留 Support 与邮件入口断言;新增测试模式用例验证失败后草稿保留、没有正式 Support / 邮件 / 复制出口。开关仅存在于 DEBUG 的 UI 测试初始化中,两种模式都使用 example.invalid 和注入失败传输。

d4d7c0b 的 CI run 40106801630 完成 162 项测试,161 项通过:iPad 81/81,iPhone 80/81,两种反馈模式均通过。唯一失败是 iPhone 隐私用例进入“我的”并滑动一次后,等待统计开关出现超时。录像及无障碍树显示设置列表仍在顶部(滚动条 0%),隐私开关尚未创建;合成滑动从 (201, 537) 到 (201, 337),不能据此断言手势误触标签栏或产品丢失开关。

隐私用例现先等待导航栏及列表可操作,再在列表内部有上限地逐屏查找开关;重启后同样重新定位。保留默认关闭、开启、重启保留、撤回同意及政策入口断言,未跳过用例或放宽状态断言。该修正仍需最新完整 CI 通过,合并以前保持草稿。

6429d73 同步主分支厨房工作台后,Web 与 Swift 检查通过;iPhone 隐私用例等待 CollectionView 的 isHittable 超时,尚未执行后续滚动和同意状态断言。滚动容器自身的命中状态不能代替页内控件可交互。当前为设置列表增加 settings.list 标识,以“我的菜谱”首行可操作确认页面就绪,再在该列表内逐屏定位统计开关。没有将本次失败当作同意状态丢失,也没有删减同意流程断言;仍以新提交的完整 CI 为合并条件。

5b56c33 的 CI run 40112956102 完成 191/192:iPhone 96/96,iPad 95/96。唯一失败为 iPad 重启后关闭统计开关,等待关闭状态超时。截图和界面树均显示开关仍为开启;两次合成点击均在控件中心 (962.5, 1232),没有点错行的证据。现将操作限定到该行内的系统开关,点击当前滑块并保持 0.1 秒;同时增加撤回后再次重启仍关闭的断言。此为交互稳定性修正,未据此宣称已确定 CI 偶发漏触的底层根因,仍需定点复测和完整 CI。

证据与清理 ​

脱敏摘要及截图保存在本次任务的 simulator-release-acceptance 证据目录。没有操作 iPhone 或 Mac TestFlight 的数据、iCloud 登录状态或通知设置;模拟器合成数据不用于生产同步结论。

本轮先后回收任务专用模拟器及构建 / 测试中间产物约 5.4 GiB 和 2.4 GiB;保留小型证据,不删除构建 6 的签名发布产物、生产记录或其他会话的模拟器。