文件来源是从手机资源库获取(不包括沙盒文件),即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请求可查看