在 SwiftUI 問世後的很長一段時間裡,處理網頁內容一直是開發者社群中「優雅」二字的死角。為了在純 SwiftUI 專案中嵌入網頁,我們不得不寫下冗長且充滿樣板代碼(Boilerplate)的 UIViewRepresentable 或 NSViewRepresentable。我們得親手管理 Coordinator、手動同步狀態,並在各種 Delegate 之間周旋。
在 WWDC25 中,Apple 終於帶來了真正的救贖:WebKit for SwiftUI。這不僅僅是 API 的更新,它標誌著網頁內容正式脫離了命令式(Imperative)的枷鎖,轉而擁抱聲明式(Declarative)的開發哲學。身為長期關注 Apple 生態的開發者,我認為這套 API 將徹底改變混合式應用(Hybrid Apps)的開發體驗。
WebPage 與 Swift 6.2 的深度共鳴
在新的架構中,Apple 引入了 WebPage,這是網頁內容進入原生生態系的關鍵。
- 真正的狀態觀察者:
WebPage是一個全新的Observable類別,它從底層就是為了與 Swift 6.2 的 Observation 框架完美適配而設計。這意味著你不再需要手動發送物件更動通知,UI 會自動響應 - 原生屬性的即時訪問:現在你可以直接在 SwiftUI 中讀取網頁的
title、url、estimatedProgress(載入進度),甚至是最新的themeColor。你可以根據網頁的主題顏色動態調整 App 導航欄的色調,實現極致的視覺一體化 - 技術洞察:這種「視圖 WebView」與「模型 WebPage」分離的設計,不僅僅是為了好看,更是為了架構的解耦。透過這種 State-Driven 模式,網頁狀態的同步不再需要
Coordinator作為中介,網頁內容就像一個原生的 Data Model 般直觀
「WebPage is a brand new Observable class... designed from the ground up to work perfectly with Swift and SwiftUI.」
URLSchemeHandler:從委派到 AsyncSequence 的優雅跨越
處理本地資源(如 App Bundle 內的 HTML/CSS)或自定義協議(如 lakes://)是混合應用的核心需求。新的 URLSchemeHandler 協議徹底改寫了這部分的 DX(開發者體驗)。
- 異步串流載入:不同於過往依賴 Delegate 回調,現在的
reply函數要求回傳一個AsyncSequenceofURLSchemeTaskResult - 精確的數據流控制:開發者可以先
yield一個URLResponse,接著異步地yield數據片段(Data chunks)。這對於大型資源的串流加載不僅提升了效能,也讓代碼更具現代 Swift 的非同步風格
這項變革讓載入本地離線資源變得極其迅速且穩定。當你的核心 UI 或靜態內容能透過自定義 Scheme 以串流方式載入,App 的響應速度將完全擺脫網路延遲的陰影。
NavigationDeciding:航行權的絕對掌控
在內嵌網頁時,最怕使用者點擊廣告或外部連結後在 App 內「迷路」。WebPage.NavigationDeciding 協議賦予了開發者精確的決策權。
- 多階段攔截:你可以在導航發送前、收到回應時、甚至是需要身分驗證時進行干預
- 智能導航決策:例如,當偵測到目標 URL 不屬於
lakes.apple.com範疇時,你可以直接取消該導航(.cancel),並利用openURL環境變數將其導向系統預設的 Safari 瀏覽器
這不僅是安全性考量,更是為了確保 App 流程的封閉性,防止使用者在 Web 視圖中迷失,從而優化整體的導航路徑設計。
與 JavaScript 的雙向奔赴:不再痛苦的腳本注入
與網頁內容通訊一直是開發者的夢魘,過往我們得拼湊字串、處理轉義。全新的 callJavaScript API 直接終結了這些低效操作。
- 傳遞 Swift Dictionary:你可以直接將一個 Swift 字典作為參數傳給
callJavaScript。更驚艷的是,字典中的 Key 會自動映射為 JavaScript 中的本地變量 - 數據類型轉換:執行結果會以
Any?回傳,你可以輕鬆將其轉化為 Swift 的Struct或Array。例如,解析網頁中的所有<h2>標題並立即更新 App 原生的 Sidebar 目錄
這種高度整合的機制,讓開發者能以「原生組件」的邏輯去操作「網頁內容」,抹平了兩種語言環境之間的隔閡。
次世代交互:從無視安全區到 visionOS 的注視捲動
WebKit for SwiftUI 帶來了一系列強大的 View Modifiers,讓我們能用最少的代碼實現最精緻的交互效果。
- 視覺延伸與細節:使用
.ignoresSafeArea()讓網頁內容流動到屏幕底部,或是透過.scrollBounceBehavior(.basedOnSize)實現完美的滾動回彈效果 - visionOS 專屬優化:透過
webViewScrollInputBehavior(.enabled, for: .look),你就能在 visionOS 上啟用神奇的「注視捲動Look to scroll」 - 同步魔法:藉由
webViewScrollPosition與onScrollGeometryChange修飾符,你可以即時追蹤網頁的捲動偏移量。當用戶捲動網頁時,原生的側邊欄選中狀態會自動同步更新
這展示了 Apple 如何將 WebKit 的一致性帶入空間運算時代。無論是 iOS、macOS 還是 visionOS,開發者只需一套代碼,就能提供符合該平台特性的原生質感。
「I hope you'll join us in ushering in this fantastic new era of WebKit.」
總結與前瞻
WebKit for SwiftUI 的推出,意味著我們終於可以拋棄那些笨重的包裝代碼,以更架構化的方式組織混合型應用。它不僅簡化了載入、導航與通訊,更透過與 Swift 6.2 觀察機制的整合,讓網頁內容真正成為 SwiftUI 視圖樹中的一等公民。
留下一個問題供大家思考:當網頁與原生的界線變得如此模糊,這是否會改變你設計下一個 App 核心架構的方式?你是否已經準備好,將手邊那些沉重的 Web 服務,轉化為極致的原生體驗了?
關於 XcodeProject
XcodeProject 創立於 2023,致力於協助開發者探索 Apple 的創新世界,學習在 iOS、iPadOS、macOS、tvOS、visionOS 與 watchOS 上開發 App,發現眾多技術與框架,讓開發者獲得更多能力。