Skip to content

fix(weather): handle expired widget forecasts - #607

Open
YinCheng0106 wants to merge 1 commit into
mainfrom
fix/ios-widget-forecast-expiry
Open

YinCheng0106 wants to merge 1 commit into
mainfrom
fix/ios-widget-forecast-expiry

Conversation

@YinCheng0106

@YinCheng0106 YinCheng0106 commented Oct 12, 2026 •

Copy link
Copy Markdown
Member

這個 PR 做了什麼

iOS 天氣小工具的逐時預報在有效期限後不再持續顯示舊資料,並在沒有可用預報時提供本地化的「暫無資料」狀態。此改動接續已合併的 Gallery Preview PR #604,保留 Gallery 預覽整合。

  • 正式程式碼:ForecastWidgetExpiry.swift 統一計算預報期限與可用性;期限取發布時間後 30 分鐘與接收後下一個台北整點的較早者,並納入校準時鐘偏移。
  • 正式程式碼:DPIPWidgetProviderSupport.swift 在到期前最多 2 分鐘提出較早 reload 請求,同時保留到期 timeline entry;Release 最短刷新間隔仍為 5 分鐘。WidgetKit 的 reload 執行時間不保證,因此到期 entry 仍負責在資料期限到達時呈現正確狀態。
  • 正式程式碼:ForecastWidgetSnapshotStore.swift 拒絕相同發布時間的重複快取寫入,避免重複回應重設接收時間、讓已過期預報復活。
  • 正式程式碼:DPIPWidgets.swift 在 Medium/Large 小工具無有效逐時預報時顯示 unavailable 狀態,現況天氣仍保留;Small 版維持原樣。緊湊版面避免 unavailable 文字擠壓預報區。
  • 正式程式碼:Localizable.xcstrings 加入所有支援語系的 unavailable 文案;字串由原生 Widget localization table 提供。
  • 正式程式碼:Runner.xcodeproj/project.pbxproj 登錄 expiry helper。
  • 測試:ForecastWidgetTests.swift 涵蓋期限邊界、早期 reload/到期 entries、相同發布快取保護、無預報與恢復呈現、Dynamic Type 與多語系版面。此分支也包含已合併至 main 的 Gallery Preview 基礎。

相關 issue

沒有對應的 issue。接續已合併的 Gallery Preview PR #604。

怎麼驗

自動化驗證

  • 最新本機 tool/check.sh:3,136 passed、10 skipped;本次 tool/commit.sh --push 所有 CI gates 均通過,未變更的 gates 使用內容雜湊快取。
  • Full iOS tests:363 passed、0 failed。
  • Gallery Preview:13/13;Forecast Expiry:16/16;Forecast Unavailable:6/6。
  • Widget Extension simulator build:PASS。
  • tool/check/commits.sh origin/main..HEAD:1 commit 通過。

實際 Simulator Home Screen WidgetKit 觀察

  • 在 iPhone 16 Pro/iOS 18.6 Simulator 的既有 Medium Home Screen Widget 上觀察到有效預報、期限後顯示 unavailable、WidgetKit 自然刷新後取得新發布並恢復預報。主 Flutter app 全程未開啟,也未強制呼叫 WidgetCenter reload。
  • 此為實際 Home Screen 畫面與自然 WidgetKit 刷新觀察,和自動化測試分開;觀察流程及時間線見本機 QA 報告:/Users/yincheng/.codex/qa-evidence/dpip-forecast-final-20261012-071923/REPORT.md。
  • 有效、到期後 unavailable、恢復三張截圖目前位於該 QA 目錄的 01-valid.png、02-unavailable.png、03-restored.png。目前無法將本機圖片附加到 GitHub PR,因此PR 未附截圖;審查者無法透過上述本機路徑存取圖片。
  • 尚未完成:實體 iPhone 長時間閒置驗證;受控網路中斷/恢復 QA。不得將這兩項視為通過。WidgetKit reload 時機不保證,Simulator 觀察不代表所有裝置都會在相同時間刷新。

檢查清單

  • tool/check/commits.sh origin/main..HEAD 通過;單一 commit 標題符合 repository 規範
  • 一個 commit 一件事
  • tool/commit.sh --push 的 CI gates 通過;最新 Dart 測試 3,136 passed、10 skipped;Full iOS tests 363 passed、0 failed
  • 新增 unavailable 文案有涵蓋所有支援語系
  • UI 變更的 PR 前後截圖已附上:本機 QA 截圖存在,但無法附加至 PR;實體裝置長時間與受控網路中斷/恢復 QA 尚未完成

Platform: ios

Fix(zh-Hant): 修正 iOS 天氣小工具預報過期後的更新時機,並在無有效預報時顯示暫無資料
Fix(en-US): improve iOS weather widget refresh timing around forecast expiry and show an unavailable state when no valid forecast remains
@github-actions

Copy link
Copy Markdown

✅ OpenCodeReview: Review complete: 0 finding(s) across 4 selected item(s).

@YinCheng0106 YinCheng0106 self-assigned this Oct 12, 2026
@YinCheng0106 YinCheng0106 added the ios Issues or pull requests related to the iOS platform. label Oct 12, 2026
@YinCheng0106 YinCheng0106 added this to the v26.4 milestone Oct 12, 2026
@codecov

codecov Bot commented Oct 12, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 94.42%. Comparing base (5bd3388) to head (d97ed0b).

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@YinCheng0106
YinCheng0106 marked this pull request as ready for review October 12, 2026 03:08
Copilot AI balanced review requested due to automatic review settings October 12, 2026 03:08

This comment was marked as low quality.

@PiscesXD

Copy link
Copy Markdown
Member

測試正常
image

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ios Issues or pull requests related to the iOS platform. size/XL

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants