iOS WKWebview loadHTMLString(_ baseURL:) 加载图片和读取失败css
iOS WKWebview loadHTMLString(_ baseURL:) fails to load images and read css
我知道以前有人问过这个问题,但我的情况有点不同。
我正在尝试在 WKWebview
上调用 loadHTMLString(_ baseURL:)
,我的 baseURL 在 AppData/Documents
目录中。
我需要 HTMLstring
加载并且它需要使用该目录中的图像。 HTMLstring
不在任何地方,我下载字符串解析它,修改它并加载它。
据我了解,由于某种安全问题(它在 UIWebview 上运行良好),我不能这样做,因此 HTMLstring
已加载,但图像和 CSS
未加载。
此外,我无法调用 loadFileURL(_, allowingReadAccessTo:)
因为我没有文件 我有一个 HTMLstring
并且无法在调用之前将其保存到文件,因为我自己的安全问题。
我的代码很大而且很复杂我想以最轻松的方式实现加载图片。
有人有想法吗?
我不确定你把它放在哪里的源代码 HTML。我假设您将它放在 Bundle 中。这是我的想法。
在图像标签的 HTML 文件中。我们应该喜欢这个模板。
<image src="{xxx}" ....>
然后在iOS代码中。我们将src替换成图片路径加载到WKWebview中:
// make sure you have the image name and extension (for demo purposes, I'm using "myImage" and "png" for the file "myImage.png", which may or may not be localized)
NSString *imageFileName = @"myImage";
NSString *imageFileExtension = @"png";
// load the path of the image in the main bundle (this gets the full local path to the image you need, including if it is localized and if you have a @2x version)
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *imagePath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.%@", imageFileName, imageFileExtension]];
// generate the html tag for the image (don't forget to use file:// for local paths)
NSString *imgFilePath = [NSString stringWithFormat:@"file://%@", imagePath];
// Replace an imagepath
NSString *path = [[NSBundle mainBundle] pathForResource:@"filename" ofType:@"html"];
NSString *html = [[NSString alloc] initWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
html = [html stringByReplacingOccurrencesOfString:@"{xxx}" withString:imgFilePath];
// Folder html url
NSString *destinationHTMLFolder = [[NSBundle mainBundle] pathForResource:@"myhtml" ofType:@""];
NSURL *destination = [NSURL fileWithPath: destinationHTMLFolder]
[self.webView loadHTMLString:html baseURL:destination];
Note: Please make sure the baseURL is pointing to the HTML folder. It
should be a "Create folder references" option at the time you add the HTML source code into the Xcode.
我希望我有更好的答案,如果有人有更好的答案,我会很乐意接受。
我最终将我的文件移动到临时目录:(我用过这个 -
extension FileManager
{
func copyToTemporaryDirectory(itemIn itemURL: URL) -> URL?
{
let tempDirectoryURL = URL(fileURLWithPath: NSTemporaryDirectory())
let fileName = itemURL.lastPathComponent
let copyURL = tempDirectoryURL.appendingPathComponent(fileName)
let fileManager = FileManager.default
do {
if fileManager.fileExists(atPath: copyURL.path)
{
try fileManager.removeItem(at: copyURL)
}
try FileManager.default.copyItem(at: itemURL, to: copyURL)
return copyURL
}
catch let error
{
logger.debug("copyItem error: \(error.localizedDescription)")
return nil
}
}
}
然后 loadHtmlString
和 URL
到这个目录。从这个目录,WKWebview 被允许获取所有内容。
我知道以前有人问过这个问题,但我的情况有点不同。
我正在尝试在 WKWebview
上调用 loadHTMLString(_ baseURL:)
,我的 baseURL 在 AppData/Documents
目录中。
我需要 HTMLstring
加载并且它需要使用该目录中的图像。 HTMLstring
不在任何地方,我下载字符串解析它,修改它并加载它。
据我了解,由于某种安全问题(它在 UIWebview 上运行良好),我不能这样做,因此 HTMLstring
已加载,但图像和 CSS
未加载。
此外,我无法调用 loadFileURL(_, allowingReadAccessTo:)
因为我没有文件 我有一个 HTMLstring
并且无法在调用之前将其保存到文件,因为我自己的安全问题。
我的代码很大而且很复杂我想以最轻松的方式实现加载图片。
有人有想法吗?
我不确定你把它放在哪里的源代码 HTML。我假设您将它放在 Bundle 中。这是我的想法。
在图像标签的 HTML 文件中。我们应该喜欢这个模板。
<image src="{xxx}" ....>
然后在iOS代码中。我们将src替换成图片路径加载到WKWebview中:
// make sure you have the image name and extension (for demo purposes, I'm using "myImage" and "png" for the file "myImage.png", which may or may not be localized)
NSString *imageFileName = @"myImage";
NSString *imageFileExtension = @"png";
// load the path of the image in the main bundle (this gets the full local path to the image you need, including if it is localized and if you have a @2x version)
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *imagePath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.%@", imageFileName, imageFileExtension]];
// generate the html tag for the image (don't forget to use file:// for local paths)
NSString *imgFilePath = [NSString stringWithFormat:@"file://%@", imagePath];
// Replace an imagepath
NSString *path = [[NSBundle mainBundle] pathForResource:@"filename" ofType:@"html"];
NSString *html = [[NSString alloc] initWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
html = [html stringByReplacingOccurrencesOfString:@"{xxx}" withString:imgFilePath];
// Folder html url
NSString *destinationHTMLFolder = [[NSBundle mainBundle] pathForResource:@"myhtml" ofType:@""];
NSURL *destination = [NSURL fileWithPath: destinationHTMLFolder]
[self.webView loadHTMLString:html baseURL:destination];
Note: Please make sure the baseURL is pointing to the HTML folder. It should be a "Create folder references" option at the time you add the HTML source code into the Xcode.
我希望我有更好的答案,如果有人有更好的答案,我会很乐意接受。 我最终将我的文件移动到临时目录:(我用过这个 -
extension FileManager
{
func copyToTemporaryDirectory(itemIn itemURL: URL) -> URL?
{
let tempDirectoryURL = URL(fileURLWithPath: NSTemporaryDirectory())
let fileName = itemURL.lastPathComponent
let copyURL = tempDirectoryURL.appendingPathComponent(fileName)
let fileManager = FileManager.default
do {
if fileManager.fileExists(atPath: copyURL.path)
{
try fileManager.removeItem(at: copyURL)
}
try FileManager.default.copyItem(at: itemURL, to: copyURL)
return copyURL
}
catch let error
{
logger.debug("copyItem error: \(error.localizedDescription)")
return nil
}
}
}
然后 loadHtmlString
和 URL
到这个目录。从这个目录,WKWebview 被允许获取所有内容。