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 中文版
活用 Foundation Models 的 @Generable 與 @Guide 製作測驗 App
AI

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

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