SwiftUI WKWebView网页视图
SwiftUI WKWebView网页视图

SwiftUI WKWebView网页视图

WKWebView 是苹果提供的 网页渲染引擎视图组件,属于 WebKit 框架。

用于iOS / macOS 应用里嵌入网页内容。

历史前身

在 iOS 8 之前,系统使用 UIWebView。但它速度慢、内存占用高、线程全在主线程上,非常落后。

于是苹果推出了现代化的 WKWebView(W = WebKit,K = KDE 来源),性能提升巨大:

WKWebView使用新版 Nitro引擎(与 Safari 同级),性能块,独立进程,JS交互更强大并且支持双向通信,沙盒隔离,安全性更高。

从 iOS 12 开始,UIWebView 已被完全弃用,WKWebView 是唯一推荐方式。

基本用法

SwiftUI 显示 UIKit 的 WKWebView:

import SwiftUI
import WebKit

struct WebView: UIViewRepresentable {
    let url: URL
    
    func makeUIView(context: Context) -> WKWebView {
        let webView = WKWebView()
        let request = URLRequest(url: url)
        webView.load(request)
        return webView
    }
    
    func updateUIView(_ uiView: WKWebView, context: Context) {}
}

然后在 SwiftUI 视图里用:

WebView(url: URL(string: "https://www.fangjunyu.com")!)

实现 App 内直接浏览网页。

基本功能

1、加载网页内容

webView.load(URLRequest(url: URL(string: "https://apple.com")!))

2、加载本地HTML

webView.loadHTMLString("<h1>Hello</h1>", baseURL: nil)       3、执行JavaScript
webView.evaluateJavaScript("document.title") { result, error in
    print(result ?? "")
}

4、Swift和JavaScript通信

实现双向交互,比如网页触发按钮让 Swift 代码响应。

注册监听:

webView.configuration.userContentController.add(self, name: "iosListener")

网页端触发:

window.webkit.messageHandlers.iosListener.postMessage("Hello from JS")

Swift 端接收:

extension YourViewController: WKScriptMessageHandler {
    func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
        print(message.body)
    }
}

SwiftUI监听网页加载进度

可以在SwiftUI实现更完整的封装,并监听网页加载进度:

struct WebView: UIViewRepresentable {
    let url: URL
    @Binding var progress: Double
    
    func makeUIView(context: Context) -> WKWebView {
        let webView = WKWebView()
        webView.load(URLRequest(url: url))
        webView.addObserver(context.coordinator, forKeyPath: "estimatedProgress", options: .new, context: nil)
        return webView
    }
    
    func updateUIView(_ uiView: WKWebView, context: Context) {}
    
    func makeCoordinator() -> Coordinator { Coordinator(self) }
    
    class Coordinator: NSObject {
        var parent: WebView
        init(_ parent: WebView) { self.parent = parent }
        
        override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
            if keyPath == "estimatedProgress",
               let webView = object as? WKWebView {
                parent.progress = webView.estimatedProgress
            }
        }
    }
}

适用场景

App 内展示网页(比如“帮助中心”“隐私政策”);

混合 App(Hybrid App:部分页面用 HTML/JS);

加载自己生成的 HTML(报表、图表、富文本);

与网页前端交互(消息通知、登录验证、支付页面等)。

总结

WKWebView属于WebKit框架,属于UIView / NSView子类。

渲染性能和Safari相同,支持JavaScript和Swift双向交互,拥有独立进程、沙盒隔离,安全性更高。

iOS 8+ 推荐唯一网页方案。

如果是单独的打开网页链接,可以使用Link或者openURL

相关文章

1、SwiftUI打开链接openURL:https://fangjunyu.com/2025/11/07/swiftui%e6%89%93%e5%bc%80%e9%93%be%e6%8e%a5openurl/

2、SwiftUI超链接Link:https://fangjunyu.com/2024/12/31/swift%e5%ba%94%e7%94%a8%e5%86%85%e5%88%9b%e5%bb%ba%e8%b6%85%e9%93%be%e6%8e%a5%e7%9a%84link%e6%96%b9%e6%b3%95/

   

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开发者。

欢迎加入我们的 微信交流群QQ交流群,交流更多精彩内容!
微信交流群二维码 QQ交流群二维码

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注