前言:打开预览pdf、ppt、excel、word、tet、rtf、csv格式的文件有两种一方,一种是利用 UIWebView或者WKWebView 来直接打开,另一种就是利用
QLPreviewController来打开,但是现在这种方法只能打开本地文件,也就是说如果您是链接,那就需要将文件先下载下来,本文的重点主要讲述第二种方法。
步骤:
1、首先需要判断文件是否需要下载
#pragma mark 判断是否需要下载- (void)isLoading{NSString *urlStr = _urlStr;NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES) objectAtIndex:0];NSString *path = [cachesPath stringByAppendingString:[NSString stringWithFormat:@"/%lu.%@",(unsigned long)[urlStr hash],urlStr.pathExtension]];_path = path;NSData *data = [NSData dataWithContentsOfFile:path];if (data == nil) {[self writeToCacheWithUrl:urlStr];}[self addPreview];}
2、是否需要写入缓存
#pragma mark 写入缓存- (void)writeToCacheWithUrl:(NSString *)urlStr{NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:[urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]];//创建文件管理器NSFileManager *fileManager = [NSFileManager defaultManager];//获取document路径NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask, YES) objectAtIndex:0];[fileManager createDirectoryAtPath:[cachesPath stringByAppendingString:@"/Caches"] withIntermediateDirectories:YES attributes:nil error:nil];//写入路径NSString *path = [cachesPath stringByAppendingString:[NSString stringWithFormat:@"/%lu.%@",(unsigned long)[urlStr hash],urlStr.pathExtension]];[data writeToFile:path atomically:YES];}
3、接下来就是进入预览界面
- (void)addPreview{QLPreviewController *qlPC = [[QLPreviewController alloc] init];qlPC.view.frame = CGRectMake(0, 64, self.view.width, self.view.height - 64);qlPC.dataSource = self;qlPC.delegate = self;[self addChildViewController:qlPC];[self.view addSubview:qlPC.view];}
4、遵循 < QLPreviewControllerDataSource , QLPreviewControllerDelegate >方法
#pragma mark - previewControllerDataSource- (NSInteger)numberOfPreviewItemsInPreviewController:(QLPreviewController *)controller{return 1;}- (id<QLPreviewItem>)previewController:(QLPreviewController *)controller previewItemAtIndex:(NSInteger)index{//文件路径,也就是已经下载后的路径return [NSURL fileURLWithPath:_path];}
5、预览完文件,可能需要进行分享,以下以微信分享为例
#pragma mark 分享- (void)share{WXMediaMessage *message = [WXMediaMessage message];message.title = self.navigationItem.title;WXFileObject *fileObject = [WXFileObject object];fileObject.fileExtension = _urlStr.pathExtension;fileObject.fileData = [NSData dataWithContentsOfFile:_path];message.mediaObject = fileObject;SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init];req.bText = NO;req.message = message;req.scene = 0;[WXApi sendReq:req];}