iCloud & NSFileWrapper: Showing as 2 different files in Settings

久未见 提交于 2019-12-04 20:51:08

问题


I have an app that uses a UIDocument that is NSFileWrapper based. My file wrapper is a directory named "XXX.cp", with two sub-files "photo.data" and "photo.metadata". It seems to save and load documents fine, however when I go to Settings\Manage Storage\Unknown the sub-files are listed separately:

I was expecting it to show "XXX.cp" instead of these two sub-files. I think I have the document UTI set up and exported properly:

And I think I am creating the file wrappers correctly (especially since it reads/writes fine):

- (void)encodeObject:(id<NSCoding>)object toWrappers:(NSMutableDictionary *)wrappers preferredFilename:(NSString *)preferredFilename {    
    @autoreleasepool {                
        NSMutableData * data = [NSMutableData data];    
        NSKeyedArchiver * archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];    
        [archiver encodeObject:object forKey:@"data"];    
        [archiver finishEncoding];   
        NSFileWrapper * wrapper = [[NSFileWrapper alloc] initRegularFileWithContents:data];    
        [wrappers setObject:wrapper forKey:preferredFilename];    
    }    
}        

- (id)contentsForType:(NSString *)typeName error:(NSError *__autoreleasing *)outError {        
    if (self.captionedPhotoMetadata == nil || self.captionedPhoto == nil) {    
        *outError = [[NSError alloc] initWithDomain:CaptionedPhotoErrorDomain code:CaptionedPhotoInvalidDocument userInfo:[NSDictionary dictionaryWithObjectsAndKeys:NSLocalizedString(@"Invalid document!", @""), NSLocalizedDescriptionKey, nil]];    
        return nil;        
    }    
    NSMutableDictionary * wrappers = [NSMutableDictionary dictionary];    
    [self encodeObject:self.captionedPhotoMetadata toWrappers:wrappers preferredFilename:METADATA_FILENAME];    
    [self encodeObject:self.captionedPhoto toWrappers:wrappers preferredFilename:DATA_FILENAME];       
    NSFileWrapper * fileWrapper = [[NSFileWrapper alloc] initDirectoryWithFileWrappers:wrappers];    
    return fileWrapper;        
}

But still no cigar. Anyone know what the problem is? Thanks!


回答1:


Figured this out. The problem was you need to have a filename extension of 3 letters. Mine had only 2 letters: ".cp". I switched it to ".cap" and it worked :P




回答2:


I didn't change my UTI to be three characters. It remains 11 characters. At first I was seeing the same issue Ray is reporting. I looked in the documentation more and found in "iOS Apps Programming Guide" - "App-Related Resources" under the paragraph of "Declaring Your App's Supported Document Types" that "For each document type you must provide the following information at a minimum:

  • A name
  • An icon
  • The file types

I had provided a name and the file types, but not an icon. So I whipped up the most awesome little document icon I could in 22 seconds, added it to my project, added it to the Target's Document Types, and on my iPad, Settings, iCloud, Manage Storage, MyApp, I only see the file wrapper name, NSMetadataItemDisplayNameKey style!




回答3:


I had the same issue, but my extension had three chars and I also had an icon. However, after reading this comment, I tried deleting the LSItemContentTypes in the CFBundleDocumentTypes section ("Types: com.razeware.captionedPhoto" in the second image under "document types") and it worked.

I also noticed that the WWDC demo "UIDocument and iCloud" has no LSItemContentType set as well. Seems like a huge bug to me, as the docs clearly state there should be a document type.



来源:https://stackoverflow.com/questions/10260299/icloud-nsfilewrapper-showing-as-2-different-files-in-settings

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!