详解iOS webview加载时序和缓存问题总结

yizhihongxing

详解iOS WebView加载时序和缓存问题总结

简介

本文主要介绍iOS系统中WebView的加载时序、缓存机制及相关问题的总结。

WebView加载时序

WebView的加载时序可以分为以下几个阶段:

  1. 发起请求:调用WebView加载网页时,首先会发起一个HTTP请求。
  2. 解析HTML:WebView接收到HTTP响应后,会将HTML解析成DOM树和CSSOM树。
  3. 解析JS:通过DOM树和CSSOM树计算出页面的布局信息,然后会解析JS脚本。
  4. 绘制:计算完成后,将根据渲染树中的每个节点的信息绘制页面。

WebView缓存机制

WebView有两种缓存机制:内存缓存和硬盘缓存。

内存缓存是WebView对一些经常访问的数据进行缓存,以提高访问性能。

硬盘缓存是将 WebView 加载的数据缓存到磁盘上,以便下次访问时不必重新下载数据。有两种硬盘缓存:document 和 resources。document 缓存存储 HTML 文档以及可能的 CSS 和 JS 文件,而 resources 缓存存储页面中的图片和其他文件。

在iOS 9及以上系统版本中,Apple加入了一个新的缓存机制:App Transport Security(ATS)。

该机制要求WebView只能访问使用HTTPS协议并且在ATS白名单中的网站。若不是使用HTTPS连接,则需要设置相关属性才能启用非HTTPS的连接。另外,ATS机制还规定了响应缓存必须要使用HTTPS协议。

下面介绍一下如何在WebView中设置缓存机制。

设置缓存

在iOS中,设置缓存需要通过NSURLRequest和NSURLSessionConfiguration两个类来实现。

let cacheSizeMemory = 10 * 1024 * 1024; // 10 MB
let cacheSizeDisk = 50 * 1024 * 1024; // 50 MB
let configuration = URLSessionConfiguration.default
configuration.urlCache = URLCache(memoryCapacity: cacheSizeMemory, diskCapacity: cacheSizeDisk, diskPath: "myCachePath")
let session = URLSession(configuration: configuration)
let url = URL(string: "http://www.example.com/")!
let request = URLRequest(url: url)

session.dataTask(with: request) { (data, response, error) in
    if let error = error {
        print("Error with request: \(error)")
    } else {
        print("Data: \(data)")
    }
}.resume()

清理缓存

通过修改URLCache的MemoryCapacity和DiskCapacity属性可以进行缓存大小的控制。

URLCache.shared.removeAllCachedResponses()

WebView常见问题

下面列举几个常见的问题及解决方法。

无法与外部链接交互

在iOS中,WebView默认会禁止与外部链接进行交互操作,如跳转到其他app等。需要在ViewController中加入如下代码:

override func viewDidLoad() {
    super.viewDidLoad()
    webView.navigationDelegate = self
    webView.uiDelegate = self
    let request = URLRequest(url: URL(string: "http://www.example.com/")!)
    webView.load(request)
    webView.scrollView.isScrollEnabled = false
    webView.scrollView.bounces = false
}

extension ViewController: WKNavigationDelegate {
    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
        if navigationAction.targetFrame == nil {
            webView.load(navigationAction.request)
        }

        decisionHandler(.allow)
    }
}

避免WebView内存泄漏

由于WebView本身是持有强引用的,所以容易发生内存泄漏问题。解决方法如下:

  1. 在WebView进行deinit处理时,将其所有的delegate属性设置为nil。
  2. 在WebView之前加入一个控制器作为parentViewController,当WebView关闭时根据需要对其进行处理。

总结

本文主要介绍了iOS系统中WebView的加载时序、缓存机制及相关问题的总结,并给出了两个示例。在使用WebView时,需根据具体情况进行设置和优化,以提高其运行效率和稳定性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解iOS webview加载时序和缓存问题总结 - Python技术站

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

相关文章

  • js页面滚动时层智能浮动定位实现(jQuery/MooTools)

    实现 js 页面滚动时层智能浮动定位,可以使用 jQuery 或 MooTools 这样的 JavaScript 库。下面是实现步骤的详细攻略: 步骤一:在 HTML 页面中添加需要浮动定位的层 首先,在你的 HTML 页面中添加需要浮动定位的层。例如,你的页面中有一个 <div> 容器,里面包含一个 <p> 标签和一张图片: &lt…

    css 2023年6月10日
    00
  • jQuery实现导航滚动到指定内容效果完整实例【附demo源码下载】

    下面是关于“jQuery实现导航滚动到指定内容效果完整实例【附demo源码下载】”的完整攻略: 1. 简介 这是一篇jQuery实现导航滚动到指定内容效果的完整实例教程,通过这个效果,用户能够在网页的导航菜单上点击对应的标签,直接跳转到相应的内容位置,提高网站的用户体验度。 2. 实现过程 步骤一:导航菜单设置 首先需要设置导航菜单的样式和内容,其中每个菜单…

    css 2023年6月10日
    00
  • css background-attachment属性进阶

    当设置一个元素的背景图片时,background-attachment属性的值会影响这个背景图的移动方式。background-attachment的默认值是scroll,表示背景图会随着元素的滚动而滚动。但是可以通过更改background-attachment属性的值来实现背景的不同移动效果。 background-attachment: fixed; …

    css 2023年6月9日
    00
  • canvas实现图片根据滑块放大缩小效果

    来详细讲解如何使用canvas实现图片根据滑块放大缩小效果。步骤如下: 步骤一:创建canvas元素 首先,我们需要在网页中创建一个canvas元素。可以使用以下代码: <canvas id="canvas"></canvas> 步骤二:获取Canvas 2D上下文 我们需要获取到Canvas 2D上下文,以便在c…

    css 2023年6月10日
    00
  • css重绘与重排的方法

    当我们在开发网站时,如果使用了CSS样式表进行样式布局,那么在浏览器渲染页面时,会按照以下流程进行渲染: 解析HTML文档,创建DOM树; 解析CSS样式,生成CSS规则树; 将DOM树和CSS规则树合并,生成渲染树; 对渲染树进行布局,计算每个元素的大小和位置等信息; 对渲染树进行绘制,将元素渲染到页面上。 在这个过程中,当我们修改了DOM树或者CSS样式…

    css 2023年6月9日
    00
  • Html5写一个简单的俄罗斯方块小游戏

    Html5写一个简单的俄罗斯方块小游戏的攻略如下: 前置知识 在开始编写俄罗斯方块小游戏前,需要掌握以下技能:- HTML5 canvas画布- JavaScript基础语法和事件监听- 使用DOM API操作页面元素 环境搭建 首先需要在页面中添加一个canvas元素,用于绘制游戏界面。示例代码如下: <canvas id="canvas&…

    css 2023年6月10日
    00
  • VUE实现分布式医疗挂号系统预约挂号首页步骤详情

    Vue实现分布式医疗挂号系统预约挂号首页步骤详情 背景 随着人们健康意识的增强,医疗行业的用户需求也日益增长。因此,设计并开发一款分布式医疗挂号系统预约挂号首页,使得用户可以方便快捷的找到自己想要的医院和科室,提高医疗行业的效率和服务质量。 步骤 1. 确定需求和功能 首先,我们需要确定需求和功能,包括页面设计、搜索功能、地图展示等。这可以通过对用户需求进行…

    css 2023年6月10日
    00
  • CSS中box(盒模式)的分析

    CSS中的盒模型是指网页元素被看作一个矩形的盒子,这个盒子由4个部分组成,分别是:content(内容区域)、padding(内边距)、border(边框)、margin(外边距)。这4个部分都有各自的作用,我们需要通过CSS的属性来控制这4个部分的样式和大小。 盒模型的组成 盒模型的4个部分的具体含义如下: Content: 盒子里面用来显示文本、图像、视…

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