我怀疑这是一个非常棘手的配置问题,我在我的Info.plist中的Document / UTI声明中出错了,但我已经尝试了几种方法,但还没有找到解决方案。
我有一个基于NSDocument的Mac应用程序,用Swift,Xcode 11编写,它读写一个带有后缀"mpxml“的自定义文档类型。

在大多数早期开发中,我没有定制的UTI类型标识符(标识符字段留空,项目默认),并且应用程序能够读写这些文件。
最近,我更改了一个完全限定的文档类型标识符和编辑器,这似乎是让我的文档图标显示在Finder中所必需的。我更改了代码中引用文档类型的所有位置,以使用这个完全限定的UTI。现在一切正常,除了打开面板(由默认的NSDocumentController openDocument运行)不再识别我的文件类型--所有带有"mpxml“后缀的文件现在在打开面板中都是灰色的,包括所有新创建的文件(保存面板可以很好地编写文档)。
有些事我试过了:
值得注意的是:关于CFBundleTypeExtensions的文档 (相关的文档类型plist键)表示,如果设置了LSItemContentTypes,就会忽略它,因为LSItemContentTypes是UTI标识符的密钥。但是,如果设置它破坏了文档类型的后缀从属关系,我希望UTI导出从属关系能够重新连接它。
另外:打开最近的文件也被破坏了,在试图打开最近保存的文档时,报告的错误是应用程序“不能打开这种类型的文件”。
我不确定绕过NSDocumentController的解决方案在这里是否有效,因为我不想搅乱它在幕后设置的文档实例/窗口/文件关联。
在这个应用程序中,要使自定义的UTI和扩展正确工作,缺少什么?
基于请求的更新是与此bug相关的额外Info.plist数据(这与上面截图中的XCode文档类型信息基本一致)。我现在已经创建了一个最小的示例应用程序,它复制了我将用于Apple bug报告的bug。
在没有自定义UTI声明的项目的原始形式中,Info.plist文档类型声明是:
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeExtensions</key>
<array>
<string>asdfg</string>
</array>
<key>CFBundleTypeIconFile</key>
<string></string>
<key>CFBundleTypeName</key>
<string>example document</string>
<key>CFBundleTypeOSTypes</key>
<array>
<string>CCdc</string>
</array>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>LSTypeIsPackage</key>
<integer>0</integer>
<key>NSDocumentClass</key>
<string>$(PRODUCT_MODULE_NAME).CCDocument</string>
</dict>
</array>此项目用于成功地读取和写入具有后缀.asdfg的非空文档.
然后,通过为这个扩展创建一个自定义UTI来更新Info.plist。此时,Info.plist如下(文档类型和UTI是惟一的更改):
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeExtensions</key>
<array/>
<key>CFBundleTypeIconFile</key>
<string></string>
<key>CFBundleTypeName</key>
<string>ccutibug document</string>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>LSItemContentTypes</key>
<array>
<string>com.mathaesthetics.ccutibug</string>
</array>
<key>LSTypeIsPackage</key>
<integer>0</integer>
<key>NSDocumentClass</key>
<string>$(PRODUCT_MODULE_NAME).CCDocument</string>
</dict>
</array>
<key>UTExportedTypeDeclarations</key>
<array>
<dict>
<key>UTTypeDescription</key>
<string>ccutibug document</string>
<key>UTTypeIdentifier</key>
<string>com.mathaesthetics.ccutibug</string>
<key>UTTypeTagSpecification</key>
<dict>
<key>com.apple.ostype</key>
<array>
<string>CCdc</string>
</array>
<key>public.filename-extension</key>
<array>
<string>asdfg</string>
</array>
</dict>
</dict>
</array>最初描述的相同症状发生在对最小测试项目进行此更改之后-- Open现在禁用了所有.asdfg文档,Open最近不再工作,但我仍然可以创建和保存这些文档。@catlan建议的干净重建加上ls寄存器修复仍然没有纠正它。
同样,我可以通过直接使用一个开放面板来确认,仅提供UTI并不允许打开面板来尊重扩展,只显式地提供扩展可以让我打开保存的文档,并且没有办法通过NSDocumentController处理开放面板或打开最近的菜单AFAIK来实现这一点。
发布于 2020-06-10 13:21:35
您的UTExportedTypeDeclarations条目缺少UTTypeConformsTo。这把钥匙是必需的。见统一类型标识符概念-一致性和声明新的统一类型标识符。
尽管自定义UTI可以符合任何UTI,但对于所有文件格式(如文档)的自定义UTI,public.data或com.apple.package必须位于一致性层次结构的根;
另外:
您只需要使用类型的直接“超类”声明一致性,因为一致性层次结构允许在标识符之间进行继承。也就是说,如果您声明您的标识符符合public.tiff标识符,那么它将自动符合层次结构中更高层的标识符,例如public.image和public.data。
<key>UTExportedTypeDeclarations</key>
<array>
<dict>
<key>UTTypeConformsTo</key>
<array>
<string>public.data</string>
</array>
<key>UTTypeDescription</key>
<string>ccutibug document</string>
<key>UTTypeIdentifier</key>
<string>com.mathaesthetics.ccutibug</string>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<array>
<string>asdfg</string>
</array>
</dict>
</dict>
</array>我还删除了com.apple.ostype,它在经典的Mac中使用,不需要新的文件类型。
并匹配public.filename-extension和CFBundleTypeExtensions
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeExtensions</key>
<array>
<string>asdfg</string>
</array>
<key>CFBundleTypeIconFile</key>
<string></string>
<key>CFBundleTypeName</key>
<string>ccutibug document</string>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>LSItemContentTypes</key>
<array>
<string>com.mathaesthetics.ccutibug</string>
</array>
<key>LSTypeIsPackage</key>
<false/>
<key>NSDocumentClass</key>
<string>$(PRODUCT_MODULE_NAME).CCDocument</string>
</dict>
</array>注意:我还将<integer>0</integer>更改为<false/>,以使其更具可读性。
调试
在开发过程中,更改UTI可能会混淆LaunchServices数据库。您可以尝试通过运行以下命令来重置它:
/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -kill -r -domain本地-domain system -domain用户
注意事项:确保您的系统上没有任何旧的开发工具,比如Xcode build文件夹或Xcode产品档案。这些可能会继续混淆LaunchServices数据库。
-dump选项有助于查看当前的UTI声明:
/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -dump
发布于 2021-01-07 15:38:03
我在开发第一个基于SwiftUI应用程序的应用程序时也遇到了同样的问题。NSDocumentController open命令不允许我选择自定义文档类型。我找到了一个与自定义文档类型的Apples文档相一致的解决方案。这个文档的问题是,您也发现了经常过时的文档,而我倾向于将所有的信息混合在一起。
正如前面提到的,关键是定义一个正确的“导出类型标识符”。在我的例子中,我遇到了一个额外的问题:我的文档格式是一个包,需要被系统确认为一个包。
决定性的事情是选择正确的“符合”条目(正是正确的!)它需要是系统声明的统一类型标识符之一(请参阅文档这里)。对我来说,这是"com.apple.package“。有趣的是,文件扩展名仅存在于“导出类型标识符”中。完成此操作后,NSDocumentController open命令允许我选择正确的文件(这些文件是正确识别为包的目录)。
在这里,完整的条目:

发布于 2022-05-02 11:00:31
它是2022年,Xcode 12和SwiftUI,我遇到了同样的事情,就像OP一样,我尝试了我能想到的所有东西,然后还有一些。
下面是对我有用的内容:-在Info设置中,我填写了文档类型和ExportedType标识符。
重要:-我最初将ImportedType添加到我的plist中,并不得不删除它才能工作。
-我宣布了一个UTType:
extension UTType {
static var myExtension: UTType {
UTType(exportedAs: "com.MyDomain.myAppName")
}
}(如果您在这里使用了作为导入函数的构造函数,它仍然可以工作,但是编译器-正确地-抱怨)
并将static var readableContentTypes: [UTType] { [.myExtension] }添加到我的文档中。
在运行应用程序时,读取、写入、恢复窗口:一切都是自动工作的。
https://stackoverflow.com/questions/62288573
复制相似问题