下载文件并且保存文件到手机文件指定目录,实现方法如下:
@interface ViewController()<UIDocumentInteractionControllerDelegate,UIDocumentPickerDelegate>
@end
@implementation ViewController
@end
//下载文件
- (void)downloadFile{
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];
NSURL *URL = [NSURL URLWithString:self.url]; //文件下载地址
NSURLRequest *request = [NSURLRequest requestWithURL:URL];
weakify(self);
NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:request progress:^(NSProgress *downloadProgress){
dispatch_async(dispatch_get_main_queue(), ^{
self.downloadProgress = downloadProgress.fractionCompleted; //下载进度
});
} destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
weakSelf.fileName = response.suggestedFilename; //文件名
weakSelf.fileSize = [self getFileSize:response.expectedContentLength]; //文件大小
NSURL *documentsDirectoryURL = [[NSFileManager defaultManager]URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:NO error:nil];
NSURL *url = [documentsDirectoryURL URLByAppendingPathComponent:weakSelf.fileName]; //文件位置
return url;
} completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
//下载完成
weakSelf.filePathURL = filePath; //文件位置
}];
[downloadTask resume];
}
//保存文件到手机文件指定目录
- (void)saveFileToPhone {
UIDocumentPickerViewController *documentPicker = [[UIDocumentPickerViewController alloc] initWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"file://%@",self.filePathURL]] inMode:UIDocumentPickerModeExportToService];
documentPicker.delegate = self;
documentPicker.modalPresentationStyle = UIModalPresentationFormSheet;
[self presentViewController:documentPicker animated:YES completion:nil];
}
#pragma mark - UIDocumentInteractionControllerDelegate
-(UIViewController*)documentInteractionControllerViewControllerForPreview:(UIDocumentInteractionController*)controller{
return self;
}
-(UIView*)documentInteractionControllerViewForPreview:(UIDocumentInteractionController*)controller {
return self.view;
}
-(CGRect)documentInteractionControllerRectForPreview:(UIDocumentInteractionController*)controller {
return self.view.frame;
}
#pragma mark - UIDocumentPickerDelegate
- (void)documentPicker:(UIDocumentPickerViewController *)controller didPickDocumentsAtURLs:(NSArray <NSURL *>*)urls {
//保存成功
}
- (void)documentPickerWasCancelled:(UIDocumentPickerViewController *)controller{
//取消保存
}
注:
UIDocumentPickerViewController有四种模式:
1 typedef NS_ENUM(NSUInteger, UIDocumentPickerMode) {
2 UIDocumentPickerModeImport,
3 UIDocumentPickerModeOpen,
4 UIDocumentPickerModeExportToService,
5 UIDocumentPickerModeMoveToService
6 } API_DEPRECATED("Use appropriate initializers instead",ios(8.0,14.0)) API_UNAVAILABLE(tvos);
UIDocumentPickerModeImport:用户选择一个外部文件,文件选择器拷贝该文件到应用沙盒,不会修改源文件。
UIDocumentPickerModeOpen:打开一个外部文件,用户可以修改该文件。
UIDocumentPickerModeExportToService:文件选择器拷贝文件到一个外部路径,不会修改源文件。
UIDocumentPickerModeMoveToService:拷贝文件到外部路径,同时可以修改该拷贝。