WKWebView 资源本地化

WKWebView 资源本地化调研

技术背景

项目中有用到 WKWebView,为了提高用户体验,加快资源访问速度,所以做了资源本地化。HTML 页面通过网络加载,其余资源通过本地 Base 流的形式传给前端。

但是最近线上老有用户反馈题目展示失败的情况。

排查后,发现是通过网络加载的 HTML 资源访问失败。于是考虑 HTML 通过本地加载,并且满足跨域访问本地和服务器资源。

调研结果

加载本地 HTML 有3种方式:

  1. 打开加载本地文件私有API
    出于安全考虑,苹果把涉及用户安全的方法变为私有 API 默认是关闭状态,现阶段研究结果是手动强制打开私有的浏览器API。但是会面临安全性风险,具体参考 iOS 漏洞预警

    WebKitAllowUniversalAccessFromFileURLs
    WebKitAllowFileAccessFromFileURLs
    

    打开后可 JS 可以通过 file:// 成功加载本地资源,以及 HTTP 跨域访问服务器资源。但是增加了上线的风险,由于涉及到用户隐私安全的私有 API,如果苹果静态代码扫描到的话有被拒的风险。攻击者可利用 App 文件下载机制将恶意文件写入沙盒内并诱导用户打开,当用户打开恶意文件时,其中的恶意代码可通过 AJAX 向“file://”域发起请求,从而远程获取App沙盒内所有的本地敏感数据。

  2. 图片走Base流方式加载
    客户端和前端协定好,通过桥接函数传递资源,加载的图片文件名字以数组的形式告诉客户端客户端从本地找到该文件转化为 Base 流以 JS 形式传给交互课件那边。但是存在界面资源太多时候,存在性能以及不好维护的问题。

  3. 本地启动一个轻量级 Web 服务器
    增加客户端压力,当 App 启动的时候客户端本地启动一个 Web 服务器。(不推荐)