iOS Webview 离线加载调研与实践

💡 原文中文,约4500字,阅读约需11分钟。
📝

内容提要

Webview在客户端的运用场景越来越多,离线加载能节省网络加载耗时,提高用户体验。iOS端使用WKURLSchemeHandler来实现离线加载,通过hook方法和创建自定义的WKURLSchemeHandler类来完成。需要注意的问题有:任务溢出问题、Blob上传溢出问题、Blob上传内容丢失问题、Cookie同步问题。在实践中需要使用私有API和注入JS脚本,存在一定的风险性。

🔎

延伸解读

方案选型:为何选择WKURLSchemeHandler

文章对比了NSURLProtocol和WKURLSchemeHandler两种拦截方案。NSURLProtocol存在Post请求丢失body的问题,且拦截范围是全局的,风险更大。而WKURLSchemeHandler是iOS11后提供的接口,支持自定义协议资源加载,相对更安全。因此,iOS端离线加载选择WKURLSchemeHandler作为实现方案。

实现中的主要技术坑点

文章指出了四个关键问题:任务溢出导致崩溃、Blob上传崩溃、Blob上传内容丢失、Cookie同步问题。任务溢出需通过字典管理任务并在停止时移除;Blob上传崩溃需使用私有API _setLoadResourcesSerially:;Blob内容丢失需注入JS脚本hook前端ajax请求;Cookie同步需在请求成功后手动将Cookie同步到WKHTTPCookieStore。

风险与上线注意事项

实现过程中使用了hook系统方法和私有API,存在一定的风险性。同时需要注入JS脚本并hook前端代码,对前端有侵入性。文章强调上线前必须预留开关、进行灰度验证和线上监控,以应对可能出现的边界情况和风险。

❓

Q&A

iOS中如何实现Webview的离线加载?

可以通过WKURLSchemeHandler来实现离线加载,使用hook方法和创建自定义的WKURLSchemeHandler类。

WKURLSchemeHandler与NSURLProtocol相比有什么优势?

WKURLSchemeHandler相较于NSURLProtocol更为安全,避免了Post请求丢失body的问题。

在使用WKURLSchemeHandler时需要注意哪些问题?

需要注意任务溢出、Blob上传溢出、Blob上传内容丢失和Cookie同步等问题。

如何处理Blob上传时的数据丢失问题?

可以通过注入JS脚本来处理Blob对象,或将Blob数据base64后放到请求头中。

WKWebView的cookies是如何管理的?

WKWebView的cookies由WKHTTPCookieStore管理,而客户端请求的cookies由NSHTTPCookieStorage管理。

在iOS中实现Webview请求拦截存在哪些风险?

实现过程中需使用hook、私有API等,存在一定风险,需做好监控和验证。

🏷️

标签

➡️

继续阅读