SwiftUI 7 新 WebView:金蛇出洞,網頁江湖換新天

在這里插入圖片描述

概述

崇禎年間,華山派武學雖盛,卻在應對江湖新局時漸顯頹勢;如今 SwiftUI 江湖亦是如此 ——WWDC 25 之前,若要在 SwiftUI 中顯示網頁,開發者恰似袁承志初闖江湖,縱有一身本領,卻苦無稱手兵刃。

在這里插入圖片描述

直到那柄 “金蛇劍” 般的全新 WebView 橫空出世,才讓網頁顯示之道豁然開朗。

在本篇武學大家談中,各位少俠將學到如下內容:

    • 概述
    • 一、往昔困局:華山舊功難破迷陣
    • 二、金蛇出洞:WWDC 25 的 WebView 新法
      • 1. 初窺門徑:基礎網頁加載
      • 2. 內功心法:WebPage 狀態管理
      • 3. 奇門絕技:JS 交互與平臺適配
    • 三、江湖展望:金蛇之后再無鈍劍

想得到那柄可以橫掃武林的神兵利器金蛇劍嗎?那還等什么?讓我們馬上開始尋“劍”之旅吧!

Let’s go!!!😉


一、往昔困局:華山舊功難破迷陣

想當年,SwiftUI 自身并無網頁顯示的獨門心法,開發者們只得借 UIKit 的 WKWebView 這柄 “鈍劍”,再輔以UIViewRepresentable為鞘,方能勉強施展。

在這里插入圖片描述

這般操作,猶如袁承志在華山練劍時,需先扎三年馬步 —— 基礎雖牢,卻失之滯澀。

且看這套 “華山入門劍法”:

import SwiftUI
import WebKit// 以UIViewRepresentable為橋,連接SwiftUI與WKWebView
struct WebViewWrapper: UIViewRepresentable {let url: URL?func makeUIView(context: Context) -> WKWebView {return WKWebView()}func updateUIView(_ uiView: WKWebView, context: Context) {guard let url = url else { return }uiView.load(URLRequest(url: url))}
}// 實戰時需如此調用,恰似執鈍劍闖敵營
struct ContentView: View {var body: some View {WebViewWrapper(url: URL(string: "https://apple.com")).frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity)}
}

這套功夫雖能御敵,卻有三大弊端:

  • 其一,updateUIView反復調用時易生錯亂,好比劍法中 “劍招互礙”;
  • 其二,網頁狀態監聽需另設代理,猶如練劍時還要分心護脈;
  • 其三,與 SwiftUI 狀態管理結合時,常現 “內力相沖” 之象 —— 稍有不慎便會數據錯亂。

在這里插入圖片描述

二、金蛇出洞:WWDC 25 的 WebView 新法

正當開發者們困于舊法之時,WWDC 25 恰似一場武林大會,蘋果突然亮出 “金蛇劍”——SwiftUI 原生 WebView 橫空出世!此劍一出,如金蛇郎君夏雪宜重現江湖,招式靈動,渾然天成,將網頁顯示之道推向新境。

在這里插入圖片描述

1. 初窺門徑:基礎網頁加載

新 WebView 的基礎用法,恰似袁承志初得金蛇劍時的隨手一揮,看似簡單卻暗藏玄機:

import SwiftUI
import WebKitstruct ContentView: View {// 直接使用URL初始化,無需繁瑣包裝var body: some View {WebView(url: URL(string: "https://apple.com")).navigationTitle("金蛇洞").edgesIgnoringSafeArea(.bottom)}
}

這般代碼,較之舊法省去近八成冗余,正如金蛇劍法 “險、奇、快” 之妙 —— 無需再寫UIViewRepresentable的橋接代碼,無需手動管理 WebView 生命周期,SwiftUI 自會料理妥當。

真乃嗚呼快哉!

2. 內功心法:WebPage 狀態管理

若要深入掌控網頁狀態,需修習 “金蛇秘籍”——WebPage類。此物如同袁承志從山洞中所得的金蛇錐譜,將網頁的標題、URL、加載進度等信息盡收其中:

import SwiftUI
import WebKit
internal import Combine// 實戰運用:將心法與招式結合
struct ContentView: View {@State private var page = WebPage()@State private var id: WebPage.NavigationID?@State private var isLoading = false@State private var event: WebPage.NavigationEvent?var body: some View {NavigationStack {WebView(page).navigationTitle(page.title).toolbar {ToolbarItem(placement: .primaryAction) {Button(action: {page.reload()}) {Image(systemName: "arrow.counterclockwise")}}ToolbarItem(placement: .topBarLeading) {if isLoading {ProgressView()}}}.onChange(of: page.isLoading) { _, new inisLoading = new}.onReceive(page.currentNavigationEvent.publisher) { event inguard event.navigationID == id else { return }switch event.kind {case let .failed(underlyingError: error):print(error.localizedDescription)case .finished:print("網頁加載完畢")default:break}}.task {let request = URLRequest(url: .init(string: "https://blog.csdn.net/mydo")!)id = page.load(request)}}}
}

此處關鍵在于@Published屬性 —— 當網頁標題變化時,導航欄會如響應內力般自動更新;進度條則像金蛇吐信般實時菊花旋轉:

在這里插入圖片描述

這般狀態同步,較舊法中手動綁定NotificationCenter的操作,可謂 “化繁為簡,返璞歸真”。

在這里插入圖片描述

3. 奇門絕技:JS 交互與平臺適配

新 WebView 最令人稱道之處,莫過于對 JavaScript 交互的 “化骨綿掌” 式處理。

在這里插入圖片描述

昔日要在 Swift 與 JS 間傳遞數據,需寫十數行橋接代碼,如同袁承志在華山與溫家五老纏斗時的狼狽;如今卻能一劍破局:

// 實戰運用:將心法與招式結合
struct ContentView: View {@State private var page = WebPage()@State private var id: WebPage.NavigationID?@State private var isLoading = false@State private var event: WebPage.NavigationEvent?@State private var titleFromJS: String?var body: some View {NavigationStack {WebView(page).navigationTitle(page.title).toolbar {ToolbarItemGroup {Button {Task {if let jsResult = try? await page.callJavaScript("""return document.title;"""), let title = jsResult as? String {titleFromJS = title}}} label: {Image(systemName: "figure.run")}Button {Task {try? await page.callJavaScript("""document.body.style.backgroundColor = 'gold'""")}} label: {Image(systemName: "figure.cricket")}Button(action: {page.reload()}) {Image(systemName: "arrow.counterclockwise")}}ToolbarItem(placement: .topBarLeading) {if isLoading {ProgressView()}}}.onChange(of: page.isLoading) { _, new inisLoading = new}.onReceive(page.currentNavigationEvent.publisher) { event inguard event.navigationID == id else { return }switch event.kind {case let .failed(underlyingError: error):print(error.localizedDescription)case .finished:print("網頁加載完畢")default:break}}.task {let request = URLRequest(url: .init(string: "https://blog.csdn.net/mydo")!)id = page.load(request)}.safeAreaInset(edge: .top) {if let title = titleFromJS {Text(title).font(.title2).padding().background(.thinMaterial.opacity(0.66), in: RoundedRectangle(cornerRadius: 15))}}}}
}

在這里插入圖片描述

在上面的代碼中,我們用 JavaScript 做了兩件事:

  1. 動態實時獲取到了網頁的標題;
  2. 將網頁背景設置為金色;

此等操作,恰似金蛇郎君以金蛇錐破敵甲胄 —— 直接穿透 Swift 與 JS 的壁壘。

在這里插入圖片描述

更妙者,新 WebView 對各平臺特性的適配,如 visionOS 的 “看向滾動” 功能,只需一行修飾符即可大功告成:

WebView(webView: page.webView)#if os(VisionOS)// 開啟 VisionOS 滾動輸入”通天眼“.webViewScrollInputBehavior(.enabled, for: .look)#endif.scrollBounceBehavior(.basedOnSize) // 滾動反饋如"踏雪無痕"

三、江湖展望:金蛇之后再無鈍劍

回首 SwiftUI 的網頁顯示之道,恰似袁承志的武學進階:從華山派的循規蹈矩,到金蛇劍法的靈動不羈,再到融會貫通自成一派。

WWDC 25 推出的新 WebView,不僅解決了舊法中的 “招式沉冗” 之弊,更將 SwiftUI 的聲明式編程理念推向新高度。

在這里插入圖片描述

正如金蛇劍在袁承志手中終成一代傳奇,這套新 WebView API 亦將成為開發者闖蕩網頁江湖的不二之選。

畢竟,真正的好功夫,從來都是 “大道至簡,大巧若拙”—— 能以三兩行代碼辦妥之事,何必耗費十數行力氣?此乃 WWDC 25 留給 SwiftUI 開發者的最大啟示,亦是江湖不變之真理。

那么,各位少俠看到這里又作何感想呢?

感謝寶子們的觀看,再會啦!😎

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/88788.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/88788.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/88788.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LeetCode|Day9|976. 三角形的最大周長|Python刷題筆記

LeetCode|Day9|976. 三角形的最大周長|Python刷題筆記 🗓? 本文屬于【LeetCode 簡單題百日計劃】系列 👉 點擊查看系列總目錄 >> 📌 題目簡介 題號:976. 三角形的最大周長 難度&#x…

華擎B150M Pro4S魔改bios上8代U

100、200系主板魔改bios在DIY領域當屬于歷史性事件,2018年左右興起。雖然現在已經是2025年,魔改bios已經沒有多大意義,但是跟著前輩的教程魔改一次,可以重溫下當年DIY玩家的激情。 魔改教程在SMXDIY網站,寫的非常詳細&…

音視頻學習(三十七):pts和dts

概念 PTS(Presentation Time Stamp)顯示時間戳 表示:該幀應該在什么時間被顯示/播放。主要用于:同步音頻與視頻,控制播放節奏。舉例:視頻幀 A 的 PTS 是 300ms,表示應在視頻播放第 300 毫秒時顯…

關于數據庫的慢查詢

1.數據庫的慢查詢慢查詢是指執行時間超過預設閾值的數據庫查詢操作。它是數據庫性能優化的一個重要指標和切入點。慢查詢的主要特點執行時間長:超過了數據庫系統設定的慢查詢閾值(如MySQL默認是10秒)資源消耗大:可能占用大量CPU、…

【Rust日報】 Python 核心開發者對 Rust 的期望

半月刊:The Embedded Rustacean Issue #49亮點:📢 樂鑫 DevCon 2025 演講嘉賓征集🦺 CISA 和 NSA 參與內存安全對話🔐 微軟宣布 RIFT (Rust 惡意軟件分析工具)💰? Nordic 收購 Memf…

vue是什么

Vue簡介Vue(Vue.js)是一個用于構建用戶界面的漸進式JavaScript框架。它專注于視圖層,易于集成到現有項目中,也可用于開發復雜的單頁面應用(SPA)。Vue的核心特點是輕量、靈活和高效,通過數據綁定…

10分鐘掌握 Nginx 配置文件結構

在實際部署前端或后端項目時,Nginx 配置文件(nginx.conf) 是我們無法繞開的第一道門檻。 本文將帶你用10分鐘掌握 nginx.conf 的核心結構與常見配置方法,并提供一篇完整的實戰文檔鏈接,適合初學者快速掌握。 &#x1…

典型的前后端交互數據示例

提供幾種典型的前后端交互數據示例: 前端如何組織數據,以及后端如何接收數據。 文章目錄1. POST請求后端實體類接收前端js后端接收結果查看2. GET請求后端實體類接收前端js后端接收結果查看3. GET請求后端基本類型接收前端js后端接收結果查看1. POST請求…

計算機畢業設計springboot影視周邊推薦系統 基于SpringBoot的電影衍生品智能推薦平臺 JavaWeb實現的影視文化周邊個性化服務系統

計算機畢業設計springboot影視周邊推薦系統6c31q9 (配套有源碼 程序 mysql數據庫 論文) 本套源碼可以在文本聯xi,先看具體系統功能演示視頻領取,可分享源碼參考。疫情之后,線上娛樂需求激增,人們對電影及其衍生商品的關…

(4)機器學習小白入門YOLOv :圖片標注實操手冊

(1)機器學習小白入門YOLOv :從概念到實踐 (2)機器學習小白入門 YOLOv:從模塊優化到工程部署 (3)機器學習小白入門 YOLOv: 解鎖圖片分類新技能 (4)機器學習小白入門YOLOv :圖片標注實操手冊 (5)機器學習小白入門 YOLOv:…

【JMeter】調試方法

文章目錄取樣器:發送請求、接收響應>>察看結果樹斷言:驗證響應>>察看結果樹提取器:創建變量>>調試取樣器自定義斷言:代碼>>日志了解JMeter的內部細節,排查錯誤的原因。取樣器:發送…

Vue框架之鉤子函數詳解

Vue框架之生命周期主要鉤子函數詳解一、Vue生命周期的整體流程二、創建階段:初始化組件實例2.1 beforeCreate:實例創建前2.2 created:實例創建后三、掛載階段:組件與DOM結合3.1 beforeMount:掛載前3.2 mounted&#xf…

Syntax Error: TypeError: Cannot set properties of undefined (setting ‘parent‘)

Date: 2025-07-12 19:21:24 author: lijianzhan使用npm run dev運行前端項目時報錯,具體報錯信息如下: ERROR Failed to compile with 1 error …

JAVA后端開發——類命名規范

引言良好的命名規范是軟件工程的基石。它不僅能提升代碼的可讀性,還能降低團隊協作的溝通成本,使項目在長期迭代中更易于維護。本規范結合了業界主流實踐(如阿里巴巴Java開發手冊)以及現代Web應用分層架構的特點,旨在提…

Ubuntu2404修改國內鏡像

文章目錄1 備份原文件2 修改文件內容Ubuntu2404修改國內鏡像 2404和2204修改鏡像的方式不一致 且鏡像保存的位置也不一致,位置在/etc/apt/source.list.d/ubuntu.sources 參考:https://blog.csdn.net/Kiffy_Yam/article/details/145876447 1 備份原文件…

Chrome拓展 Video Speed Controller 等內嵌惡意后門

【高危】Chrome拓展 Video Speed Controller 等內嵌惡意后門 漏洞描述 當用戶安裝受影響版本的 Video Speed Controller 等Chrome拓展會竊取用戶的瀏覽鏈接,并與攻擊者可控的C2地址建立持久化連接,攻擊者可將用戶瀏覽器重定向到惡意網站。 MPS編號MPS…

Spring Ai Alibaba Gateway 實現存量應用轉 MCP 工具

作者簡介:你好,我是影子,Spring Ai Alibaba開源社區 Committer,持續分享Spring Ai Alibaba最新進展 業界各類AI工程相關的方案 最近有斷時間沒更了,熟悉我的朋友知道我剛結束完畢業旅行,最近也因為入職&a…

HTTP和HTTPS部分知識點

HTTP基本概念 超文本-傳輸-協議 協議 HTTP是一個用在計算機世界里的協議。它使用計算機可以理解的語言確立了一種計算機之間交流通信的規范(兩個以上的參與者),以及相關的各種控制和錯誤處理方式(行為約定和規范)。傳輸 HTTP協議是一個雙向協議。是一個在計算機世界…

第10講——一元函數積分學的幾何應用

文章目錄定積分計算平面圖形的面積直角坐標系下參數方程下極坐標系下定積分計算旋轉體的體積曲邊梯形繞x軸旋轉一周所得到的旋轉體的體積曲邊梯形繞y軸旋轉一周所得到的旋轉體的體積平面曲線繞定直線旋轉定積分計算函數的平均值定積分計算平面光滑曲線的弧長曲線L繞x軸旋轉一周…

Go從入門到精通(20)-一個簡單web項目-服務搭建

Go從入門到精通(15)-包(package) Go從入門到精通(9)-函數 文章目錄Go從入門到精通(15)-包(package)Go從入門到精通(9)-函數前言gogin…