iOs迁至WKWebView跨过的一些坑

下面是详细讲解“iOs迁至WKWebView跨过的一些坑”的完整攻略:

WKWebView简介

在iOS中,WKWebView是一个基于WebKit引擎的控件,可以用于加载网页。相较于UIWebView,WKWebView有性能更好、相应更快、占用内存更少等优点,因此被广泛应用于iOS应用的WebView开发中。

迁移步骤

步骤1:工程迁移

  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)
  1. 我们需要修改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的方法:

  1. 在Info.plist中添加域名白名单
<key>NSAppTransportSecurity</key>  
<dict>  
     <key>NSExceptionDomains</key>  
     <dict>  
          <key>xx.com</key>  
          <dict>  
               <!--是否添加根证书&emsp;&emsp;-->  
               <key>NSIncludesSubdomains</key>  
               <true/>  
               <!--根证书&emsp;&emsp;&emsp;&emsp;-->  
               <key>NSExceptionRequiresForwardSecrecy</key>  
               <false/>  
               <!--有效期&emsp;&emsp;&emsp;&emsp;&emsp;-->  
               <key>NSExceptionAllowsInsecureHTTPLoads</key>  
               <true/>  
               <!--是否强制证书验证&emsp;&emsp;-->  
               <key>NSExceptionAllowsInsecureHTTPLoads</key>  
               <false/>  
               <key>NSExceptionMinimumTLSVersion</key>  
               <string>TLSv1.2</string>  
          </dict>  
     </dict>  
</dict> 
  1. 添加 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技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • 常用的9个JavaScript图表库详解

    常用的9个JavaScript图表库详解 1. Chart.js Chart.js 是一个使用 HTML5 canvas 元素创建图表的 JavaScript 库。它可以绘制多种类型的图表,例如线性图、柱状图、饼图等等。 Chart.js 具有良好的文档和易于使用的 API。它适合初学者和有经验的开发者。 以下是一个简单的例子: <canvas id=…

    JavaScript 2023年5月27日
    00
  • 最新Javascript程序员面试试题和解题方法

    最新Javascript程序员面试试题和解题方法 介绍 本文将详细讲解最新Javascript程序员面试试题和解题方法,帮助读者了解常见的面试问题和解决方案,提高自己的Javascript编程能力。 常见试题 1. 什么是JS的原型链? JS的原型链是指所有的对象都有一个原型对象,如果对象A的原型链是B,B的原型链是C,那么A就会继承B的所有属性和方法,同时…

    JavaScript 2023年5月27日
    00
  • JS简单获取当前年月日星期的方法示例

    下面为你详细讲解“JS简单获取当前年月日星期的方法示例”的完整攻略。 1. 获取当前年月日 要获取当前年月日,可以使用JavaScript提供的Date对象。 1.1 获取当前日期 const now = new Date(); // 创建一个Date对象 const year = now.getFullYear(); // 年 const month = …

    JavaScript 2023年5月27日
    00
  • javascript中基于replace函数的正则表达式语法

    下面是关于“JavaScript中基于replace函数的正则表达式语法”的完整攻略。 什么是正则表达式 正则表达式是一种可以用于匹配字符串模式的工具。它由一些字符和特殊字符组成,可以用来描述和匹配字符串。正则表达式被广泛应用于字符串搜索和替换等操作。 replace函数 在JavaScript中,我们可以使用replace()函数来替换字符串中的部分内容。…

    JavaScript 2023年6月10日
    00
  • Javascript读取上传文件内容/类型/字节数

    下面是Javascript读取上传文件内容/类型/字节数的完整攻略。 1. 读取上传文件类型 实现读取上传文件类型的方法,可以使用HTML5标准中的File API。通过File API,可以使用JS访问用户选择的本地文件。 以下是一个使用File API的示例代码: const fileInput = document.getElementById(‘fi…

    JavaScript 2023年5月27日
    00
  • js实现前面自动补全位数的方法

    下面是详细讲解“js实现前面自动补全位数的方法”的完整攻略。 1. 简介 前置自动补全位数的方法就是指在数字前面添加相应数量的“0”,使得数字的位数达到指定的长度。在程序开发中,通常需要对数字进行前置自动补全位数操作,比如在电子表格中,在文件名中,签到表单中等等。 JavaScript提供了多种方法来完成这个任务,我们将介绍其中两种方法。 2. 方法一:利用…

    JavaScript 2023年5月28日
    00
  • 深入理解javascript中defer的作用

    深入理解JavaScript中defer的作用 什么是defer defer是HTML5中定义的一种异步加载脚本的方法,可以让脚本文件在后台加载,不影响页面的渲染,等到页面加载完成后再执行脚本。 如何使用defer 使用defer很简单,只需要在script标签中设置defer属性即可,例如: <script defer src="examp…

    JavaScript 2023年6月10日
    00
  • javascript使用for循环批量注册的事件不能正确获取索引值的解决方法

    当使用 for 循环批量注册事件时,经常会遇到无法正确捕获循环变量 i 的问题。这是因为循环结束后,i 的值会变成循环内最后一个迭代的值。这个问题通常称为 JavaScript 的闭包问题。下面是一个简单的示例说明: <!DOCTYPE html> <html> <head> <title>for循环注册事件示…

    JavaScript 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部