WKWebView打开pdf文件乱码?各种方案整理。
近期有用户反馈使用我们FinClip SDK运行的小程序,在iOS18.0.1的系统上打开部分pdf文件的时候出现了乱码的现象, 低版本的系统打开没有出现乱码的现象,用电脑打开这个pdf文件也是正常的。经过排查,可能是iOS18的系统对WKWebView进行了调整处理,导致了WKWebView对pdf文件的兼容性没有处理好。随后调研了打开pdf的几套方案,最终选择了系统的PDFKit中的PDFView来打开pdf文件的方案,替换掉了原本WKWebView打开pdf文件的方案。
FinClip
FinClip是一个小程序容器解决方案,让原生App能够运行小程序,实现"一次开发,多端运行"。
使用FinClip SDK,你可以
- 将微信小程序直接运行在你自己的App上。
- 可以将微信小程序直接生成 iOS App、安卓 App、鸿蒙App。可以直接上架。
iOS PDF文件查看方案总结
一、系统原生方案
1. UIDocumentInteractionController
UIDocumentInteractionController *documentController = [UIDocumentInteractionController interactionControllerWithURL:pdfURL];
documentController.delegate = self;
[documentController presentPreviewAnimated:YES];
优点:
- 系统原生支持,稳定性好
- 支持多种文件格式,不限于PDF
- 提供分享、打印等系统功能
- 实现简单,代码量少
缺点:
- 界面定制性差
- 无法控制PDF阅读进度
- iOS13之后在某些情况下可能出现兼容性问题
- 必须将文件保存到本地才能打开
2. QLPreviewController
QLPreviewController *previewController = [[QLPreviewController alloc] init];
previewController.dataSource = self;
previewController.delegate = self;
[self presentViewController:previewController animated:YES completion:nil];
优点:
- 系统原生控件,性能好
- 支持多种文件预览
- 提供基本的缩放、滚动功能
- 实现相对简单
缺点:
- 界面定制受限
- 无法实现复杂的交互功能
- 不支持文档编辑
- 同样需要本地文件
二、WebView方案
1. WKWebView
WKWebView *webView = [[WKWebView alloc] initWithFrame:self.view.bounds];
NSURLRequest *request = [NSURLRequest requestWithURL:pdfURL];
[webView loadRequest:request];
优点:
- 实现简单
- 支持在线PDF预览
- 可以加载网络PDF
- 内存占用相对较小
缺点:
- PDF渲染质量一般
- 缩放体验不如原生控件
- 功能较为基础
三、PDFKit方案
1. PDFKit(iOS 11+)
PDFView *pdfView = [[PDFView alloc] initWithFrame:self.view.bounds];
PDFDocument *document = [[PDFDocument alloc] initWithURL:pdfURL];
pdfView.document = document;
优点:
- 苹果官方框架
- 性能好
- 支持基本的PDF操作
- 免费使用
缺点:
- 只支持iOS 11以上系统
- 功能相对基础
四、第三方框架
1. PSPDFKit(收费)
PSPDFDocument *document = [[PSPDFDocument alloc] initWithURL:pdfURL];
PSPDFViewController *pdfController = [[PSPDFViewController alloc] initWithDocument:document];
[self presentViewController:pdfController animated:YES completion:nil];
优点:
- 功能非常强大
- 支持注释、标注、表单
- 性能优秀
- 文档完善,技术支持好
缺点:
- 收费
五、选择建议
- 简单预览需求:
- 推荐使用QLPreviewController或PDFKit
- 适合只需要基础预览功能的场景
- 完整功能需求:
- 推荐使用PSPDFKit或其他商业解决方案
- 适合需要专业PDF处理功能的场景
六、代码示例
PDFKit完整示例
#import <PDFKit/PDFKit.h>
@interface PDFViewController : UIViewController
@property (nonatomic, strong) PDFView *pdfView;
@property (nonatomic, strong) PDFDocument *document;
@end
@implementation PDFViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 创建PDFView
self.pdfView = [[PDFView alloc] initWithFrame:self.view.bounds];
self.pdfView.autoScales = YES;
[self.view addSubview:self.pdfView];
// 加载PDF文件
NSURL *pdfURL = [[NSBundle mainBundle] URLForResource:@"sample" withExtension:@"pdf"];
self.document = [[PDFDocument alloc] initWithURL:pdfURL];
self.pdfView.document = self.document;
}
@end
原文地址:https://blog.csdn.net/ikj1235/article/details/144819129
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!