![](/img/trans.png)
[英]Google Drive & iOS8 UIDocumentPickerViewController - file grayed out
[英]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.