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

时间:2011-06-14 05:26:53

标签: cocoa plist document quicklook 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等示例应用程序的plists中复制并粘贴了条目,但都无济于事。

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

非常感谢任何帮助。 提前谢谢。

1 个答案:

答案 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文件中的本地化版本覆盖,如果有的话。