0

更新的问题

我正在将我控制的远程页面加载到WKWebview我的应用程序中,并通过加载本地 CSS 和字体文件对其进行自定义。在页面加载时webView:didFinishNavigation:,我正在运行一些 JS 来注入一些style标签和一个link元素,这些标签和一个元素src通过myfile通过WKURLSchemeHandler. 似乎是Content Security Policy正在阻止加载本地文件。

我无法添加标头,因为我正在加载的页面位于 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:"/>

即使添加了这个,Web 视图也不会尝试加载本地 CSS - 查看 Safari Web 检查器,该link元素位于head但 CSS 文件未显示在网络选项卡上。在控制台中进行评估await fetch('otfile://myfile.css')会产生如下警告:

[阻止] https://my-bucket.s3.amazonaws.com/file.xhtml的页面不允许显示来自 otfile://file.css 的不安全内容。

可以在此处找到演示该问题的示例项目。

我的问题现在变成了:如何向 WKWebView / WebKit 指定允许通过我的自定义 URL 方案加载任意内容?


原文见下文

我在 WKWebView 中加载一个远程页面,我需要通过在页面加载时使用 Javascript 注入对本地 CSS 文件的引用来自定义它的样式。我正在使用一个实现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 时没有报告错误。

我看到的是 Web 视图不会尝试加载 CSS 文件。它甚至从不调用方案处理程序,并且它不会在 Web Inspector 中显示为已尝试的请求。

我已尝试将href元素的 设置link为远程 URL,并且 Web 视图尝试加载它。我还尝试创建一个将其设置为URL 的img元素并将其附加到文档正文,然后 Web 视图尝试加载它。srcmyfile://

WKWebView当它打开的文档是 via 时,是否有属性或安全策略或阻止使用自定义方案处理程序加载 CSS 文档的东西https

更新:这似乎与此问题相同。

4

0 回答 0