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
        }
    }
}

然后 loadHtmlStringURL 到这个目录。从这个目录,WKWebview 被允许获取所有内容。