问题描述
我有一个令人讨厌的问题。我有一个带有5个标签栏按钮的UITabBar应用程序。每个都连接到一个viewController:FirstViewController,SecondViewController等。
在5个ViewController中的每一个中,我都有一个WKWebView。 5个WKWebViews显示电子商务网站的各个部分。例如,标签1显示首页,标签2显示购物车等。
为了使该应用程序正常运行,我需要所有5个WKWebView来共享所有cookie,localStorage和IndexDB。
现在,我正在这样做:
FirstViewController
class FirstViewController: UIViewController,WKNavigationDelegate {
var webView: WKWebView!
let uniqueProcesspool = WKProcesspool()
let websiteDataStoreA = WKWebsiteDataStore.nonPersistent()
..
class YourModelObject {
static let sharedInstance = YourModelObject()
let configA = WKWebViewConfiguration()
}
override func loadView() {
let model = YourModelObject.sharedInstance
//so I believe I'm doing the right thing here setting this
model.configA.processpool = uniqueProcesspool
model.configA.websiteDataStore = websiteDataStoreA
webView = WKWebView(frame: .zero,configuration: model.configA)
webView.navigationDelegate = self
self.webView.scrollView.delegate = self
view = webView
}
现在在 SecondViewController 中,我只需执行以下操作:
override func loadView() {
//am I doing something wrong here - like creating another instance of configA,instead of re-using - and if so,how do I re-use what was created in FirstViewController?
let model = FirstViewController.YourModelObject.sharedInstance
webView = WKWebView(frame: .zero,configuration: model.configA)
webView.navigationDelegate = self
self.webView.scrollView.delegate = self
view = webView
}
当我运行项目时,FirstViewController中来自WKWebView的cookie,localStorage和IndexDB信息不会与SecondViewController共享-即使根据我的说法,我对两者都使用相同的configA。
解决方法
我认为最好使用SFSafariViewController
来满足您的需求。
文档说明:
在iOS 9和10中,它与Safari共享Cookie和其他网站数据。
这意味着它将使用来自Safari浏览器的相同cookie和数据,这甚至更好。如果我没记错的话,可以通过Safari登录该用户,当他进入您的应用程序时,他将不必再次登录。
这是它的完整文档:
更新:
如果您仍然想做已经开始的事情,请根据Objective-C中的this答案,这是Swift中的解决方案:
您需要一个用于存储持久性“进程池”的地方。您的情况是
YourModelObject
单身
class YourModelObject {
static let sharedInstance = YourModelObject()
let processPool = WKProcessPool()
}
在初始化webView之前,使用共享的
processPool
。这是您在loadView()
中为每个viewController调用的初始化函数:
override func loadView() {
super.loadView() //don't forget this line
setupWebView()
}
private func setupWebView() {
let config = WKWebViewConfiguration()
config.processPool = YourModelObject.sharedInstance.processPool
self.webView = WKWebView(frame: .zero,configuration: config)
self.webView.navigationDelegate = self
self.webView.scrollView.delegate = self
self.view = self.webView
}