我们如何为多个 UITab 使用相同的 WKWebView

How do we use same WKWebView for multiple UITab

我想创建一个带有多个标签栏的应用程序。但是每个选项卡,我都将使用 Web 视图。

问题:

  1. 是否可以使用相同的 WKWebView(Reuse)?我该怎么做?

有人可以帮助我提供最佳方法吗?我是 swift 和 iOS 的新手。

同一个对象可以在多个地方使用,您需要创建对象的副本或创建class的新对象。并实现一种使两者保持同步的方法。

所以我怎么看,你最大的问题,为什么你想在每个选项卡上重用 WKWebView 是共享 cookie:

在这种情况下,我们可以避免重用并创建一种 cookie 管理器:

// SharedCookieManager.swift


final class SharedCookieManager: NSObject {
    
    // Singleton manager
    static let `default` = SharedCookieManager()
    private override init() { super.init() }
    
    // All cookies taht we have on every WKWebView
    var cookies: Set<HTTPCookie> = []
    // Callback helping to observe changes in our set
    var cookieUpdateCallback: ((_ cookies: [HTTPCookie]) -> Void)?
    
    // Append method
    func appendCookies(_ cookies: [HTTPCookie]) {
        cookies.forEach({ [weak self] in
            self?.cookies.insert([=10=])
        })
    }
}

我们经理的用例:


// FirstTabViewController.swift

class FirstTabViewController: UIViewController, WKHTTPCookieStoreObserver {
    
    var webView: WKWebView? {
        didSet {
            SharedCookieManager.default.cookieUpdateCallback = { [weak self] newCookies in
                self?.webView?.configuration.websiteDataStore.httpCookieStore.getAllCookies({ oldCookies in
                    Set(newCookies).symmetricDifference(oldCookies).forEach({
                        self?.webView?.configuration.websiteDataStore.httpCookieStore.setCookie([=11=], completionHandler: nil)
                    })
                    self?.webView?.reload()
                })
            }
        }
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        WKWebsiteDataStore.default().httpCookieStore.add(self)
        let webView = WKWebView()
        
        SharedCookieManager.default.cookies.forEach({ [weak webView] in
            webView?.configuration.websiteDataStore.httpCookieStore.setCookie([=11=])
        })
    }
    
    func cookiesDidChange(in cookieStore: WKHTTPCookieStore) {
        cookieStore.getAllCookies({
            SharedCookieManager.default.appendCookies([=11=])
        })
    }
}

您在 TabBar

中使用的每个 ViewController 都相同

这不是“金锤子”,我不能说它 100% 有效,但您可以尝试使用此样本来达到您的目标。希望对你有帮助。