由于WKWebView實例不會把Cookie存入到App標準的的Cookie容器(HTTPCookieStorage)中, WKWebView擁有自己的私有存儲.
因為 NSURLSession/NSURLConnection等網(wǎng)絡(luò)請求使用HTTPCookieStorage進行訪問Cookie,所以不能訪問WKWebView的Cookie,現(xiàn)象就是WKWebView存了Cookie,其他的網(wǎng)絡(luò)類如NSURLSession/NSURLConnection卻看不到. 同時WKWebView也不會讀取存儲在HTTPCookieStorage中的Cookie.
要解決這一問題,通過JS的方式注入Cookie是對于我們目前的代碼來說是最合適也是最方便的. 因為我們已經(jīng)有了注入到HTTPCookieStorage的代碼, 那么只需要把這些Cookie轉(zhuǎn)化成JS并且注入到WKWebView里面就可以了拐袜。
fileprivate class func getJSCookiesString(_ cookies: [HTTPCookie]) -> String {
var result = ""
let dateFormatter = DateFormatter()
dateFormatter.timeZone = TimeZone(abbreviation: "UTC")
dateFormatter.dateFormat = "EEE, d MMM yyyy HH:mm:ss zzz"
for cookie in cookies {
result += "document.cookie='\(cookie.name)=\(cookie.value); domain=\(cookie.domain); path=\(cookie.path); "
if let date = cookie.expiresDate {
result += "expires=\(dateFormatter.string(from: date)); "
}
if (cookie.isSecure) {
result += "secure; "
}
result += "'; "
}
return result
}
注入的方法就是在每次initWkWebView的時候, 使用下面的config就可以了:
public class func wkWebViewConfig() -> WKWebViewConfiguration {
let userContentController = WKUserContentController()
if let cookies = HTTPCookieStorage.shared.cookies {
let script = getJSCookiesString(cookies)
let cookieScript = WKUserScript(source: script, injectionTime: WKUserScriptInjectionTime.atDocumentStart, forMainFrameOnly: false)
userContentController.addUserScript(cookieScript)
}
//禁止長按彈出 UIMenuController 相關(guān)
//禁止選擇 css 配置相關(guān)
let css = "('body{-webkit-user-select:none;-webkit-user-drag:none;}')"
//css 選中樣式取消
let javaScript = NSMutableString()
javaScript.append("var style = document.createElement('style');")
javaScript.append("style.type = 'text/css';")
javaScript.append("var cssContent = document.createTextNode\(css);")
javaScript.append("style.appendChild(cssContent);")
javaScript.append("document.body.appendChild(style);")
javaScript.append("document.documentElement.style.webkitUserSelect='none';")//禁止選擇
javaScript.append("document.documentElement.style.webkitTouchCallout='none';")//禁止長按
let noneSelectScript = WKUserScript.init(source: javaScript as String, injectionTime: .atDocumentEnd, forMainFrameOnly: true)
userContentController.addUserScript(noneSelectScript)
let webViewConfig = WKWebViewConfiguration()
webViewConfig.userContentController = userContentController
return webViewConfig
}
public class func getJSCookiesString() -> String? {
guard let cookies = HTTPCookieStorage.shared.cookies else {
return nil
}
return getJSCookiesString(cookies)
}
使用如下:
let config = CommonMethod.wkWebViewConfig()
var wkWebView = WKWebView.init(frame: CGRect(x:0,y:0,width:SCREEN_WIDTH,height:SCREEN_HEIGHT), configuration: config)