iOs迁至WKWebView跨过的一些坑

yizhihongxing

下面是详细讲解“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日

相关文章

  • 实现非常简单的js双向数据绑定

    实现简单的双向数据绑定,主要需要掌握以下两个知识点: 如何监听输入框的变化事件并更新数据模型 如何监听数据模型的变化并更新对应的HTML元素 下面我们分别介绍这两个知识点的实现方法,以及两个示例说明。 监听输入框变化事件 在HTML中,输入框的值可以通过value属性获取到。我们可以使用EventTarget.addEventListener()方法来监听输…

    JavaScript 2023年6月10日
    00
  • 浅谈JS中json数据的处理

    下面是“浅谈JS中json数据的处理”的完整攻略: 一、什么是JSON JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,以易于读写且易于机器解析的形式传输数据。JSON采用键值对的形式组织数据,并使用逗号分隔不同的键值对。 二、JSON数据的表示方式 在JavaScript中使用JSON表示数据时,可以使用字面量表…

    JavaScript 2023年6月11日
    00
  • JS调试必备的5个debug技巧

    JS调试必备的5个debug技巧 1. 使用Chrome DevTools中的Debugger进行代码调试 Chrome DevTools提供了一个强大的Debugger工具,可以让我们在代码运行时进行调试,具有断点续调、单步调试、条件断点等功能。 使用步骤: 打开Chrome浏览器,进入开发者模式(F12或Ctrl+Shift+I)。 在Sources面板…

    JavaScript 2023年5月27日
    00
  • 用js进行url编码后用php反解以及用php实现js的escape功能函数总结

    以下是使用 JavaScript 进行 URL 编码并在 PHP 中进行反解码的攻略: JS 中的 URL 编码 在 JavaScript 中,可以使用 encodeURIComponent() 函数来对 URL 进行编码。 举例来说,如果想将以下字符串进行编码: var str = "hello world"; 可以使用以下代码进行编码…

    JavaScript 2023年5月19日
    00
  • Javascript Object对象类型使用详解

    Javascript Object对象类型使用详解 在 Javascript 中,Object 对象类型是最重要的类型之一。它是一种可以容纳各种数据类型的复合类型,用于表示对象实体或无序集合。在本文中,我们将详细讲解 Object 对象类型的各个方面,包括创建、读写属性、遍历、方法和继承等。 创建 Object 对象 使用 Object 构造函数或对象字面量…

    JavaScript 2023年5月27日
    00
  • JavaScript中对象property的读取和写入方法介绍

    下面我就来为你详细讲解“JavaScript中对象property的读取和写入方法介绍”。 什么是对象property 在JavaScript中,对象是一种基本类型,它由key-value键值对组成。对象的属性可以是任意的JavaScript值,例如数字、布尔值、字符串、函数、甚至可以是另一个对象。在JavaScript中,我们使用点(.)或方括号([])访…

    JavaScript 2023年5月27日
    00
  • 判断js中各种数据的类型方法之typeof与0bject.prototype.toString讲解

    接下来我将详细讲解“判断js中各种数据的类型方法之typeof与Object.prototype.toString讲解”。 typeof与Object.prototype.toString的差别 在 Javascript 中,判断一个值的类型通常使用 typeof 操作符和 Object.prototype.toString 方法,二者在实际开发中常常被用来…

    JavaScript 2023年6月10日
    00
  • web游览器的标签页仿 ios mac 苹果的墓碑机制 (js代码)

    背景: 本来项目开发系统防挂机功能,在其余游览器中均可以使用。但是呢在苹果的safair游览器中会出现几率失效,最后经过排查发现是苹果的墓碑机制导致。即:此标签页活跃,其他标签页假死。然后就导致防挂机失效了。 原理: 假如当前游览器中有3个标签页分别是A,B,C,每个标签页都有倒计时。正常情况下,每个标签页都会倒计时。但是苹果游览器只会有一个标签页A正常倒计…

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