访问沙盒外文档UIDocumentPickerViewController

简介: 官方文档解析 官方文档:https://developer.apple.com/documentation/uikit/uidocumentpickerviewcontroller?language=objc UIDocumentPickerViewController有四种模式: 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的官方文档,常见列表

目录
相关文章
|
10天前
|
编译器 C++ Windows
程序环境的内容
程序环境的内容
|
6月前
|
安全 搜索推荐 数据库
什么是网站托管服务?网站托管服务的内容都包含哪些
网站托管服务是目前很多中小企业选择的外包服务之一,当然也依然有很多人对什么是网站托管服务并不了解,接下来小编为大家分享网站托管服务是指什么、都有哪些类型、什么企业适用以及具体有哪些服务内容,一起来看看吧。
245 0
什么是网站托管服务?网站托管服务的内容都包含哪些
|
7月前
|
XML 安全 数据格式
网页 视频作为背景(解决google浏览器无法访问本地资源的问题)
网页 视频作为背景(解决google浏览器无法访问本地资源的问题)
76 0
网页 视频作为背景(解决google浏览器无法访问本地资源的问题)
|
9月前
应用沙盒的结构
应用沙盒的结构
34 0
Confluence 6 升级自定义的站点和空间仔细测试你的修改
修改可能对 Confluence 的后续版本不兼容,当你对 Confluence 进行升级的时候,你应该总是对你自定义修改的模板文件进行仔细的测试来确定所有的修改对新版本的 Confluence 兼容。
769 0
|
安全 Android开发 API
安卓应用安全指南 4.3.2 创建/使用内容供应器 规则书
4.3.2 创建/使用内容供应器 规则书 原书:Android Application Secure Design/Secure Coding Guidebook 译者:飞龙 协议:CC BY-NC-SA 4.0 实现或使用内容供应器时,确保遵循以下规则。
1041 0
推荐文章
更多