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

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

作者: MI移动 | 来源:发表于2017-08-02 15:35 被阅读0次

    注意:
    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;
        }
    }
    

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/vrxylxtx.html