You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

替换UIWebView为WKWebView后,加载带XSL转换的XML页面显示空白

WKWebView加载带XSL的XML空白问题解决方案

问题原因

WKWebView对本地资源的访问限制、loadData方法处理XML+XSL的逻辑和UIWebView存在差异,导致无法正确加载XSL转换文件,最终页面空白。

解决步骤

1. 开启WKWebView的本地文件访问权限

WKWebView默认禁止从本地文件URL访问其他本地资源,需要初始化时配置开启:

WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
// 允许文件URL访问其他本地文件
config.allowsFileAccessFromFileURLs = YES;
// 初始化WKWebView时传入该配置
_webView = [[WKWebView alloc] initWithFrame:self.view.bounds configuration:config];
[self.view addSubview:_webView];

2. 检查XML中的XSL引用路径

确保XML头部的XSL引用是相对于Bundle根目录的正确文件名,比如:

<?xml-stylesheet type="text/xsl" href="你的XSL文件名.xsl"?>

同时确认XSL文件已添加到Xcode项目中,且Target Membership已勾选,能被打包进App Bundle。

3. 替换loadData为loadFileURL(推荐)

动态生成的XML数据可以先写入临时文件,再通过loadFileURL加载,同时允许访问Bundle目录:

NSData *xmlData = [self.invoiceXML dataUsingEncoding:NSUTF8StringEncoding];
// 写入临时文件
NSString *tempFilePath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"temp_invoice.xml"];
[xmlData writeToFile:tempFilePath atomically:YES];
NSURL *tempFileURL = [NSURL fileURLWithPath:tempFilePath];
// 获取Bundle的URL(比路径字符串转URL更准确)
NSURL *bundleURL = [[NSBundle mainBundle] bundleURL];
// 加载临时XML文件,并允许访问Bundle内的XSL文件
[_webView loadFileURL:tempFileURL allowingReadAccessToURL:bundleURL];

4. 调整loadData参数(备选)

如果坚持使用loadData,可以尝试修改MIME类型为application/xml,并确保baseURL使用Bundle的URL而非路径:

NSURL *baseURL = [[NSBundle mainBundle] bundleURL]; // 替换原bundlePath转URL的方式
NSData *xmlData = [self.invoiceXML dataUsingEncoding:NSUTF8StringEncoding];
[_webView loadData:xmlData MIMEType:@"application/xml" characterEncodingName:@"utf-8" baseURL:baseURL];

验证

完成上述操作后,重新运行App,WKWebView应该能正确加载XML并应用XSL转换渲染页面。

内容的提问来源于stack exchange,提问作者Adeel kiani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 05:55:15