UTI和文件扩展名关联

时间:2011-05-15 15:16:01

标签: objective-c macos file-type uti

在我的应用程序中,我想要包含一个QuickLook插件,该插件读取其他应用程序也使用的非系统扩展(让我们在本例中使用RAR)。我在我的应用包的Info.plist中将扩展名声明为Exported UTI,如下所示:

<key>UTExportedTypeDeclarations</key>
<array>
    <dict>
        <key>UTTypeConformsTo</key>
        <array>
            <string>public.data</string>
            <string>public.archive</string>
            <string>com.rarlab.rar-archive</string>
        </array>
        <key>UTTypeDescription</key>
        <string>Custom RAR Archive</string>
        <key>UTTypeIdentifier</key>
        <string>com.my-company.rarx-archive</string>
        <key>UTTypeTagSpecification</key>
        <dict>
            <key>public.filename-extension</key>
            <array>
                <string>rarx</string>
            </array>
        </dict>
    </dict>
</array>

我还适当地导入了RAR UTI:

<key>UTImportedTypeDeclarations</key>
<array>
    <dict>
        <key>UTTypeConformsTo</key>
        <array>
            <string>public.data</string>
            <string>public.archive</string>
        </array>
        <key>UTTypeDescription</key>
        <string>RAR Archive</string>
        <key>UTTypeIconFile</key>
        <string>RAR</string>
        <key>UTTypeIdentifier</key>
        <string>com.rarlab.rar-archive</string>
        <key>UTTypeTagSpecification</key>
        <dict>
            <key>public.filename-extension</key>
            <array>
                <string>rar</string>
                <string>rarx</string>
            </array>
        </dict>
    </dict>
</array>

但是,在我运行它之后,RARX文件似乎永远不会与我的应用程序相关联。为了检查关联,我使用了mdls,如下所示:

mdls -name kMDItemContentTypeTree "/Users/Me/.../A File.rarx"
>>> kMDItemContentTypeTree = (
    "com.another-company.rarx-archive",
    "public.data",
    "public.item",
    "public.archive"
)

为什么我的UTI(com.my-company.rarx-archive)不出现在该列表中?我相信这导致我的Quick Look插件无法触发,因为文件与com.another-company.rarx-archive UTI相关联。我系统上的另一个应用程序就是使用它。使用调试输出运行qlmanage可以解决这个问题。

1 个答案:

答案 0 :(得分:1)

这里的一个问题是您尝试将相同的扩展名与两个不同的UTI相关联,而Launch Services无法处理这些UTI。导入的com.rarlab.rar-archive声明是正确的,它会将rar类型的所有文件分配给com.rarlab.rar-archive,这与预期的一样。

您已经不必要地声明了Exported声明,因为它尝试重新定义rar扩展名。您只需要使用Imported声明并使用QuickLook扩展中的com.rarlab-rar-archive来声明它可以使用的内容,而不是这样做。

只要其他应用程序没有声明QuickLook扩展,您应该很好地声明此配对并让它工作。但是,由于听起来其他应用程序已经为此特定UTI设置了QuickLook扩展,我认为您可能会遇到删除它的选项。我的经验是,相互冲突的QuickLook扩展程序是先到先得的。