iOS之文档借用系统扩展第三方软甲打开或共享

注意:
1.UIDocumentInteractionController需要声明成属性,避免过早释放
2.本地文件的路径使用[NSURL fileURLWithPath:filePath]

视图控制器层

@interface GKAttachmentPreviewController ()

@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;
    }
}

你可能感兴趣的:(iOS之文档借用系统扩展第三方软甲打开或共享)