我已根据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的文档。
答案 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];
的更多内容
答案 2 :(得分:2)
问题是实际的页面文档(* .pages)不是文件,而是文件夹。因此,当我尝试从文件夹路径获取NSData时,它返回nil。
默认Mail.app将文档附加为zip存档。