我们如何为多个 UITab 使用相同的 WKWebView
How do we use same WKWebView for multiple UITab
我想创建一个带有多个标签栏的应用程序。但是每个选项卡,我都将使用 Web 视图。
问题:
- 是否可以使用相同的 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% 有效,但您可以尝试使用此样本来达到您的目标。希望对你有帮助。
我想创建一个带有多个标签栏的应用程序。但是每个选项卡,我都将使用 Web 视图。
问题:
- 是否可以使用相同的 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% 有效,但您可以尝试使用此样本来达到您的目标。希望对你有帮助。