替换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
相关产品推荐
相关产品推荐

