SwiftUI 使用 WebView 打开加载网页视图

App 中的很多时候我们需要直接加载展示网页视图,例如使用条款、网站页面,甚至是边缘业务打开网页视图,一般可以通过:Safari 打开、内置浏览器 SFSafariViewControllerWKWebView ,其中 WKWebView 最灵活扩展,自定义性更强,更推荐这种方式,SwiftUI 原生只支持使用 Safari 打开浏览网页,这很难满足一些要求。


Safari 方式打开网页

SwiftUI 内置 Link 控件,它会直接跳转到 Safari 打开指定地址网页

struct ContentView: View {
    var body: some View {
        NavigationStack {
            Link(destination: URL(string: "https://www.codeun.com/")!) {
                Image(systemName: "safari")
                    .font(.largeTitle)
                    .foregroundColor(.blue)
            }
        }
    }
}

使用 WKWebView 打开网页

这种方式 SwiftUI 没有提供 WKWebViewSFSafariViewController 原生支持,需要使用 UIKit UIViewRepresentable 帮助实现,下面的示例代码可以简单的构建一个内置 WebView 打开网页,通过跳转到 WebView 这个视图,传递 URL 即可打开指定网页。

import SwiftUI
import WebKit

struct WebView: UIViewRepresentable {
    // 需打开网页的 URL 地址
    let url: URL

    // UIViewRepresentable 协议中必需的方法
    func makeUIView(context: Context) -> WKWebView {
        
        return WKWebView()
    }
    
    // UIViewRepresentable 协议中必需的方法,当状态发生变化时,可以加载一个新的 URL。
    func updateUIView(_ webView: WKWebView, context: Context) {

        let request = URLRequest(url: url)
        webView.load(request)
    }

    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }
    
    class Coordinator: NSObject, WKNavigationDelegate {
        var parent: WebView
        
        init(_ parent: WebView) {
            self.parent = parent
        }
        
        // 可以实现 WKNavigationDelegate 的其他方法来处理页面加载状态、错误等
    }
}


struct ContentView: View {
    @State private var showSafari = false
    // 示例在底部 Sheet 弹出网页视图
    var body: some View {
        Button("Open Safari View") {
            showSafari = true
        }
        .sheet(isPresented: $showSafari) {
            SafariView(url: URL(string: "https://www.example.com")!)
        }
    }
}

  本文自 https://www.codeun.com 发布,相应代码均自主编写并严格审阅和测试,完整代码中包含丰富的学习笔记和使用方式、实用技巧。
  · 如若转载,请注明出处:https://www.codeun.com/archives/1066.html ·

(0)
上一篇 2023-04-18 上午9:58
下一篇 2023-04-21

发表回复

登录后才能评论