我有一个基于文档的应用程序,其中包含自定义文件格式,UTI等设置如下:
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeExtensions</key>
<array>
<string>extension</string>
</array>
<key>CFBundleTypeIconFile</key>
<string>Icon</string>
<key>CFBundleTypeName</key>
<string>Custom Document</string>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>LSHandlerRank</key>
<string>Default</string>
<key>NSDocumentClass</key>
<string>MyDocument</string>
</dict>
</array>
<key>UTExportedTypeDeclarations</key>
<array>
<dict>
<key>UTTypeConformsTo</key>
<array>
<string>public.data</string>
</array>
<key>UTTypeDescription</key>
<string>Custom Document</string>
<key>UTTypeIconFile</key>
<string>Icon</string>
<key>UTTypeIdentifier</key>
<string>com.mycompany.appname</string>
<key>UTTypeReferenceURL</key>
<string></string>
<key>UTTypeTagSpecification</key>
<dict>
<key>com.apple.ostype</key>
<string>XXXX</string>
<key>public.filename-extension</key>
<array>
<string>extension</string>
</array>
</dict>
</dict>
</array>
<key>UTImportedTypeDeclarations</key>
<array/>
其中(我假设,根据我所读到的)是正确的方法。 除此之外,当我在任何保存的文件上运行mdls时,UTI列为:
kMDItemContentType = "com.apple.appname.document"
这很令人困惑,因为我已经从像TextEdit,iSpend和Sketch等示例应用程序的plists中复制并粘贴了条目,但都无济于事。
保存的文档具有正确的UTI尤为重要,因为它们需要一个依赖于正确UTI的自定义QuickLook生成器。
非常感谢任何帮助。 提前谢谢。
答案 0 :(得分:3)
你有没有做过以下事情:
1)在某些时候,将com.apple.appname.document
作为您的UTI类型,并且在那时,您在文件系统中创建了类型的自定义文档。
3)然后,您更改了应用中的UTI设置。
4)您正在查看在步骤1中创建的文件的信息,并且该文件自创建以来未发生更改?
如果是这样,请尝试使用终端touch
相关文件强制Spotlight重新索引,然后再看看。
否则,它也可能有助于确保删除应用程序的所有无关副本,然后重建启动服务数据库(您可以使用我编写的实用程序来执行此操作:Rebuild Launch Services Database。
一般情况下,您的Info.plist信息没问题,但我建议如下:
在UTExportedTypeDeclarations
下的UTTypeTagSpecification
中,如果您真的知道自己在做什么,则只需指定OSType(文件类型代码)。这意味着你当然没有使用类似'appe'
的类型,这些类型都是小写字母,因为它们是为Apple保留的。我知道你需要向Apple注册创建者代码(CFBundleSignature
s)(我自己做了几次),虽然我不确定文件类型,以及他们是否仍然这样做。如果您指定了一些任意文件类型代码,并且不了解过去30年中实际代码的使用情况,则存在与现有已定义类型冲突的风险。
将文档UTI类型更改为更具体的类型。像com.mycompany.appname.extension
。
然后更改您的文档CFBundleDocumentTypes
条目,删除CFBundleTypeExtensions
条目并添加LSItemContentTypes
,如下所示:
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>LSItemContentTypes</key>
<array>
<string>com.mycompany.appname.extension</string>
</array>
<key>CFBundleTypeIconFile</key>
<string>Icon</string>
<key>CFBundleTypeName</key>
<string>Custom Document</string>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>LSHandlerRank</key>
<string>Default</string>
<key>NSDocumentClass</key>
<string>MyDocument</string>
</dict>
</array>
然后,最后检查Info.plist中的任何键是否都没有被InfoPlist.strings
文件中的本地化版本覆盖,如果有的话。