訪問沙盒外文檔UIDocumentPickerViewController

官方文檔解析

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

UIDocumentPickerViewController有四種模式:

  • Import an external document:用戶選擇一個外部文檔,文檔選擇器拷貝該文檔到應(yīng)用沙盒,不會修改源文檔。
  • Export a local document:文檔選擇器拷貝文檔到一個外部路徑,不會修改源文檔。
  • Open an external document:打開一個外部文檔,用戶可以修改該文檔。
  • Move a local document:拷貝文檔到外部路徑,同時可以修改該拷貝。

操作外部文件注意事項

  • open與move操作會提供外部文件的security-scoped URL 。調(diào)用startAccessingSecurityScopedResource開始訪問,訪問完成調(diào)用stopAccessingSecurityScopedResource
  • 使用NSFileCoordinator來操作外部文件
  • 使用NSFilePresenter來展示外部文件內(nèi)容
  • 不要存儲security-scoped URL

調(diào)用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];
}

用戶選擇文件回調(diào)

- (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)數(shù)組。關(guān)于UTIs的官方文檔,常見列表


歡迎關(guān)注我的博客

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容