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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…