Max Lv:meow iOS 按配置自动更新节奏的 PR #352 完成审查并推入跟进提交

在 meow-ios 为订阅配置新增按配置自动更新节奏的 PR #352(由 gengjiawen 提交,分支 feat/profile-auto-update)下,维护者 madeye 给出合并前审查:`.manual` 默认值意味着升级后不会自动开始抓取;更新节奏仅由 `lastUpdated` 推导,手动刷新会顺延自动刷新,不存在第二个时间戳产生漂移;抓取失败会保持到期状态,`isRefreshing` 守卫阻止并发重叠。已把跟进提交推到该分支:rebase 到当前 main,唯一实质冲突在 `MeowApp.swift`——#392 加入了它自己的 `scenePhase` 处理(`WidgetReloader.appDidBecomeActive()`),两者现合入单个 `onChange`,共用一个 `@Environment(\.scenePhase)`,`project.pbxproj` 由 `project.yml` 重新生成;提交 201cf84 在 `ProfileAutoUpdaterTests` 中固定 `cloudKitDatabase: .none`,因为 iCloud 权限落地(#383)后默认 `ModelConfiguration` 会开启 CloudKit 同步,从而拒绝 `Profile` schema 并导致两项新测试失败,其它 SwiftData 测试早已固定为 `.none`。本地 `swiftformat --lint .`、`swiftlint --strict` 干净,`meow-tvos` 构建通过,`xcodebuild test`(iPhone 17)修复后全绿(含 `ProfileAutoUpdater` 等套件);首轮 `Shadowsocks*` 失败为已知 DNS 抖动,重跑通过。CI 通过后合并。

作者原文

Reviewed. Nice design, thanks @gengjiawen.

  • The .manual default means nothing starts fetching after an upgrade.
  • The cadence is derived from lastUpdated alone, so a manual refresh postpones the automatic one and there's no second timestamp to drift.
  • A failed fetch stays due, and the isRefreshing guard stops overlapping passes.

Pushed to this branch:

  • Rebased onto current main. The one real conflict was MeowApp.swift: #392 added its own scenePhase handler (WidgetReloader.appDidBecomeActive()). Both now live in a single onChange, with one @Environment(\.scenePhase). project.pbxproj is regenerated from project.yml.
  • 201cf84 pins cloudKitDatabase: .none in ProfileAutoUpdaterTests. Since the iCloud entitlement landed (#383), a default ModelConfiguration turns on CloudKit sync. That rejects the Profile schema ("CloudKit integration requires that all attributes be optional…") and failed two of the new tests. Every other SwiftData test already pins .none.

Local checks:

  • swiftformat --lint . and swiftlint --strict: clean.
  • meow-tvos: builds.
  • xcodebuild test (iPhone 17): green after the fix. That includes the ProfileAutoUpdater, ProfileUpdateInterval and SubscriptionService suites.
  • The Shadowsocks* failures in the first run were the known live-bootstrap-DNS flake; those suites pass on rerun.

Merging once CI is green.