iOS8:UIDocumentPickerViewController获取NSData

时间:2014-08-27 06:39:46

标签: ios objective-c ios8

我已根据docs实现UIDocumentPickerViewController,现在尝试从委托方法中的已挑选文件中获取NSData,但[[NSData alloc] initWithContentsOfURL:]返回nil:

- (void)documentPicker:(UIDocumentPickerViewController *)controller didPickDocumentAtURL:(NSURL *)url{
    NSData* documentData = [[NSData alloc] initWithContentsOfURL:url];
    //documentData is nil
    documentData = [[NSData alloc] initWithContentsOfFile:[url path]];
    //documentData is still nil :(
}

我正在使用Xcode6 beta6,iPhone模拟器,文档选择器模式为UIDocumentPickerModeImport。 尝试检索保存到iCloude Drive的文档。

3 个答案:

答案 0 :(得分:7)

在@ cescofry上详细阐述了有关iWork文件(.pages,.numbers,.key)的一些内容,以便其他人不必重新发现问题。 (这也适用于非iWork文件。)

如果要从iCloud中提取iWork文件,则需要先担心两个主要问题才能获得有效的NSData对象。 A)通过NSFileCoordinator对象(由@cescofry覆盖)和B)的安全范围iWork文件实际上是目录/包而不是单个文件。您希望options的{​​{1}}参数为coordinateReadingItemAtURL:。这将读入单个文件,就像您使用NSFileCoordinatorReadingForUploading一样,但会自动将目录转换为zip文件。剥离添加的0,您将拥有有效的Pages / Numbers / Keynote文件。 (它也适用于它。)

.zip

此处有关NSFileCoordinator选项的相关Apple文档: Facebook example

答案 1 :(得分:4)

需要通过文件协调器访问文档选择器中的URL。还需要在范围内查看网址:

[url startAccessingSecurityScopedResource];

__block NSData *data

 NSFileCoordinator *coordinator = [[NSFileCoordinator alloc] init];
 NSError *error;
 [coordinator coordinateReadingItemAtURL:url options:0 error:&error byAccessor:^(NSURL *newURL) {
    data = [NSData dataWithContentsOfURL:url];
 }];

 [url stopAccessingSecurityScopedResource];

来自Apple documentation

的更多内容

答案 2 :(得分:2)

问题是实际的页面文档(* .pages)不是文件,而是文件夹。因此,当我尝试从文件夹路径获取NSData时,它返回nil。

默认Mail.app将文档附加为zip存档。