Mis*_*cha 33 css image ios swift wkwebview
在iOS 8及更高版本中运行的应用程序中,使用WKWebView类而不是使用UIWebView.
因此,我UIWebView用一个闪亮的新东西取代了我的好老WKWebView.但我认为这是一个简单的练习(简单地交换类和替换委托方法)结果是一个真正的混乱.
当我使用加载HTML字符串时
loadHTMLString(String, baseURL: URL?)
Run Code Online (Sandbox Code Playgroud)
Web视图加载并呈现纯HTML,但它不会加载在其中引用的任何图像或CSS文件htmlString.
这只发生在真实的设备上!
在Simultor中,所有引用的资源都已正确加载.
我htmlString在我的视图控制器类中定义了一个简单的:
let imageName = "image.png"
let libraryURL: URL // The default Library URL
var htmlString: String {
return "<html> ... <img src=\"\(imageName)\" /> ... </html>"
// "..." represents more valid HTML code incl. header and body tags
}
Run Code Online (Sandbox Code Playgroud)
图像存储在根库文件夹中,因此其URL为:
let imageURL = libraryURL.appendingPathComponent(imageName)
Run Code Online (Sandbox Code Playgroud)
现在我加载htmlString到Web视图中:
webView.loadHTMLString(htmlString, baseURL: libraryURL)
Run Code Online (Sandbox Code Playgroud)
即使baseURL设置正确,它也不会加载图像.
可能WKWebView在解析相对路径时遇到问题所以我的第一个想法是在HTML字符串中使用绝对路径.
→❌不起作用.
对另一篇SO帖子的两个答案表明,在iOS 9+ 中使用
loadFileURL(URL, allowingReadAccessTo: URL)
而不是loadHTMLString(...)作品.
→✅有效.
但是,我无法使用解决方案2,因为我的HTML文件已加密,并且解密的文件不得存储在磁盘上.
有没有什么办法来加载本地资源,如使用图片和样式WKWebView的
loadHTMLString(String, baseURL: URL?)
Run Code Online (Sandbox Code Playgroud)
功能?或者仍然是iOS 9+中的错误?
(我简直不相信Apple提供并建议使用无法从HTML字符串中加载任何本地Web内容的Web视图?!)
Pet*_*nev 12
如果不看一下你的实际项目,就很难给出一些肯定的建议.
然而:
class ViewController: UIViewController {
var webView = WKWebView()
override func viewDidLoad() {
super.viewDidLoad()
webView.translatesAutoresizingMaskIntoConstraints = false
let views = [
"webView" : webView
]
view.addSubview(webView)
var constraints = NSLayoutConstraint.constraintsWithVisualFormat("H:|[webView]|", options: [.AlignAllLeading, .AlignAllTrailing], metrics: nil, views: views)
constraints.appendContentsOf(NSLayoutConstraint.constraintsWithVisualFormat("V:|[webView]|", options: [.AlignAllTop, .AlignAllBottom], metrics: nil, views: views))
NSLayoutConstraint.activateConstraints(constraints)
let path = NSBundle.mainBundle().pathForResource("ios - WKWebView fails to load images and CSS using loadHTMLString(_, baseURL_) - Stack Overflow", ofType: "htm")
let url = NSURL(fileURLWithPath: path!)
webView.loadHTMLString(try! String(contentsOfURL: url), baseURL: url.URLByDeletingLastPathComponent)
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
Run Code Online (Sandbox Code Playgroud)
我认为这里的关键点是baseUrl参数,你应该正确设置它.在我的情况下,我使用了没有最后路径组件的html的url - 例如包含文件夹.这在设备和模拟器上都能正常工作 - 检查设备快照.我已经将示例项目上传到 https://github.com/soxjke/WKWebViewTest,所以你可以看看(我已经从git中删除了代码签名信息)
所以,回顾 - 方法是有效的,功能是有效的,只是你做错了.为了帮助您解决您的解决方案的问题,我将添加一些建议:1.请记住,模拟器文件系统不区分大小写,设备文件系统区分大小写.因此,如果你的html中的文件名是小写的 - 这将不适用于设备.8fFsD.png != 8ffsd.png
2.请记住,在复制资源时,XCode会忽略您的文件夹结构.因此,如果您的html已经<img src="./img/1.png">和您的XCOde项目具有类似的文件夹结构
test.htm
img/
1.png
2.png
Run Code Online (Sandbox Code Playgroud)
构建后它将被展平,因此test.htm和1.png和2.png将位于同一级别
test.htm
1.png
2.png
Run Code Online (Sandbox Code Playgroud)
我几乎可以肯定,在你验证这两个假设后,你会得到这个方法.
Sco*_*wne 12
我今天遇到了这个问题,我找到了解决方案和可能的原因:
loadHTMLString(String, baseURL: URL?)
Run Code Online (Sandbox Code Playgroud)
这个函数不允许渲染的 HTML 访问本地媒体,据我所知,这是因为它会存在注入风险,这可能允许渲染的 HTML 访问和操作您的本地文件系统。使用 html 字符串,它可以来自任何地方或任何人。
loadFileURL(URL, allowingReadAccessTo: URL)
Run Code Online (Sandbox Code Playgroud)
使用此函数,您将 WKWebview 指向 FileManager 中的 html 文件,并指向包含“allowingReadAccessTo”的文件夹。因为 html 存储在 FileManager 中,它将允许呈现的 HTML 访问本地存储的媒体。
如果由于某种原因您没有将 html 文件存储在本地(我假设您有),您可以将 html 字符串写入 .html 文件,然后指向该文件的 URL。但是,这只是在破坏 Apple 的保护,因此请自担风险(不要这样做)。
这只是对我有用的解决方案,也是我对为什么我们开始遇到问题的理解。
编辑#1:错别字。
编辑 #2:我发现了另一个细微差别,当声明“allowingReadAccessTo:”URL 时,如果 HTML 本身需要访问父文件夹(即:.css、.js 文件)中的内容,则需要指定父文件夹,不一定是 HTML 本身的位置,这也将隐式允许访问子文件夹。对我来说,这个问题只在物理设备上很明显,在模拟器中运行时这似乎没有影响,这可能是模拟器和物理设备上的权限工作方式之间的另一个差异。
您可以对图像进行 Base64 编码...我知道这可行。但不确定它是否适合您的用例。
有点有趣,我刚刚在做相反的事情时遇到了这个问题 - 从 Base64 编码转移到图像文件。
| 归档时间: |
|
| 查看次数: |
17286 次 |
| 最近记录: |