繁体   English   中英

iOS8:UIDocumentPickerViewController获取NSData

[英]iOS8: UIDocumentPickerViewController get 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];

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

需要通过文件协调器访问文档选择器中的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文档

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM