SwiftUI 框架

iOS 26 新功能: SwiftUI 的 WebView 與 WebPage

iOS 26 新功能: SwiftUI 的 WebView 與 WebPage
iOS 26 新功能: SwiftUI 的 WebView 與 WebPage
In: SwiftUI 框架

iOS 26 中,SwiftUI 終於推出了其中一個最受期待的元件:WebView,一個原生的解決方案用來顯示網頁內容。在這個更新之前,SwiftUI 開發者必須依賴 UIKit 框架,透過 UIViewRepresentable 包裝 WKWebViewSFSafariViewController嵌入網頁檢視。隨著 WebView 的推出,Apple 現在提供了一個完整的原生 SwiftUI 方式來整合網頁瀏覽功能進入應用程式中。在這篇教學中,我會快速介紹新的 WebView,並示範如何在你自己的應用中使用它。

WebView 的基本用法

要使用新的 WebView 載入網頁,你只需匯入 WebKit 框架,並以網址建立這個檢視。以下是範例程式碼:

import SwiftUI
import WebKit

struct ContentView: View {
    var body: some View {
        WebView(url: URL(string: "https://www.appcoda.com"))
    }
}

只要簡單一行程式碼,你就能在應用中嵌入一個完整的行動 Safari 瀏覽體驗——它是由與 Safari 相同的 WebKit 引擎驅動。

Using WebView in iOS 26

載入網頁內容的另一種方式

除了 WebView,WebKit 框架也引入了一個名為 WebPage 的新類別。你可以先使用網址建立一個 WebPage 實例,然後再透過它來顯示網頁內容。以下是達成相同結果的範例程式碼:

struct ContentView: View {
    @State private var page = WebPage()
    
    var body: some View {
        
        WebView(page)
            .ignoresSafeArea()
            .onAppear {
                if let pageURL = URL(string: "https://www.appcoda.com") {
                    let urlRequest = URLRequest(url: pageURL)
                    page.load(urlRequest)
                }
            }
    }
}

使用 WebPage

大多數情況下,如果你只是想顯示網頁內容或嵌入瀏覽器,使用 WebView 是最直接的方法。但如果你需要更細緻的控制,例如與應用程式互動、取得網頁屬性等,那麼 WebPage 提供了更多的自訂功能。

舉例來說,你可以透過 WebPage 物件的 title 屬性來取得目前網頁的標題:

Text(page.title)
Text(page.url)

你也可以使用 url 屬性來取得目前的網頁網址。

如果你想追蹤網頁載入進度,estimatedProgress 屬性會提供一個大約的百分比:

Text(page.estimatedProgress.formatted(.percent.precision(.fractionLength(0))))

除了讀取屬性之外,WebPage 類別也允許你控制網頁的載入行為。例如,你可以呼叫 reload() 來重新載入當前頁面,或使用 stopLoading() 來停止載入。

使用 WebPage 載入自訂 HTML 內容

除了載入 URLRequest 以外,WebPage 類別的 load 方法也可以直接載入自訂 HTML 內容。以下是載入 YouTube 播放器的範例程式碼:

struct ContentView: View {
    
    @State private var page = WebPage()
    
    private let htmlContent: String = """
        <div class="videoFrame">
        <iframe width="960" height="540" src="https://www.youtube.com/embed/0_DjDdfqtUE?si=iYAmkvDghnGaVcAC" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
        </div>
        """
    var body: some View {
        
        WebView(page)
            .onAppear {
                page.load(html: htmlContent, baseURL: URL(string: "about:blank")!)
            }
    }
}

你可以把這段程式碼貼進 Xcode 預覽,應該會看到 YouTube 播放器畫面。

執行 JavaScript

WebPage 物件不僅能載入 HTML 內容,還可以執行 JavaScript。你可以使用 callJavaScript 方法,傳入你想執行的程式碼。以下是一個範例:

struct ContentView: View {
    
    @State private var page = WebPage()
    
    private let snippet = """
        document.write("<h1>This text is generated by Javascript</h1>");
        """
    
    var body: some View {
        
        WebView(page)
            .task {
                do {
                    try await page.callJavaScript(snippet)
                } catch {
                    print("JavaScript 執行失敗:\(error)")
                }
            }
    }
}

總結

SwiftUI 新增的原生 WebView 元件大大簡化了在 iOS 應用中顯示網頁的方式,省去了依賴 UIKit 包裝器的麻煩。SwiftUI 開發者可以選擇以下兩種方式整合網頁內容:

  • WebView:適用於單純載入與顯示網頁的場景。
  • WebPage:提供更細部的控制,讓你可以讀取頁面屬性、追蹤載入進度、重新載入、停止載入,甚至執行 JavaScript。

這項原生解決方案讓 SwiftUI 嵌入網頁內容的體驗變得更加簡潔且一致。

作者
Simon Ng
軟體工程師,AppCoda 創辦人。著有《iOS 18 App 程式設計實戰心法》、《iOS 18 App程式設計進階攻略》以及《精通SwiftUI》。曾任職於HSBC, FedEx等跨國企業,專責軟體開發、系統設計。2012年創立AppCoda技術部落格,定期發表iOS程式教學文章。現時專注發展AppCoda業務,致力於iOS程式教學、產品設計及開發。你可以到推特與我聯絡。
評論
更多來自 AppCoda 中文版
如何在 SwiftUI App 中開發 Live Activities
SwiftUI 框架

如何在 SwiftUI App 中開發 Live Activities

Live Activities 首次於 iOS 16 推出,是 Apple 最令人興奮的更新之一,能讓 App 與使用者在即時互動上更有連結。它不再需要使用者不斷打開 App,Live Activities 可以讓資訊直接顯示在鎖定畫面和 Dynamic Island 上。
使用 Tool Calling 強化 Foundation Models 功能
AI

使用 Tool Calling 強化 Foundation Models 功能

在前幾篇教學中,我們介紹了 Foundation Models 在 iOS 26 中的運作方式,以及如何使用這個全新框架打造具備 AI 功能的應用。我們也介紹了 @Generable 巨集,它能輕鬆地將模型回應轉換為結構化的 Swift 類型。 現在,在這個 Foundation
活用 Foundation Models 的 @Generable 與 @Guide 製作測驗 App
AI

活用 Foundation Models 的 @Generable 與 @Guide 製作測驗 App

在前一篇教學中,我們介紹了 Foundation Models 框架,並示範了如何用它來進行基本的內容生成。那個過程相當簡單——你提供一個提示詞(prompt),等幾秒鐘,就能獲得自然語言的回應。在我們的範例中,我們建立了一個簡單的問答 App,讓使用者可以提問,App 則直接顯示生成的文字。 但如果回應變得更複雜——你需要把非結構化文字轉換為結構化的物件呢? 舉例來說,
很好! 你已成功註冊。
歡迎回來! 你已成功登入。
你已成功訂閱 AppCoda 中文版 電子報。
你的連結已失效。
成功! 請檢查你的電子郵件以獲取用於登入的連結。
好! 你的付費資料已更新。
你的付費方式並未更新。