Обновленный вопрос
Я загружаю удаленную страницу, которой я управляю, в WKWebview
в своем приложении и настраиваю ее, загружая локальные CSS и файлы шрифтов. При загрузке страницы в webView:didFinishNavigation:
я запускаю несколько JS, чтобы внедрить некоторые теги style
и элемент link
, чей src
указывает на локальный файл через пользовательскую схему URL myfile
, реализованную через WKURLSchemeHandler
. Локальный файл заблокирован от загрузки из-за того, что выглядит как Политика безопасности содержимого .
Я не могу добавить заголовки, потому что загружаемая страница находится в корзине S3, но Я добавил тег meta
к head
на сервере (без добавления JS):
<meta http-equiv="Content-Security-Policy" content="default-src 'self' otfile:; style-src 'self' 'unsafe-inline' 'unsafe-eval' http: https: data: otfile:"/>
Даже при этом добавлении веб-представление не пытается загрузить локальный CSS - при просмотре веб-инспектора Safari элемент link
находится в head
, но файл CSS не отображается на вкладке сети. Оценка await fetch('otfile://myfile.css')
в консоли выдает следующее предупреждение:
[заблокировано] На странице https://my-bucket.s3.amazonaws.com/file.xhtml не разрешено отображать небезопасный контент из файла otfile: // . css.
Пример проекта, демонстрирующего проблему, можно найти здесь .
Мой вопрос теперь стал: Как мне указать в WKWebView / WebKit, что разрешено загружать произвольный контент через мою собственную схему URL здесь?
См. ниже оригинал
Я загружаю удаленную страницу в WKWebView и мне нужно настроить его стиль, вставив ссылку на локальный файл CSS при загрузке страницы, используя Javascript. Я использую реализацию WKURLSchemeHandler
для этого. Когда я настраиваю свое веб-представление:
WKFileLoadHandler *fileHandler = [[MyFileLoadHandler alloc]init];
[config setURLSchemeHandler:fileHandler forURLScheme:@"myfile"];
self.webView = [[WKWebView alloc] initWithFrame:CGRectZero configuration:config];
self.webView.navigationDelegate = self;
self.webView.allowsLinkPreview = NO;
self.webView.opaque = NO;
[self.view addSubview:self.webView];
[self.webView autoPinEdgesToSuperviewEdges];
//self.url is a remote url
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:self.url];
request.cachePolicy = NSURLRequestReloadIgnoringLocalAndRemoteCacheData;
[self.webView loadRequest:request];
Затем, когда страница загружена, в webView:didFinishNavigation
:
NSMutableString *strJs = [NSMutableString string];
[strJs appendString:@"var cssTag = document.createElement('link');\n"];
[strJs appendString:@"cssTag.setAttribute('type', 'text/css');\n"];
[strJs appendString:@"cssTag.setAttribute('href', 'myfile://bundle/css/engine.css');\n"];
[strJs appendString:@"cssTag.setAttribute('rel', 'stylesheet');\n"];
[strJs appendString:@"document.head.appendChild(cssTag);\n"];
[self.webView evaluateJavascript:strJs completionHandler:nil];
В моем коде у меня есть обработчик завершения, который я ' мы здесь опущены для краткости, и при работе JS.
не сообщается об ошибке. Я вижу, что веб-представление не пытается загрузить файл CSS. Он даже не обращается к обработчику схемы и не отображается в веб-инспекторе как запрос, который был предпринят.
Я попытался установить для href
элемента link
значение удаленный URL вместо этого, и веб-представление пытается загрузить это. Я также попытался создать элемент img
с его src
, установленным на URL-адрес myfile://
, и добавить его в тело документа, и веб-представление пытается загрузить его.
Есть свойство или защита политика или что-то, что мешает WKWebView
загружать CSS документы с использованием обработчиков нестандартных схем, когда открываемый документ выполняется с помощью https
?
Обновление: это похоже на ту же проблему, что и this вопрос .