从UIWebView中的HTML文件加载内部资源

时间:2017-05-23 15:59:46

标签: ios swift uiwebview

在我在Xcode 8.2中构建的应用程序中,我有一个带有Web视图的控制器,其中Web视图加载了一个内部HTML文件,如下所示:

    let htmlFile = Bundle.main.path(forResource: "web/place-info", ofType: "html")
    var htmlString = try? String(contentsOfFile: htmlFile!, encoding: String.Encoding.utf8)
    self.webView.loadHTMLString(htmlString!, baseURL: nil)

然后我想在该HTML文件中包含一些额外的JavaScript和CSS,但该文件无法加载任何内容。包含路径似乎错误或被阻止。

<link rel="stylesheet" href="web/font-awesome/css/font-awesome.min.css">

更奇怪的是,此图片永远不会加载到place-info.html BODY标记内:

        <img src="ic-user-profile.png" />
        <img src="/ic-user-profile.png" />
        <img src="img/ic-user-profile.png" />
        <img src="/img/ic-user-profile.png" />
        <img src="web/img/ic-user-profile.png" />
        <img src="/web/img/ic-user-profile.png" />
        <img src="Project-Name/web/img/ic-user-profile.png" />
        <img src="/Project-Name/web/img/ic-user-profile.png" />
        <img src="Project-Name/Project-Name/web/img/ic-user-profile.png" />
        <img src="/Project-Name/Project-Name/web/img/ic-user-profile.png" />

我错过了Xcode 8.2中的一些特殊设置吗?请注意,在设置中,我已App Transport Security SettingsAllow Arbitrary Loads = YES

1 个答案:

答案 0 :(得分:1)

罪魁祸首是你将nil作为baseURL传递,并且仅为web视图提供要加载的字符串。它无法知道从哪里加载相关链接引用的文件的位置。

因此,只需将place-info.html所在的文件夹作为基本网址传递:

let baseURL = Bundle.main.url(forResource: "web", withExtension: nil)!
let contentURL = baseURL.appendingPathComponent("place-info.html")
let htmlString = try? String(contentsOf: contentURL, encoding: String.Encoding.utf8)
self.webView.loadHTMLString(htmlString!, baseURL: baseURL)

然后,相对链接如

  • <img src="ic-user-profile.png" />
  • <link rel="stylesheet" href="font-awesome/css/font-awesome.min.css">

将从相对于web文件夹的位置加载资源。请注意,我从样式表href中删除了web/,假设web文件夹包含font-awesome/css/font-awesome.min.css

web/
 |- place-info.html
 |- ic-user-profile.png
 |- font-awesome/
      |- css/
          |- font-awesome.min.css

添加Jacob Boyd的评论,请注意UIWebView API Reference

  

在iOS 8及更高版本中运行的应用中,使用WKWeb View类而不是使用UIWeb View。

WKWebView's API Reference进一步强调了这一点:

  

重要
  从iOS 8.0和OS X 10.10开始,使用WKWebView将Web内容添加到您的应用程序。不要使用UIWebView或WebView。