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