iOS: WKWebview, как разрешить файлу html, находящемуся в комплекте, доступ на чтение к каталогу документов - PullRequest
2 голосов
/ 27 января 2020

У меня есть файл html, расположенный в комплекте, и я использую WKWebView для загрузки содержимого из этого html:

let fileURL = URL(fileURLWithPath: Bundle.main.path(forResource:"demo", ofType: "html")!)
    webView.loadFileURL(fileURL, allowingReadAccessTo: fileURL)

Однако, в этом файле html есть некоторые сценарии, которые пытаясь получить доступ к файлам, расположенным в папке «Документы» (некоторые видео сохранены там), но получить «не удается загрузить локальные ресурсы». ошибка. Я использую эти файлы где-то еще в AVPlayerViewController, поэтому я знаю, что файлы существуют, и URL-адрес, который я использую, является правильным.

Я пытался:

1. передать URL-адрес документа в параметр allowReadAccessTo - веб-просмотр даже не загружает

2. Скопируйте элементы из каталога dir в tmp dir и передайте этот URL-адрес (tmp dir) в сценарии - это работает , но этот процесс происходит слишком часто, и я не хочу копировать столько файлов из-за проблем с памятью и времени, которое требуется для больших файлов.

3. Скопируйте файл html и его сценарии из пакета в документы dir - не имеет отношения к делу , так как используемые мной сценарии время от времени меняются, поэтому, чтобы пользователь всегда имел Последняя версия (из сценариев) Мне придется копировать ее каждый раз при запуске приложения.

Итак, есть ли другой способ разрешить файлу html (расположенному в комплекте) доступ к файлу документов?

Заранее спасибо,

1 Ответ

1 голос
/ 28 января 2020

Это относится к одному файлу, но вы должны иметь возможность создать функцию, которая копирует соответствующие файлы в каталог документов, используя приведенный ниже код.

///Copy the file from the bundle to the Documents Directory
guard let bundleURL = Bundle.main.url(forResource:"demo", ofType: "html") else {
     preconditionFailure("Unable to get bundle URL") 
}

guard let documentsDirectory = let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else {
     preconditionFailure("Unable to get Documents URL") 
}

let newURL = documentsDirectory.appendingPathComponent("demo.html")

do {
   try FileManager.default.copyItem(at: bundleURL, to: newUrl)
} catch {
   print("Error copying bundle: \(error)")
}


///Setup the WKWebView
let prefs = WKPreferences()
prefs.javaScriptEnabled = true

let webConfig = WKWebViewConfiguration()
webConfig.preferences = prefs

var webViewer = WKWebView(frame: view.frame, configuration: webConfig)
webViewer.loadFileURL(newURL, allowingReadAccessTo: documentsDirectory)

Имейте в виду, Bundle находится в другом каталоге вашего приложения. Тот факт, что файл имеет доступ к каталогу документов, не означает, что HTML внутри файла сможет найти ссылочные скрипты или другие файлы HTML, на которые вы ссылаетесь. Вы должны считать все внутри пакета неизменным, а само местоположение - только источником происхождения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...