使用WKWebView加载本地PDF出现白屏问题求助
本地PDF文件在WKWebView中显示白屏,原代码曾正常运行
我在本地应用目录中存储了一份PDF文件,多年前编写的用于在WKWebView中显示该PDF的代码曾运行无异常,但现在无法正常工作,仅显示白屏。
原代码如下:
NSString* pdfFileName = [self getPDFFileName]; WKWebView* webView = [[WKWebView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)]; NSURL *url = [NSURL URLWithString:pdfFileName]; NSURLRequest *request = [NSURLRequest requestWithURL:url]; [webView loadRequest:request]; [self.view addSubview:webView];
我随后尝试了WKWebView的其他加载方式,例如:
NSData *data = [NSData dataWithContentsOfFile:pdfFileName]; [webView loadData:data MIMEType:@"application/pdf" characterEncodingName:@"" baseURL:[NSURL URLWithString:pdfFileName]];
或者:
[webView loadFileURL:url allowingReadAccessToURL:url];
但这些方式均无效。请问是什么变化导致本地PDF无法正常显示?
问题根源及解决方案
1. 本地文件URL构造错误(核心问题)
你使用[NSURL URLWithString:pdfFileName]构造本地文件URL是错误的。URLWithString:仅适用于网络URL(如http://开头的地址),本地文件路径必须用[NSURL fileURLWithPath:pdfFileName]来生成合法的file://协议URL。早期系统可能对错误URL有兼容处理,但现在WKWebView对URL格式的校验更严格,错误URL会直接导致加载失败,出现白屏。
2. loadFileURL:allowingReadAccessToURL:参数错误
调用该方法时,allowingReadAccessToURL:应该传入PDF文件所在的目录URL,而非文件本身的URL。WKWebView需要明确访问权限的范围,若传入文件URL,权限被限制为仅该文件,后续可能因权限校验逻辑的更新导致加载失败。
修正后的可运行代码
NSString* pdfFilePath = [self getPDFFileName]; // 生成正确的本地文件URL NSURL *pdfFileURL = [NSURL fileURLWithPath:pdfFilePath]; // 获取文件所在目录的URL,用于设置访问权限范围 NSURL *fileDirectoryURL = [pdfFileURL URLByDeletingLastPathComponent]; WKWebView* webView = [[WKWebView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)]; // 使用正确的API加载本地PDF [webView loadFileURL:pdfFileURL allowingReadAccessToURL:fileDirectoryURL]; [self.view addSubview:webView];
额外排查要点
- 确认
getPDFFileName返回的是完整的本地文件绝对路径,而非相对路径或单纯文件名。可通过打印路径并检查文件是否存在:NSLog(@"PDF路径:%@,文件存在:%d", pdfFilePath, [[NSFileManager defaultManager] fileExistsAtPath:pdfFilePath]); - 检查App的文件访问权限:若PDF存储在沙盒外,需确保App已获取对应权限;沙盒内文件默认有权限访问。
- 验证PDF文件本身是否损坏:将文件导出到电脑,用PDF阅读器打开确认文件完整性。
内容的提问来源于stack exchange,提问作者JeffB6688
相关产品推荐
相关产品推荐

