自定义文件格式的"com.apple" UTI



我有一个基于文档的应用程序,具有自定义文件格式、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等示例应用程序的plist中复制和粘贴了条目,但都无济于事。

保存的文档具有正确的UTI尤为重要,因为它们需要自定义QuickLook生成器,该生成器依赖于正确的UTI。

非常感谢您的帮助。提前谢谢。

您曾经做过以下事情吗:

1) 在某个时刻,将com.apple.appname.document作为UTI类型,然后在文件系统中创建了您所属类型的自定义文档。

3) 然后,您更改了应用程序中的UTI设置。

4) 您正在查看在步骤1中创建的文件的信息,而该文件自创建以来没有更改?

如果是这样,请尝试使用Terminal来touch有问题的文件,以强制对其进行Spotlight重新索引,然后再看一眼。

否则,确保删除应用程序的所有无关副本,然后重建启动服务数据库(你可以使用我写的一个实用程序来完成这项工作:重新构建启动服务数据库。

一般来说,你的Info.plist信息是可以的,尽管我建议如下:

  • UTTypeTagSpecification下的UTExportedTypeDeclarations中,只有当您真正知道自己在做什么时,才指定OSType(文件类型代码)。这意味着你当然不会使用像'appe'这样全是小写字母的类型,因为它们是为苹果保留的。我知道你被要求向苹果公司注册创建者代码(CFBundleSignature s)(我自己也做过几次),尽管我不确定文件类型,也不确定他们是否仍在这样做。如果您指定了一些任意的文件类型代码,但不了解过去30年中实际使用的代码,则可能会与现有定义的类型发生冲突。

  • 更改您的文档UTI类型,使其更适合您的类型。类似com.mycompany.appname.extension

然后通过删除CFBundleTypeExtensions条目并添加LSItemContentTypes来更改文档CFBundleDocumentTypes条目,如下所示:

<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文件中的本地化版本覆盖(如果您有)。

最新更新