iOS 调用第三方文档打开文件

背景:

        我们的应用下载了一个文件,并且需要展示这些文件,但是app本身不能打开的或者需要提供更多操作方式时,需要调用别的app来打开这个文件,在iOS 中提供了UIDocumentInteractionController和QLPreviewController来帮我们完成这件事。

        UIDocumentInteractionController和QLPreviewController仅支持本地文件的预览,不支持在线预览,所以需要将其下载到本地后才可进行预览。

 一、UIDocumentInteractionController:

    1、UIDocumentInteractionController是一个强大的文档阅读器,主要功能如下:

        1)预览文档,包括word文档、excel文档、pdf文档等等

        2)调用iPhone里第三方的app打开文档

        3)将文档用系统级分享到各个应用中(包括QQ、微信、邮箱等)

        4)如果有条件配备支持AirPrint的打印机的话,就可以直接打印文档

    2、实现步骤:

        1)要声明一个变量!!不然后面会发生崩溃

@interface FileManager()

@property (nonatomic , strong)UIViewController *viewController;

@property (nonatomic , strong)UIDocumentInteractionController *documentVC;

@end

        2)在触发预览/共享的地方实现如下代码:

            a.本应用内预览文档

    self.documentVC = [UIDocumentInteractionController interactionControllerWithURL:fileUrl];

    //代理设置 -- 应用内预览必须要添加代理UIDocumentInteractionControllerDelegate

    self.documentVC.delegate =self;

    //当前app打开,需实现协议方法才可以完成预览功能

    [_documentVC presentPreviewAnimated:YES];

    需要实现如下代理方法:

说明:UIDocumentInteractionController虽然它叫控制器,但是它不是真正意义上的控制器而是继承自NSObject的。所以这个地方需要返回给一个控制器用于展现documentController在其上面,所以我们就返回当前控制器self

#pragma mark- UIDocumentInteractionControllerDelegate

- (UIViewController *)documentInteractionControllerViewControllerForPreview:(UIDocumentInteractionController *)controller{
    return self;

}

             b.在其他应用中打开、分享

BOOL canOpen = [self.documentVC presentOpenInMenuFromRect:CGRectZero inView:_viewController.view animated:YES];

if(canOpen ==NO){

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示"message:@"没 有找到可以打开该文件的应用"delegate:nil cancelButtonTitle:@"确定"otherButtonTitles:nil, nil];

    [alert show];

}

        无法打开时,弹窗告知,不然用户会感觉莫名其妙。在其他应用中打开、分享时,依然需事先其代理方法,再此就不列举了。

二、QLPreviewController

    1、QLPreviewController的实现和UIDocumentInteractionController类似,但是QLPreviewController是真正的控制器。两者之间虽然实现效果相同,但是还是存在区别的:

        1)QLPreviewController可以一起浏览多个文件,而UIDocumentInteractionController一次只能浏览一个文件。

        2)使用QLPreviewController之前,需要导入QuickLook.framework(如下图),并遵守其数据源和代理方法。

导入QuickLook.framework

    2、实现步骤:

NSString *urlStr = [[NSBundle mainBundle] pathForResource:@"111.pdf" ofType: nil];

NSURL *url= [NSURL fileURLWithPath:urlStr];

if ([QLPreviewController canPreviewItem: (id)url]{

    QLPreviewController *qlVc = [[QLPreviewController alloc] init];

    qlVc.view.frame = CGRectMake(0,64,self.view.frame.size.width,self.view.frame.size.height-64);

    qlVc.delegate = self;

    qIVc.dataSource = self;

    qlVc.navigationController.navigationBar.userInteractionEnabled = YES;

    qlVc.view.userInteractionEnabled = YES;

    [self presentviewController:qlVc animated:YES completion:nil];

#pragma mark—QLPreviewController代理方法

- (NSInteger)numberOfPreviewItemsInPreviewController: (QLPreviewController *)controller{

    return 1;

}

-(id)previewController:(QLPreviewController *)controller previewItemAtIndex:(NSInteger)index{

return self.fileurl;

}

预览效果如下:

预览效果

你可能感兴趣的:(iOS 调用第三方文档打开文件)