注意:
1.UIDocumentInteractionController
需要声明成属性,避免过早释放
2.本地文件的路径使用[NSURL fileURLWithPath:filePath]
视图控制器层
@interface GKAttachmentPreviewController ()<UIWebViewDelegate,UIDocumentInteractionControllerDelegate>
@property (strong, nonatomic)UIWebView *webView;
/**
系统扩展(必须写成属性,避免过早释放引起的崩溃)
*/
@property (strong, nonatomic)UIDocumentInteractionController *documentController;
/**
本地附件地址
*/
@property (copy, nonatomic)NSURL *localAttachmentUrl;
@end
@implementation GKAttachmentPreviewController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = kWhiteColor;
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc]initWithImage:[UIImage imageNamed:@"systemShare"] style:UIBarButtonItemStylePlain target:self action:@selector(openSystemShare)];
self.navigationItem.rightBarButtonItem.enabled = NO;
/// 下载附件
[self downAttachment];
}
#pragma mark - 打开系统分享
- (void)openSystemShare{
if (!self.localAttachmentUrl) {
return ;
}
if (!self.documentController) {
self.documentController = [UIDocumentInteractionController interactionControllerWithURL:self.localAttachmentUrl];
}
self.documentController.URL = self.localAttachmentUrl;
/// 打开系统扩展页面
[self.documentController presentOpenInMenuFromRect:self.view.bounds inView:self.view animated:YES];
}
#pragma mark - 下载附件
- (void)downAttachment{
MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
hud.mode = MBProgressHUDModeDeterminateHorizontalBar;
hud.labelText = @"下载附件中";
__weak __typeof(self) weakSelf = self;
[GKAttachmentMG downAttachmentWithUrl:self.attachmentUrlStr progress:^(NSProgress *progress) {
dispatch_async(dispatch_get_main_queue(), ^{
hud.progress = progress.fractionCompleted;
});
} success:^(id result) {
weakSelf.navigationItem.rightBarButtonItem.enabled = YES;
#warning 文件路径使用[NSURL fileURLWithPath:path]
weakSelf.localAttachmentUrl = [NSURL fileURLWithPath:[result absoluteString]];
dispatch_async(dispatch_get_main_queue(), ^{
[hud hide:YES];
if ([GKAttachmentMG attachmentCanOpenOnWebView:[result absoluteString]]) {
[weakSelf.webView loadRequest:[NSURLRequest requestWithURL:result]];
}else{
[weakSelf openSystemShare];
}
});
} fail:^(id error) {
dispatch_async(dispatch_get_main_queue(), ^{
[hud hide:YES];
});
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"提示" message:@"附件下载出错,请稍后重试" preferredStyle:UIAlertControllerStyleAlert];
[alertController addAction:[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil]];
[alertController addAction:[UIAlertAction actionWithTitle:@"重试" style:UIAlertActionStyleDestructive handler:^(UIAlertAction * _Nonnull action) {
[weakSelf downAttachment];
}]];
[weakSelf.navigationController presentViewController:alertController animated:YES completion:nil];
}];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
#pragma mark - lazyload
- (UIWebView *)webView{
if (!_webView) {
_webView = [[UIWebView alloc]init];
_webView.delegate = self;
_webView.multipleTouchEnabled = YES;
_webView.scalesPageToFit = YES;
[self.view addSubview:_webView];
[_webView mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(self.view);
}];
}
return _webView;
}
附件文件下载缓存管理
#pragma mark - 判断附件是否可用浏览器打开
- (BOOL)attachmentCanOpenOnWebView:(NSString *)fileUrl{
// 附件文件类型
NSString *fileType = [fileUrl pathExtension];
NSArray *imgTypes = @[@"png",@"jpg",@"jpeg",@"gif"];
NSArray *officeTypes = @[@"doc",@"docx",@"ppt",@"pptx",@"xls",@"xlsx",@"pdf",@"txt"];
if ([imgTypes containsObject:fileType]) {
// 图片文件类型
return YES;
}else if([officeTypes containsObject:fileType]){
// 办公文件类型
return YES;
}else{
// 未知文件类型
return NO;
}
}
#pragma mark - 下载附件
- (void)downAttachmentWithUrl:(NSString *)url progress:(ProgressBlock)progress success:(SuccessBlock)success fail:(FailBlock)fail{
NSURL *cacheFileUrl = [self checkCacheFileWithFileUrl:url];
if (cacheFileUrl) {
success(cacheFileUrl);
}else{
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
// 获得网络管理者
AFURLSessionManager *manager = [[AFURLSessionManager alloc]initWithSessionConfiguration:configuration];
// 创建请求对象
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]];
NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) {
progress(downloadProgress);
} destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
// 告诉服务器下载的文本保存的位置在那里
NSString *path = [NSString stringWithFormat:@"%@/%@/attachments/%@",kDocumentPath,[EnvironmentVariable getUserID],response.suggestedFilename];
return [NSURL fileURLWithPath:path];
} completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {
if (error) {
fail(error);
}else{
success(filePath);
}
}];
[downloadTask resume];
}
}
#pragma mark 检查附件本地缓存
- (NSURL *)checkCacheFileWithFileUrl:(NSString *)fileUrl{
NSString *fileName = [fileUrl lastPathComponent];
// 本地文件路径
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *fileFolderPath = [NSString stringWithFormat:@"%@/%@/attachments",kDocumentPath,[EnvironmentVariable getUserID]];
// 如果存在附件缓存文件夹,则创建
if (![fileManager fileExistsAtPath:fileFolderPath]) {
[fileManager createDirectoryAtPath:fileFolderPath withIntermediateDirectories:YES attributes:nil error:nil];
}
NSString *filePath = [fileFolderPath stringByAppendingPathComponent:fileName];
/* 判断是否有缓存文件 */
if ([fileManager fileExistsAtPath:filePath]) {
return [NSURL URLWithString:filePath];
}else{
return nil;
}
}