背景

近期项目有个需求,后台给出一个PDFurl链接,前端iOS需要预览并且导出分享出去。本以为是很简单的需求,实际在做的时候也遇到了很多坑。特此记录下。

后台返回的数据如下,我们需要在前端显示这个url并且导出。

{
  "state" : "0000",
  "msg" : "处理成功",
  "data" : {
    "url" : "https:\/\/xxx.com\/uploadfile\/QT20201216000017788.pdf",
    ...
  }
  
  

预览

预览没什么好说的,系统自带了多种方式预览,UIWebView/WKWebViewQLPreviewControllerUIDocumentInteractionControllerCGContexDrawPDFPage选择自己适合的。

需要注意的是,UIWebView/WKWebView支持预览本地和在线文件,其他几种只能预览本地文件。

由于分享只能分享本地的文件,所以我的方案是先把在线PDF下载到本地,再使用UIWebView/WKWebView预览,用UIActivityViewController分享。
记得导入头文件#import <WebKit/WebKit.h>,遵循相关代理WKNavigationDelegate,WKUIDelegate,UIDocumentInteractionControllerDelegate

//保存并预览PDF
-(void)saveAndShowPDF{
    //这里的self.pdfUrlStr就是后台返回的url
    NSData *date = [NSData dataWithContentsOfURL:[NSURL URLWithString:self.pdfUrlStr]];
    NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)lastObject];
    NSFileManager *fileManger = [NSFileManager defaultManager];
    //创建目录
    [fileManger createDirectoryAtPath:documentPath withIntermediateDirectories:YES attributes:nil error:nil];
    //  创建文件
    NSString*filePath = [documentPath stringByAppendingPathComponent:@"xxx.pdf"];
    //写入文件
    [fileManger createFileAtPath:filePath contents:date attributes:nil];
    NSURL *url = [NSURL fileURLWithPath:filePath];
    NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url];
    //WKWebView显示文件
    _webView = [[WKWebView alloc]initWithFrame:CGRectMake(0, 0, KWIDTH, KHEIGHT)];
    _webView.navigationDelegate = self;
    _webView.UIDelegate = self;
    _webView.backgroundColor = [UIColor whiteColor];
    _webView.scrollView.showsVerticalScrollIndicator = NO;
    [_webView loadRequest:urlRequest];
    [self.view addSubview:_webView];
}

分享

分享这里遇到了大坑,本来打算使用UIDocumentInteractionController,没想到各种报错。经过数次踩坑,最终选择使用UIActivityViewController分享,相关代码如下:

    NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
    NSString*filePath = [documentPath stringByAppendingPathComponent:@"xxx.pdf"];
    NSURL*shareUrl = [NSURL fileURLWithPath:filePath];

    UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:@[shareUrl] applicationActivities:nil];
    [self presentViewController:activityViewController animated:YES completion:nil];

注意

如果还是遇到各种问题,不妨试试在Build Phases 导入 Social.framework

我有故事,你有酒吗?