iOS8:UIDocumentPickerViewController获取NSData

Pon*_*onf 3 objective-c ios ios8

我已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 :(
}
Run Code Online (Sandbox Code Playgroud)

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

Map*_*ple 7

详细阐述@ cescofry在这里对iWork文件(.pages,.numbers,.key)的回答,以便其他人不必重新发现问题.(这也适用于非iWork文件.)

如果您从iCloud中提取iWork文件,则需要先担心两个主要问题才能获得有效的NSData对象.A)通过NSFileCoordinator对象(由@cescofry覆盖)和B)的安全范围iWork文件实际上是目录/包而不是单个文件.options你想要的参数coordinateReadingItemAtURL: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];
Run Code Online (Sandbox Code Playgroud)

有关NSFileCoordinator选项的相关Apple文档,请访问:https: //developer.apple.com/library/ios/documentation/Foundation/Reference/NSFileCoordinator_class/#//apple_ref/c/tdef/NSFileCoordinatorReadingOptions