更新的问题
我正在将我控制的远程页面加载到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 视图尝试加载它。src
myfile://
WKWebView
当它打开的文档是 via 时,是否有属性或安全策略或阻止使用自定义方案处理程序加载 CSS 文档的东西https
?
更新:这似乎与此问题相同。