我已经根据UIDocumentPickerViewController实现了文档,现在尝试在委托方法中从选中的文件中获取NSData,但是[[NSData alloc] initWithContentsOfURL:]返回0:
- (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驱动器的文档。
发布于 2014-08-27 12:00:54
问题是,实际上Page (*.pages)不是文件,而是文件夹。因此,当我尝试从文件夹路径获取NSData时,它返回零。
默认的Mail.app将文档附加为zip存档。
发布于 2016-04-26 18:59:47
在这里对iWork文件(.pages、.numbers、.key)的回答稍作阐述,这样其他人就不必再发现这个问题了。(这也适用于非iWork文件。)
如果要从iWork中提取iCloud文件,那么在获得有效的NSData对象之前,您需要考虑两个主要问题。( A)通过NSFileCoordinator对象(如@cescofry所述)和B的安全范围,iWork文件实际上是目录/包,而不是单个文件。您想要用于options的coordinateReadingItemAtURL:参数是NSFileCoordinatorReadingForUploading。这将在单个文件中读取,就像您使用了0一样,但会自动将目录转换为zip文件。去掉添加的.zip,您将得到一个有效的页面/数字/主题文件。(它也是有效的。)
[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选项的相关苹果文档在这里:参考文件/c/tdef/NSFile协调员
发布于 2014-12-11 11:35:46
需要通过文件协调器访问文档选择器的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];更多来自苹果文档
https://stackoverflow.com/questions/25520453
复制相似问题