iOS WKWebview loadHTMLString (_ baseURL :) не может загрузить изображения и прочитать css - PullRequest
2 голосов
/ 02 февраля 2020

Я знаю, что этот вопрос задавался ранее, но у меня немного другая ситуация.

Я пытаюсь позвонить на loadHTMLString(_ baseURL:) на WKWebview, и мой baseURL находится в каталоге AppData/Documents.

Мне нужно загрузить HTMLstring и использовать изображения из этого каталога. HTMLstring нигде не находится, я загружаю строку, анализирую ее, изменяю и загружаю.

Как я понимаю, я не могу этого сделать из-за какой-то проблемы безопасности (она отлично работала в UIWebview ), поэтому HTMLstring загружен, а изображения и CSS - нет.

Кроме того, я не могу вызвать loadFileURL(_, allowingReadAccessTo:), потому что у меня нет файла, у меня есть HTMLstring и я не могу сохранить его в файл непосредственно перед вызовом, из-за моих собственных проблем безопасности ,

Мой код огромен и очень сложен. Я бы хотел, чтобы загрузка изображений была максимально безболезненной.

У кого-нибудь есть идея?

Ответы [ 2 ]

1 голос
/ 02 февраля 2020

Я не уверен, исходный код HTML вы положили его где. Я предполагаю, что вы помещаете это в Пакет. Вот моя идея.

В файле HTML для тега изображения. Мы должны сделать как этот шаблон.

<image src="{xxx}" ....>

Затем в коде iOS. Мы заменим sr c на путь к изображению и загрузим в 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];  

Примечание. Убедитесь, что baseURL указывает на папку HTML. Это должна быть опция «Создать ссылки на папки», когда вы добавляете исходный код HTML в Xcode.

0 голосов
/ 26 апреля 2020

У меня sh У меня был лучший ответ, и если у кого-то есть лучший ответ, я с радостью приму его. В итоге я переместил свои файлы во временный каталог :( Я использовал это -

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 разрешено получать все.

...