附加从iCloud中文件选择器的iWork文件不起作用,因为他们没有目录文件(Attaching i

2019-10-21 04:22发布

将任何iWork的文件( PagesKeynoteNumbers )转换成NSDataUIDocumentPickerViewController似乎并不奏效,因为它们不是文件,而是目录。

这里是我的代码:

NSString *fileName = [[url path] lastPathComponent];
NSData *fileData = [[NSFileManager defaultManager] contentsAtPath:[docPickerUrl path]];
NSString *fileExtension = [docPickerUrl pathExtension];
NSString *UTI = (__bridge_transfer NSString *)UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, (__bridge CFStringRef)fileExtension, NULL);
NSString *contentType = (__bridge_transfer NSString *)UTTypeCopyPreferredTagWithClass((__bridge CFStringRef)UTI, kUTTagClassMIMEType);

FILEDATA永远是nil ,因为NSFileManager不能目录转换为数据。

我得到url- (void)documentPicker:(UIDocumentPickerViewController *)controller didPickDocumentAtURL:(NSURL *)url

Answer 1:

我这里有同样的问题: iOS8上:UIDocumentPickerViewController GET的NSData

解决的办法是iWork的文件添加为ZIP档案,最简单的方法是使用SSZipArchive库,也可作为可可豆荚:

pod 'SSZipArchive', '~> 0.3'


Answer 2:

我建议经历一个NSFileCoordinator对象,这是AFAIK需要访问的安全范围的文件,如通过Dropbox和iCloud中。 (取消对首次和下到最后一行在这种情况下,下面的代码。) options您想要NSFIleCoordinator的参数coordinateReadingItemAtURL:NSFileCoordinatorReadingForUploading 。 这将读取单个文件正常,但会自动打开目录为zip文件。 剥下.zip是在加入,你就会有一个有效的页/号/主题文件。 (这是它有效的了。)

- (void)documentPicker:(UIDocumentPickerViewController *)controller didPickDocumentAtURL:(NSURL *)url {
  //[url startAccessingSecurityScopedResource]; // Necessary for security-scoped files
  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];

     // iWork files will be in the form 'Filename.pages.zip'
     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]; // Necessary for security-scoped files
}

在这里NSFileCoordinator期权相关的苹果文档: https://developer.apple.com/library/ios/documentation/Foundation/Reference/NSFileCoordinator_class/#//apple_ref/c/tdef/NSFileCoordinatorReadingOptions



Answer 3:

你这个是行不通的,我已经试过压缩使用类似SSZipArchive或ZipArchive软件包,但得到一个崩溃。

这是你去哪儿我得这可能有助于激发一些想法。

- (void)documentPicker:(UIDocumentPickerViewController *)controller didPickDocumentAtURL:(NSURL *)url {
 if (controller.documentPickerMode == UIDocumentPickerModeImport) {
NSArray *dirContents = [[NSFileManager defaultManager] contentsOfDirectoryAtURL:url includingPropertiesForKeys:[NSArray arrayWithObject:NSURLNameKey] options:0 error:nil];

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *newDocDirectory = [paths objectAtIndex:0];

NSString *docDirectory = [dirContents objectAtIndex:0];
BOOL isDir=NO;
NSArray *subpaths;
NSString *exportPath = docDirectory;
NSFileManager *fileManager = [NSFileManager defaultManager];
if ([fileManager fileExistsAtPath:exportPath isDirectory:&isDir] && isDir){
    subpaths = [fileManager subpathsAtPath:exportPath];
}

NSString *archivePath = [newDocDirectory stringByAppendingString:@".zip"];

ZipArchive *archiver = [[ZipArchive alloc] init];
[archiver CreateZipFile2:archivePath];
for(NSString *path in subpaths)
{
    NSString *longPath = [exportPath stringByAppendingPathComponent:path];
    if([fileManager fileExistsAtPath:longPath isDirectory:&isDir] && !isDir)
    {
        NSLog(@"adding file %@", path);
        [archiver addFileToZip:longPath newname:path];
    }
}

NSData *documentData = [NSData dataWithContentsOfFile:archivePath];

//post documentDate as zip file to server

}}



文章来源: Attaching iWork documents from iCloud Document Picker does not work because they are directories not files