Для предыдущих IOS 8 бет, загрузить локальный веб - приложение (в комплекте) , и он прекрасно работает как UIWebView
и WKWebView
, и я даже портировали веб - игры с помощью нового WKWebView
API.
var url = NSURL(fileURLWithPath:NSBundle.mainBundle().pathForResource("car", ofType:"html"))
webView = WKWebView(frame:view.frame)
webView!.loadRequest(NSURLRequest(URL:url))
view.addSubview(webView)
Но в бета-версии 4 у меня только что был пустой белый экран ( UIWebView
все еще работает), похоже, ничего не загружается и не выполняется. Увидел в журнале ошибку:
Не удалось создать расширение песочницы для /
Любая помощь, чтобы направить меня в правильном направлении? Спасибо!
Ответы:
Наконец-то они решили ошибку! Теперь мы можем использовать
-[WKWebView loadFileURL:allowingReadAccessToURL:]
. По-видимому, исправление стоило нескольких секунд в видеоролике WWDC 2015 504 Введение в Safari View ControllerДля iOS8 ~ iOS10 (Swift 3)
В ответе Дэна Фабулиша говорится, что это ошибка WKWebView,
которая, по-видимому, не будет решена в ближайшее время,и, как он сказал, есть обходной путь :)Я отвечаю только потому, что хотел показать здесь обходной путь. Код IMO, показанный в https://github.com/shazron/WKWebViewFIleUrlTest , полон несвязанных деталей, которые, вероятно, не интересуют большинство людей.
Обход - 20 строк кода, обработка ошибок и комментарии включены, сервер не нужен :)
И может использоваться как:
источник
let orgFolder = NSBundle.mainBundle().resourcePath! + "/www"; var newFilePath = pathForBuggyWKWebView(orgFolder) self.loadingWebView!.loadRequest(NSURLRequest(URL: NSURL.fileURLWithPath(newFilePath!+"/Loading.html")!))
WKWebView не может загружать контент из URL-адресов file: через свой
loadRequest:
метод. http://www.openradar.me/18039024Вы можете загружать контент через
loadHTMLString:
, но если ваш baseURL - это URL-адрес file:, он все равно не будет работать.IOS 9 имеет новый API , который будет делать то , что вы хотите,
[WKWebView loadFileURL:allowingReadAccessToURL:]
.Существует обходной путь для iOS 8 , продемонстрированный shazron в Objective-C здесь https://github.com/shazron/WKWebViewFIleUrlTest, чтобы копировать файлы
/tmp/www
и загружать их оттуда .Если вы работаете в Swift, вы можете вместо этого попробовать образец nachos4d . (Он также намного короче, чем образец Shazron, поэтому, если у вас возникли проблемы с кодом Shazron, попробуйте вместо этого.)
источник
/tmp/www/
. ИспользуйтеNSTemporaryDirectory()
иNSFileManager
для созданияwww
каталога (потому что по умолчанию такого каталога нет). Затем скопируйте туда свой файл и теперь прочтите этот файл :)Пример использования [WKWebView loadFileURL: AllowReadAccessToURL:] в iOS 9 .
При перемещении веб-папки в проект выберите «Создать ссылки на папки»
Затем используйте примерно такой код (Swift 2):
В файле html используйте такие пути к файлам
не так
Пример каталога, перемещенного в проект xcode.
источник
Временное решение: я использую GCDWebServer , как предлагает GuidoMB.
Сначала я нахожу путь к моей связанной папке «www /» (которая содержит «index.html»):
... затем запустите его так:
Чтобы остановить это:
Производительность выглядит нормально даже на iPad 2.
Я заметил сбой после того, как приложение перешло в фоновый режим, поэтому я остановил его
applicationDidEnterBackground:
иapplicationWillTerminate:
; Запускаю / перезапускаю наapplication:didFinishLaunching...
иapplicationWillEnterForeground:
.источник
WKWebView
даетUIWebView
. Можно также придерживаться старого API, пока это не будет исправлено.Это решило проблему для меня iOS 8.0+ dev.apple.com
также, похоже, это тоже сработало отлично ...
источник
allowFileAccessFromFileURLs
подход дает сбойNSUnknownKeyException
.Помимо решений, упомянутых Дэном Фабуличем , XWebView - еще одно решение. [WKWebView loadFileURL: allowingReadAccessToURL:] будет осуществляться за счет расширения .
источник
Я пока не могу комментировать, поэтому публикую это как отдельный ответ.
Это объективная версия решения nacho4d . Лучший обходной путь, который я когда-либо видел.
источник
В случае, если вы пытаетесь отобразить локальное изображение в середине более крупной строки HTML, например:,
<img src="file://...">
оно все еще не отображается на устройстве, поэтому я загрузил файл изображения в NSData и смог отобразить его, заменив строку src на сами данные. Пример кода, помогающий создать строку HTML для загрузки в WKWebView, где результат - это то, что заменит то, что находится внутри кавычек src = "":Swift:
Objective-C:
источник
result += "data:image/" + attachmentType + ";base64," + base64String
WKWebView
как<img>
внутри HTML-строки.Я использую ниже. Есть некоторые дополнительные вещи, над которыми я работаю, но вы можете видеть, где я закомментировал loadRequest и заменяю вызов loadHTMLString. Надеюсь, это поможет, пока они не исправят ошибку.
источник
Для тех, кто должен решить эту проблему в iOS8:
Если ваша страница несложная, вы можете сделать ее одностраничным приложением.
Другими словами, чтобы встроить все ресурсы в html файл.
Для этого: 1. скопируйте содержимое вашего js / css файла в / tags в html файле соответственно; 2. Преобразуйте файлы изображений в формат SVG, чтобы заменить соответствующие файлы. 3. загрузите страницу, как раньше, используя [webView loadHTMLString: baseURL:], например
Это немного отличалось от стиля изображения svg, но оно не должно сильно блокировать вас.
Казалось, что производительность рендеринга страницы немного снизилась, но было достойно, чтобы такой простой обходной путь работал под iOS8 / 9/10.
источник
В той же строке GCDWebServer я использую SImpleHttpServer ( http://www.andyjamesdavies.com/blog/javascript/simple-http-server-on-mac-os-x-in-seconds ), а затем loadRequest с локальным хостом URL - адрес. При таком подходе вам не нужно добавлять какую-либо библиотеку, но файлы веб-сайта не будут в пакете, поэтому он не будет доставлен. Из-за этого это было бы более подходящим для случаев отладки.
источник
Мне удалось использовать веб-сервер PHP в OS X. Копирование во временный каталог / www не помогло мне. Python SimpleHTTPServer пожаловался на то, что хочет читать типы MIME, вероятно, проблема с песочницей.
Вот сервер, использующий
php -S
:источник
Решение @ nacho4d хорошее. Я хочу его немного изменить, но не знаю, как это изменить в вашем посте. Я положил это сюда, надеюсь, вы не против. Спасибо.
Если у вас есть папка www, есть много других файлов, таких как png, css, js и т. Д. Затем вам нужно скопировать все файлы в папку tmp / www. например, у вас есть такая папка www:
затем в Swift 2.0:
функция fileURLForBuggyWKWebView8 скопирована из @ nacho4d:
источник
Попробуйте использовать
Кажется, все еще работает. Все же.
источник