我想在我的iOS应用中的WKWebView中显示一个网站,为此我需要为用户的会话设置特定的http cookie。 Cookie已存储在应用程序的共享HttpCookieStorage中。
目前,我尝试将它们从那里复制到Web视图的WKWebsiteDataStore,然后用以下代码加载网站:
class ViewerViewController: UIViewController {
// MARK: - Properties
var webView: WKWebView!
// MARK: - Life Cycle
override func loadView() {
webView = WKWebView()
view = webView
}
override func viewDidLoad() {
super.viewDidLoad()
addCookiesToWebView {
print("Load website")
if let url = Bundle.main.url(forResource: "MyWebsite", withExtension: "html"), let html = try? String(contentsOf: url) {
self.webView.loadHTMLString(html, baseURL: url)
}
}
}
// MARK: - Functions
func addCookiesToWebView(completionHandler: @escaping (() -> Void)) {
let sharedCookies = HTTPCookieStorage.shared.cookies!
let webViewCookieStore = webView.configuration.websiteDataStore.httpCookieStore
var count = 0
sharedCookies.forEach { cookie in
DispatchQueue.main.async {
webViewCookieStore.setCookie(cookie) {
count += 1
print("Added cookie \(cookie.name)")
if count == sharedCookies.count {
completionHandler()
}
}
}
}
}
}
现在,对我来说令人不解的是,这有时可行,并且用户在其用户会话中通过了身份验证,但有时没有。
似乎在复制所有Cookie之前,可能存在一种竞争状况导致Web视图加载网站?当我研究此问题时,我注意到WKWebView中的其他人也有cookie的问题,但到目前为止,我还没有找到任何能真正解决我问题的解决方案。
我的代码中是否有错误,或者是否有更好的方法将多个Cookie从HttpCookieStorage复制到WKWebView?