访问沙盒外文档UIDocumentPickerViewController

简介: 官方文档解析官方文档:https://developer.apple.com/documentation/uikit/uidocumentpickerviewcontroller?language=objcUIDocumentPickerViewController有四种模式:Import an external document:用户选择一个外部文档,文档选择器拷贝该文档到应用沙盒,不会修改源文档。

官方文档解析

官方文档:https://developer.apple.com/documentation/uikit/uidocumentpickerviewcontroller?language=objc

UIDocumentPickerViewController有四种模式:

  • Import an external document:用户选择一个外部文档,文档选择器拷贝该文档到应用沙盒,不会修改源文档。
  • Export a local document:文档选择器拷贝文档到一个外部路径,不会修改源文档。
  • Open an external document:打开一个外部文档,用户可以修改该文档。
  • Move a local document:拷贝文档到外部路径,同时可以修改该拷贝。

操作外部文件注意事项

  • open与move操作会提供外部文件的security-scoped URL 。调用startAccessingSecurityScopedResource开始访问,访问完成调用stopAccessingSecurityScopedResource
  • 使用NSFileCoordinator来操作外部文件
  • 使用NSFilePresenter来展示外部文件内容
  • 不要存储security-scoped URL

调用Demo

展示文件选择

- (void)presentDocumentPicker {
    NSArray *types = @[]; // 可以选择的文件类型
    UIDocumentPickerViewController *documentPicker = [[UIDocumentPickerViewController alloc] initWithDocumentTypes:types inMode:UIDocumentPickerModeOpen];
    documentPicker.delegate = self;
    documentPicker.modalPresentationStyle = UIModalPresentationFullScreen;
    [self presentViewController:documentPicker animated:YES completion:nil];
}

用户选择文件回调

- (void)documentPicker:(UIDocumentPickerViewController *)controller didPickDocumentAtURL:(NSURL *)url {
    BOOL canAccessingResource = [url startAccessingSecurityScopedResource];
    if(canAccessingResource) {
        NSFileCoordinator *fileCoordinator = [[NSFileCoordinator alloc] init];
        NSError *error;
        [fileCoordinator coordinateReadingItemAtURL:url options:0 error:&error byAccessor:^(NSURL *newURL) {
            NSData *fileData = [NSData dataWithContentsOfURL:newURL];
            NSArray *arr = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
            NSString *documentPath = [arr lastObject];
            NSString *desFileName = [documentPath stringByAppendingPathComponent:@"myFile"];
            [fileData writeToFile:desFileName atomically:YES];
            [self dismissViewControllerAnimated:YES completion:NULL];
        }];
        if (error) {
            // error handing
        }
    } else {
        // startAccessingSecurityScopedResource fail
    }
    [url stopAccessingSecurityScopedResource];
}

文件类型定义

initWithDocumentTypes:inMode:中,types需要传入一个uniform type identifiers (UTIs)数组。关于UTIs的官方文档,常见列表

目录
相关文章
|
iOS开发
iOS 富文本添加点击事件
iOS 富文本添加点击事件
1891 0
iOS 富文本添加点击事件
|
缓存 Dart JavaScript
flutter版本控制工具 `FVM`
文章目录 FVM 切换VSCode 的Flutter版本 在windows上安装fvm 方法一:先安装 choco 检查安装是否成功 常用指令 接下来安装fvm 方法二:pub方式安装 fvm VSCode配置 安卓studio Flutter版本切换 项目 缓存目录 列出配置 设置缓存路径 配置 常用命令 安装 删除 列出 releases doctor 路由 配置全局版本 项目多个选项 针对不用flavor版本 切换flavor版本 查看flavor 常见问题 运行 FVM 时内核二进制文件无效或 sdk 哈希无效 PATH 中 Windows 的环境变量顺序 找不到命令“pub”
1289 1
flutter版本控制工具 `FVM`
|
开发者
ArkTS组件继承的高级用法
本文详细介绍了ArkTS中组件继承的高级用法,涵盖继承的概念、基本用法、多态、接口继承和抽象类的使用。通过具体示例,展示了如何在HarmonyOS应用开发中利用继承实现代码复用、功能扩展和模块化设计,提升开发效率和应用质量。
607 3
|
iOS开发
如何找到Xcode中下载的Provisioning Profile文件
如何找到Xcode中下载的Provisioning Profile文件
1875 1
|
Android开发 iOS开发
ios后台播放声音的三种实现方式
ios后台播放声音的三种实现方式
1671 1
|
图形学 iOS开发 Android开发
从Unity开发到移动平台制胜攻略:全面解析iOS与Android应用发布流程,助你轻松掌握跨平台发布技巧,打造爆款手游不是梦——性能优化、广告集成与内购设置全包含
【8月更文挑战第31天】本书详细介绍了如何在Unity中设置项目以适应移动设备,涵盖性能优化、集成广告及内购功能等关键步骤。通过具体示例和代码片段,指导读者完成iOS和Android应用的打包与发布,确保应用顺利上线并获得成功。无论是性能调整还是平台特定的操作,本书均提供了全面的解决方案。
581 0
NSNumber、NSString之间的相互转换
NSNumber、NSString之间的相互转换
334 0
|
iOS开发
iOS下载文件保存到手机文件指定目录
iOS下载文件保存到手机文件指定目录
1563 0
|
缓存 iOS开发
iOS LaunchScreen.storyboard 启动页设置图片不显示
iOS LaunchScreen.storyboard 启动页设置图片不显示
672 0
|
JavaScript
dyld: Library not loaded:解决办法
dyld: Library not loaded:解决办法
935 1