WKWebViews多个-在Swift中共享cookie,localStorage

问题描述

我有一个令人讨厌的问题。我有一个带有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登录该用户,当他进入您的应用程序时,他将不必再次登录。

这是它的完整文档:

SFSafariViewController

更新

如果您仍然想做已经开始的事情,请根据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
}