使用自定义 UTI 删除 UIDocumentPicker 导入/导出

Posted

技术标签:

【中文标题】使用自定义 UTI 删除 UIDocumentPicker 导入/导出【英文标题】:Delete UIDocumentPicker import/export with custom UTIs 【发布时间】:2014-09-23 18:08:55 【问题描述】:

我有一个应用程序可以使用自定义文件(带有自定义扩展名/UTI)存储用户创建的内容,并希望它使用 UIDocumentPicker 支持 iCloud Drive。

1。 问题是,一旦文件被导入,它就会变灰,无法导入。 在尝试了几件事后,我发现问题出在 custum UTI 上。 如果我只是将文件扩展名更改为众所周知的扩展名,例如 pdf,它就可以工作。

我还使用下面的示例代码(只是选择一个文档,什么都不做)来测试。 如果我选择一个带有自定义扩展名的文件,它会在导入一次后变灰。 pdf 文件没问题 - 我可以一次又一次地导入它们。

我错过了什么吗?

2。 另一个问题是,如果我将文档类型指定为 @"public.composite-content",我可以在根目录中选择一个 pdf 文档,但无法访问包含 pdf 文件的文件夹。如果我使用 kUTTypePDF,我可以两者都做。 这是预期的行为,还是只是一个错误?


-(void)openDocumentPicker

    UIDocumentPickerViewController *vc = [[UIDocumentPickerViewController alloc] initWithDocumentTypes:@[@"public.composite-content"] inMode:UIDocumentPickerModeImport];
    vc.delegate = self;   
    vc.modalPresentationStyle = UIModalPresentationFormSheet;
    [self presentViewController:vc animated:YES completion:nil];


- (void)documentPicker:(UIDocumentPickerViewController *)controller didPickDocumentAtURL:(NSURL *)url 
    return;

【问题讨论】:

【参考方案1】:

如果您仍然有这个问题,或者其他人也面临同样的问题,这就是我的工作方式:

1) info.plst 中的 UTI 声明:

    <key>UTExportedTypeDeclarations</key>
    <array>
            <dict>
                    <key>UTTypeConformsTo</key>
                    <array>
                            <string>public.data</string>
                    </array>
                    <key>UTTypeDescription</key>
                    <string>Holiday backup file</string>
                    <key>UTTypeIdentifier</key>
                    <string>de.myDomain.foobar.alb</string>
                    <key>UTTypeTagSpecification</key>
                    <dict>
                            <key>public.filename-extension</key>
                            <array>
                                    <string>alb</string>
                            </array>
                            <key>public.mime-type</key>
                            <string>application/alb</string>
                    </dict>
            </dict>
    </array>
    <key>CFBundleDocumentTypes</key>
    <array>
            <dict>
                    <key>CFBundleTypeName</key>
                    <string>Holiday backup file</string>
                    <key>CFBundleTypeRole</key>
                    <string>Editor</string>
                    <key>LSHandlerRank</key>
                    <string>Owner</string>
                    <key>LSItemContentTypes</key>
                    <array>
                            <string>de.myDomain.foobar.alb</string>
                    </array>
            </dict>
    </array>

UTTypeConformsTo / public.data 是这里的重要部分。

2) UIDocumentPicker

     UIDocumentPickerViewController* dvc= [[UIDocumentPickerViewController alloc] initWithDocumentTypes:[NSArray arrayWithObject:@"de.myDomain.foobar.alb"] inMode:UIDocumentPickerModeImport];

因此,在上面的示例中,您使用 @"public.composite-content" 初始化了选择器,而您应该使用在 info.pls 文件中提供的正确标识符(在我的示例中为“de.myDomain.foobar.alb”)。

【讨论】:

以上是关于使用自定义 UTI 删除 UIDocumentPicker 导入/导出的主要内容,如果未能解决你的问题,请参考以下文章

在 UIDocumentPickerViewController 中显示自定义 UTI 的图标

UIDocumentPickerViewController initWithDocumentTypes 中的 iOS 自定义 UTI

带有 UIDocumentPickerViewController 的 iOS 自定义 UTI/文件类型

无法在 IOS 13 上导入具有自定义 UTI 扩展名的文件

安卓开发自定义线段的高度怎么修改

在使用 Apple 对 UTI 的定义时,“public.movi​​e”和“public.video”有啥不同?