【问题标题】:iCloud & NSFileWrapper: Showing as 2 different files in SettingsiCloud 和 NSFileWrapper:在设置中显示为 2 个不同的文件
【发布时间】:2012-05-02 20:52:13
【问题描述】:

我有一个使用基于 NSFileWrapper 的 UIDocument 的应用程序。我的文件包装器是一个名为“XXX.cp”的目录,有两个子文件“photo.data”和“photo.metadata”。似乎可以很好地保存和加载文档,但是当我转到 Settings\Manage Storage\Unknown 时,子文件会单独列出:

我期待它显示“XXX.cp”而不是这两个子文件。我想我已经正确设置和导出了文档 UTI:

而且我认为我正确地创建了文件包装器(特别是因为它读/写很好):

- (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;        
}

但仍然没有雪茄。有谁知道问题是什么?谢谢!

【问题讨论】:

    标签: ios icloud nsfilewrapper


    【解决方案1】:

    想通了。问题是您需要有 3 个字母的文件扩展名。我的只有 2 个字母:“.cp”。我将它切换到“.cap”并且它起作用了:P

    【讨论】:

    • 我也遇到过这个问题,我的文件扩展名有 3 个字母。我将扩展名 .tfx 用于基于目录的文件包装器。我最近决定将我的包装文件放在我称为 SyncDocuments 的无处不在的容器中的一个单独文件夹中。这样,单个文件就不会显示给用户。但这是我真正想要的,因为我的 UIDocument 子类文件不适合用户直接交互。
    • 我遇到了完全相同的问题,但我的文件扩展名包含三个字母(和一个图标)。我认为这是导出的 UTI 中的一些可疑设置。我的直觉是,iCloud 中正在进行某种缓存,并且将扩展名从 .cp 更改为 .cap 修复了一些损坏的问题。
    • 嘿,雷喜欢你的教程,但我仍然遇到问题。我可以让我的包装器显示为包,但是我的 nsmetadataquery 看不到它们。如果我用 * 搜索所有文档,则不是事件。我的第一个文档类型有效,但我的图像无效
    • 还有一件事,我使用的是 xcode 5,在 iOS 7 的模拟器上可以看到带有扩展名的包,在设备上可以看到包的内容。
    【解决方案2】:

    我没有将我的 UTI 更改为三个字符。它仍然是 11 个字符。起初,我看到了 Ray 报告的相同问题。我查看了更多文档,并在“声明您的应用程序支持的文档类型”段落下的“iOS 应用程序编程指南”-“应用程序相关资源”中找到“对于每种文档类型,您必须至少提供以下信息:

    • 一个名字
    • 图标
    • 文件类型

    我提供了名称和文件类型,但没有提供图标。因此,我在 22 秒内创建了最棒的小文档图标,将其添加到我的项目中,将其添加到目标的文档类型中,在我的 iPad、设置、iCloud、管理存储、MyApp 上,我只看到文件包装器名称,NSMetadataItemDisplayNameKey 样式!

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题,但我的扩展程序有三个字符,而且我还有一个图标。但是,在阅读this comment 之后,我尝试删除 CFBundleDocumentTypes 部分中的 LSItemContentTypes(“文档类型”下第二张图像中的“Types: com.razeware.captionedPhoto” ) 并且它起作用了。

      我还注意到 WWDC 演示“UIDocument 和 iCloud”也没有设置 LSItemContentType。 对我来说似乎是一个巨大的错误,因为the docs 明确指出应该有一个文档类型。

      【讨论】:

        猜你喜欢
        • 2013-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-15
        • 2012-09-08
        • 2015-09-23
        • 1970-01-01
        相关资源
        最近更新 更多