Swift WebView中如何监听URL变化并保存至UserDefaults?
监听WebView URL变化并保存到UserDefaults的实现方案
要实现监听WKWebView的URL变化并保存到UserDefaults,需要借助WKNavigationDelegate代理捕获URL变更事件,以下是基于你提供的代码修改后的完整实现:
核心实现步骤
- 通过
UIViewRepresentable的协调器(Coordinator)实现WKNavigationDelegate,监听WebView的导航事件 - 在导航回调中获取当前URL,将其存入UserDefaults
- 为WebView设置正确的导航代理
修改后的完整代码
import SwiftUI import WebKit struct VideoView: View { // 优先从UserDefaults读取上次保存的URL,无则用默认地址 private let initialUrlString: String = UserDefaults.standard.string(forKey: "LastWebViewURL") ?? "https://www.google.com" var body: some View { VideoWebView(url: URL(string: initialUrlString)!) .shadow(color: .black.opacity(0.3), radius: 20.0, x: 5, y: 5) } } struct VideoWebView: UIViewRepresentable { var url: URL // 创建协调器,作为WKWebView的导航代理 func makeCoordinator() -> Coordinator { Coordinator() } func makeUIView(context: Context) -> WKWebView { let webView = WKWebView() // 绑定导航代理到协调器 webView.navigationDelegate = context.coordinator return webView } func updateUIView(_ webView: WKWebView, context: Context) { let request = URLRequest(url: url) webView.load(request) } // 协调器类,实现WKNavigationDelegate协议 class Coordinator: NSObject, WKNavigationDelegate { // 页面加载完成后,获取当前URL并保存 func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { guard let currentUrl = webView.url?.absoluteString else { return } UserDefaults.standard.set(currentUrl, forKey: "LastWebViewURL") } // 可选:跳转请求发起时立即捕获目标URL(按需选择是否启用) func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) { if let targetUrl = navigationAction.request.url?.absoluteString { UserDefaults.standard.set(targetUrl, forKey: "LastWebViewURL") } decisionHandler(.allow) // 允许页面跳转 } } } struct VideoView_Previews: PreviewProvider { static var previews: some View { VideoView() } }
关键细节说明
- 协调器的作用:作为WKWebView的代理载体,负责接收导航事件回调
- UserDefaults存储逻辑:用
LastWebViewURL作为存储键,每次URL变化时自动覆盖保存 - 初始URL恢复:启动时优先读取上次保存的URL,实现页面状态的持久化
- 两种监听方式:
didFinish:页面完全加载完成后获取最终URL,适合需要确保页面加载完成的场景decidePolicyFor:跳转请求发起时立即捕获目标URL,适合实时跟踪跳转意图的场景(按需选择一种即可)
内容的提问来源于stack exchange,提问作者taxidriver
相关产品推荐
相关产品推荐

