WKWebview无法正确打开用webpack打包的web本地页面

872 阅读2分钟

问题描述

在 iOS 开发过程中,我们可能会发现这样的问题。一个用 webpack 打包的web项目,部署在远端服务器一切正常。但是把它放到本地,放到工程目录中,用 iOS 的 webview 无法正确打开他的 index.html。所有的图片都显示不出来,js也无法正确加载。

在服务器之所能加载

因为webpack所生成文件,说有路径都是相对路径,是相对于根目录的。

部署在服务器时,所要资源文件路径,都是相对于站点域名的。根目录就是站点域名。

譬如:运行基础路径是 H5,资源路径是 /static/logo.png,站点是 my.domain.com。生成的文件中的路径变成 /h5/static/logo.png

在站点中加载,完整路径

my.domain.com/h5/static/l…

不支持 file协议打开

如果本地打开,无论是用 pc 浏览器,还是手机上的 webview。都是依靠file:// 协议

该协议特点,没有站点的说法,根目录是 file:///

所以在加载 /static/js/pages-index-index.ca45c656.js 时,实际上是加载:

file:///static/js/pages-index-index.ca45c656.js

当然找不到

解决方式

更改工程的运行基础路径配置

最为直接的方法是,把所有路径的前缀,由 / 开头改成 ./。但是

但是,只修改 index.html 是没有用的,全局替换又不切实际的。

不论是用 vue 、 react 还是 uni-app 开发的项目,都有一个叫运行基础路径。我们需要修改 web 项目的运行基础路径,改为 .

以uni-app项目为例。具体做法是,打开项目的 manififest.json,在h5配置中找到运行的基础路径 ,将其改为 ./。这样一来,uni-app打包脚本会根据我们的配置,自动将所有资源路径改为以.为前缀。这样一来,问题就解决了。

image-20220125104414714

如果你使用源码视图打开的,请找到h5.router.base ,将其改为./

  "h5" : {
      "title" : "oa-client",
      "domain" : "127.0.0.1",
      "router" : {
          "base" : "./"
      }
  }

值得注意的是,vue 项目也有类似的配置。

用 WKWebView 打开

由于 UIWebView 已经弃用,我们只介绍用 WKWebView 打开的方法。代码很简单

if let path =  Bundle.main.path(forResource: "h5", ofType: nil)
  {
   let full =  "(path)/index.html"
   let url  =  URL(fileURLWithPath: full)
   webView.loadFileURL(url, allowingReadAccessTo: URL(fileURLWithPath: path))
}

值得注意的是,allowingReadAccessTo 参数是必不可少的,从参数名可以知道,我们需要给予 index.html 中脚本访问资源路径的权力。

另外,把 h5 文件夹拖入工程的时候,需要勾选 Create folder references

image-20220125111621547

也就是说 h5 文件夹作为整体,需要出现在 Copy Bundle Resources 下。

image-20220125111831357