Как загрузить локальный CSS на удаленной веб-странице в WKWebView? - PullRequest
0 голосов
/ 18 марта 2020

Обновленный вопрос

Я загружаю удаленную страницу, которой я управляю, в 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 вопрос .

...