下面是详细讲解“iOs迁至WKWebView跨过的一些坑”的完整攻略:
WKWebView简介
在iOS中,WKWebView是一个基于WebKit引擎的控件,可以用于加载网页。相较于UIWebView,WKWebView有性能更好、相应更快、占用内存更少等优点,因此被广泛应用于iOS应用的WebView开发中。
迁移步骤
步骤1:工程迁移
- 将UIWebView替换为WKWebView
在iOS 12.0以前,使用的是UIWebView,因此需要将UIWebView替换成WKWebView。可以通过Storyboard或使用纯代码创建一个新的WKWebView来更新UI。对于使用Storyboard的情况,只需要在ViewController中将UIWebView替换成WKWebView即可。纯代码则需要手动创建WKWebView对象并将其设置到视图中:
let webConfiguration = WKWebViewConfiguration()
let webView = WKWebView(frame: .zero, configuration: webConfiguration)
view.addSubview(webView)
- 我们需要修改cookie的设置。策略的原因,WKWebView的接口无法直接访问NSHTTPCookieStorage的方法,而我们需要拿cookie来做登录态校验等。解决办法是给我们的WKWebView注入cookie,注入方式如下:
if #available(iOS 11.0, *) {
self.webView.configuration.websiteDataStore.httpCookieStore.getAllCookies { (cookies) in
let cookieDict = HTTPCookie.requestHeaderFields(with: cookies)
let cookies = HTTPCookie.cookies(withResponseHeaderFields: cookieDict, for: url)
cookies.forEach({
self.configuration.userContentController.addUserScript(WKUserScript(source: "document.cookie='\($0.name)=\($0.value); expires=\($0.expiresDate ?? Date.init(timeIntervalSinceNow: 360000)].toUTCString(); path=\($0.path ?? "/"); domain=\($0.domain ?? "")'", injectionTime: .atDocumentStart, forMainFrameOnly: false))
})
}
} else {
// Fallback on earlier versions
}
步骤2:适配HTTPS
WKWebView的安全级别更高,因此需要单独处理HTTPS的请求,否则将无法加载连接。这里提供两种适配HTTPS的方法:
- 在Info.plist中添加域名白名单
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>xx.com</key>
<dict>
<!--是否添加根证书  -->
<key>NSIncludesSubdomains</key>
<true/>
<!--根证书    -->
<key>NSExceptionRequiresForwardSecrecy</key>
<false/>
<!--有效期     -->
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
<!--是否强制证书验证  -->
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<false/>
<key>NSExceptionMinimumTLSVersion</key>
<string>TLSv1.2</string>
</dict>
</dict>
</dict>
- 添加 WKNavigationDelegate 代理方法用于遵循 HTTPS 协议的验证。
func webView(_ webView: WKWebView, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
guard challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust else {
completionHandler(.rejectProtectionSpace, nil)
return
}
if let trust = challenge.protectionSpace.serverTrust {
let credential = URLCredential(trust: trust)
completionHandler(.useCredential, credential)
}
}
示例1:注入Javascript
if let path = Bundle.main.path(forResource: "test", ofType: "js") {
let source = try String(contentsOfFile: path, encoding: .utf8)
let script = WKUserScript(source: source,
injectionTime: .atDocumentEnd,
forMainFrameOnly: true)
webView.configuration.userContentController.addUserScript(script)
} else {
print("script not found")
}
示例2:响应网页事件
webView.evaluateJavaScript("document.getElementById('id-btn-click').addEventListener('click', function() { window.webkit.messageHandlers.buttonClicked.postMessage(null); })")
总结
以上是iOS迁移至WKWebView的一个完整攻略,在迁移过程中需要特别注意的点是cookie、HTTPS等。同时,通过示例我们还可以看到,使用WKWebView还可以给网页注入Javascript,并且可以响应网页事件。对于那些基于Web的应用来说,这些功能无疑是相当实用的。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:iOs迁至WKWebView跨过的一些坑 - Python技术站