美文网首页
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