在我在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 Settings
为Allow Arbitrary Loads = YES
答案 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。