产品需求 实现PDF文件下载既能在线浏览 又能从手机的文件夹打开。
首先实现在线浏览有很多方法。如 自定义VC 与view实现 或者 UIWebView / WKWebView 或者利用系统自带的UIDocumentPickerViewController 都可以实现,但是要实现在手机的文件里打开,这个是第一次遇到,之前没有做过这方面的需求,于是有了调研。
首先想到的是 给用户文件下载的URL 在Safari操作。这是基于iPhone手机本身的机制。但显然这是不满足产品需求的,于是查资料,看到了系统自带的UIDocumentInteractionController
UIDocumentInteractionController
主要作用
1).预览类似pdf、doc、ppt等类型文件的类。
2).可以将用户接收到的文件分享到用户手机上的其他App中。
使用方法
```
@property (nonatomic, strong) UIDocumentInteractionController *DIController;
1)签代理 UIDocumentInteractionControllerDelegate
2)初始化
NSString*load_url = @""; //下载完成后的URL
self.DIController = [UIDocumentInteractionController interactionControllerWithURL:[NSURL URLWithString:load_url]];
self.DIController.delegate=self;
[self.DIController presentPreviewAnimated:YES];
3)实现代理方法
#pragma mark - UIDocumentInteractionControllerDelegate
- (UIViewController *)documentInteractionControllerViewControllerForPreview:(UIDocumentInteractionController *)controller {
return self.downloadVC;
}
- (UIView*)documentInteractionControllerViewForPreview:(UIDocumentInteractionController*)controller {
return self.downloadVC.view;
}
- (CGRect)documentInteractionControllerRectForPreview:(UIDocumentInteractionController*)controller {
return self.downloadVC.view.frame;
}
```
下载文件的方法
#pragma mark- 下载文件
```
-(NSURLSessionTask *)downloadWithURL:(NSString *)URL
fileDir:(NSString*)fileDir
progress:(void(^)(NSProgress*progress))progress
success:(void(^)(NSString*filePath))success
failure:(void(^)(NSError*error))failure{
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:URL]];
NSURLSessionDownloadTask*downloadTask = [managerdownloadTaskWithRequest:requestprogress:^(NSProgress*_NonnulldownloadProgress) {
//下载进度
progress ? progress(downloadProgress) :nil;
TSLog(@"下载进度:%.2f%%",100.0*downloadProgress.completedUnitCount/downloadProgress.totalUnitCount);
}destination:^NSURL*_Nonnull(NSURL*_NonnulltargetPath,NSURLResponse*_Nonnullresponse) {
//拼接缓存目录
NSString *downloadStr = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] ;
//拼接文件路径
NSString*filePath = [downloadStrstringByAppendingPathComponent:fileDir];
return[NSURLfileURLWithPath:filePath];
}completionHandler:^(NSURLResponse*_Nonnullresponse,NSURL*_NullablefilePath,NSError*_Nullableerror) {
success&&filePath ? success(filePath.absoluteString/** NSURL->NSString*/) :nil;
failure && error ? failure(error) :nil;
}];
//开始下载
[downloadTaskresume];
returndownloadTask;
}
```
此时就完成PDF文件下载完后预览 如下图
点击右上角的按钮会弹出如下图的弹框 点击save to files 就可以把下载好的文件存储到手机的文件夹里
当然这只是一个 大概的实现过程,其中有些细节可以根据产品需求来完善。如下载的名称 存储在文件夹里可以归类等等