美文网首页
iOS 文件选择

iOS 文件选择

作者: 宥落 | 来源:发表于2021-03-24 17:41 被阅读0次

    文件来源是从手机资源库获取(不包括沙盒文件),即iCould云盘。在iOS11之后系统自带的app文件中的内容就是访问iCould云盘获取到的,即使删除此APP也不会影响我们功能的使用

    使用自带的文件选择器UIDocumentPickerViewController,这个iOS8就可以使用了。展示效果如下:

    具体使用如下(不用引入任何头文件):

    添加代理
    <UIDocumentPickerDelegate, UIDocumentInteractionControllerDelegate>
    
    打开文件选择的控制器
    - (void)openDocumentPickerViewController{
        // 设置文件类型
        NSArray *documentTypes = @[@"public.content",
                                   @"public.text",
                                   @"public.source-code ",
                                   @"public.image",
                                   @"public.audiovisual-content",
                                   @"com.adobe.pdf",
                                   @"com.apple.keynote.key",
                                   @"com.microsoft.word.doc",
                                   @"com.microsoft.excel.xls",
                                   @"com.microsoft.powerpoint.ppt"];
        
        // 因为在Appdelegate中我设置了UIScrollViewContentInsetAdjustmentNever,这里需要修改为UIScrollViewContentInsetAdjustmentAutomatic,否则界面会上移
        if (@available(iOS 11, *)) {
            UIScrollView.appearance.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentAutomatic;
        }
        
        UIDocumentPickerViewController *documentPickerViewController = [[UIDocumentPickerViewController alloc] initWithDocumentTypes:documentTypes inMode:UIDocumentPickerModeOpen];
        documentPickerViewController.delegate = self;
        documentPickerViewController.modalPresentationStyle = UIModalPresentationFullScreen;
        [self presentViewController:documentPickerViewController animated:YES completion:nil];
    }
    
    实现代理
    #pragma mark 点击取消文件选择
    - (void)documentPickerWasCancelled:(UIDocumentPickerViewController *)controller{
        /// 设置回UIScrollViewContentInsetAdjustmentNever
        if (@available(iOS 11, *)) {
            UIScrollView.appearance.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
        }
    }
    
    #pragma mark 点击选择文件结果
    - (void)documentPicker:(UIDocumentPickerViewController *)controller didPickDocumentAtURL:(NSURL *)url {
        /// 设置回UIScrollViewContentInsetAdjustmentNever
        if (@available(iOS 11, *)) {
            UIScrollView.appearance.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
        }
        
        BOOL fileUrlAuthozied = [url startAccessingSecurityScopedResource];
        if(fileUrlAuthozied){
            NSFileCoordinator *fileCoordinator = [[NSFileCoordinator alloc] init];
            NSError *error;
            [fileCoordinator coordinateReadingItemAtURL:url options:0 error:&error byAccessor:^(NSURL *newURL) {
                NSLog(@"选择的文件地址=== %@",newURL.absoluteString);
                [HttpRequest uploadMediaWithType:uploadMediaType_Doc docUrl:newURL imageData:nil];
            }];
            [url stopAccessingSecurityScopedResource];
        }else{
            [self showToastTips:@"此文件不可用"];
        }
    }
    
    注意点

    这里有两个地方需要注意一下

    • 第一点:如果有在Appdelegate中设置过contentInsetAdjustmentBehavior的值为UIScrollViewContentInsetAdjustmentNever,在打开UIDocumentPickerViewController前一定要设置为UIScrollViewContentInsetAdjustmentAutomatic, 否则UIDocumentPickerViewController的内容会上移

    • 第二点:关于NSFileCoordinator,即文件协调工具。功能大致上就是iCould云盘中的文件都是受保护的,需要先获取到授权,才可以使用得到的url,否则你的调用会变得没有意义(fail)。虽然两次得到的URL是一样的,但注释中提到有改变初始url的可能 所以coordinateReadingItemAtURL还是必须要经过的一步

    • 第三点:调用startAccessingSecurityScopedResource一直失败,修改mode为UIDocumentPickerModeOpen

    最后,关于form请求可查看

    相关文章

      网友评论

          本文标题:iOS 文件选择

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