iOS8:UIDocumentPickerViewController获取NSData

我已经实现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的文档。

在@ cescofry的回答里详细介绍了iWork文件(.pages,.numbers,.key),这样其他人就不必重新发现问题了。 (这也适用于非iWork文件。)

如果您从iCloud提取iWork文件,则在获取有效的NSData对象之前,需要考虑两件事。 A)通过NSFileCoordinator对象的安全范围(由@cescofry覆盖)和B)iWork文件实际上是目录/捆绑包而不是单个文件。 coordinateReadingItemAtURL:options参数是NSFileCoordinatorReadingForUploading 。 这将读取单个文件,就像您使用0 ,但会自动将目录转换为zip文件。 剥离添加的.zip ,您将拥有一个有效的Pages / Numbers / Keynote文件。 (它也是有效的。)

 [url startAccessingSecurityScopedResource]; NSFileCoordinator *coordinator = [[NSFileCoordinator alloc] init]; NSError *error; __block NSData *fileData; [coordinator coordinateReadingItemAtURL:url options:NSFileCoordinatorReadingForUploading error:&error byAccessor:^(NSURL *newURL) { // File name for use in writing the file out later NSString *fileName = [newURL lastPathComponent]; NSString *fileExtension = [newURL pathExtension]; if([fileExtension isEqualToString:@"zip"]) { if([[[newURL URLByDeletingPathExtension] pathExtension] isEqualToString:@"pages"] || [[[newURL URLByDeletingPathExtension] pathExtension] isEqualToString:@"numbers"] || [[[newURL URLByDeletingPathExtension] pathExtension] isEqualToString:@"key"] ) { // Remove .zip if it is an iWork file fileExtension = [[newURL URLByDeletingPathExtension] pathExtension]; fileName = [[newURL URLByDeletingPathExtension] lastPathComponent]; } } NSError *fileConversionError; fileData = [NSData dataWithContentsOfURL:newURL options:NSDataReadingUncached error:&fileConversionError]; // Do something with the file data here } [url stopAccessingSecurityScopedResource]; 

相关Apple文档NSFileCoordinator选项在这里: https : //developer.apple.com/library/ios/documentation/Foundation/Reference/NSFileCoordinator_class/#//apple_ref/c/tdef/NSFileCoordinatorReadingOptions

问题是实际上Page文档(* .pages)不是文件,而是文件夹。 所以当我试图从文件夹path获取NSData时,它返回nil。

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

文档select器的URL需要通过文件协调器来访问。 进一步更多的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文档