7

我有一个打开办公文件(.doc、.xls 等)的 Mac 应用程序,我需要为这些支持的文件显示自定义图标。我曾经通过在其中添加支持的 UTI 类型CFBundleDocumentTypes并分配我的自定义 icns 图标来实现。还将我的应用程序设置为打开这些文件类型的默认应用程序。

现在这种方法在 macOS Catalina 测试版之前完美运行,即使 Microsoft 应用程序与我的应用程序一起出现。在 macOS Catalina Beta 版以后,我看到我的应用程序图标代替了所有文件图标。

我尝试清除图标缓存,甚至重新启动 Finder,但无济于事。后来我什至尝试在UTExportedTypeDeclarationsand下添加 UTI 类型UTImportedTypeDeclarations

这是 Catalina Beta 的错误吗?或者我能做的任何事情来让这个工作。

我的 plistUTExportedTypeDeclarations看起来像这样。UTImportedTypeDeclarationsCFBundleDocumentTypes具有相似的值。

<key>UTExportedTypeDeclarations</key>
<array>
    <dict>
        <key>UTTypeConformsTo</key>
        <array>
            <string>org.openxmlformats.spreadsheetml.sheet</string>
            <string>org.openxmlformats.openxml</string>
            <string>public.composite-content</string>
        </array>
        <key>UTTypeDescription</key>
        <string>Excel Open XML spreadsheet</string>
        <key>UTTypeIconFile</key>
        <string>custom.icns</string>
        <key>UTTypeIdentifier</key>
        <string>com.microsoft.excel.openxmlformats.spreadsheetml.sheet</string>
        <key>UTTypeTagSpecification</key>
        <dict>
            <key>com.apple.ostype</key>
            <string>XLSX</string>
            <key>public.filename-extension</key>
            <array>
                <string>xlsx</string>
            </array>
        </dict>
    </dict>
</array>
4

2 回答 2

4

看起来 macOS 10.15 改变了解析类型对应图标的方式。

我找到了一种在 Catalina 上为我的应用程序获取正确文档图标的方法:
以前我只为我的字典中的CFBundleTypeIconFile键定义了一个图标。CFBundleDocumentTypes但是从 Catalina 开始,系统使用LSItemContentTypes数组来查找导出的UTI,然后使用该 UTI 的图标(通过 定义UTTypeIconFile)。

如果LSItemContentTypes数组包含系统尚不知道的类型(= 新引入的自定义类型),则还必须通过在UTExportedTypeDeclarations.

这适用于我的情况,因为我使用带有自己 UTI 的自定义文件格式。
对于您所描述的情况,在使用现有 UTI 的情况下,我不确定是否仍然可以覆盖您不“拥有”的 UTI 的图标。我认为为第 3 方类型定义自定义图标的正确方法是在导入的类型数组 ( UTImportedTypeDeclarations) 中定义字典。在这种情况下,只要没有其他应用程序通过导出 UTI 来声明对 UTI 的所有权,系统就应该选择您的自定义图标。我认为在 2 个或更多应用程序声称拥有它的所有权的情况下,设置为类型的默认应用程序的应用程序图标获胜(没有尝试过)。

我遇到的另一个问题是,分配给的图标文件UTTypeIconFile不能来自资产目录(这适用于CFBundleTypeIconFile)。它需要引用捆绑包中资源文件夹中的 .icns 文件。
可以使用以下命令将资产目录中的现有 .iconset 文件夹转换为 icns: iconutil --convert icns iconname.iconset

我不确定这是预期的行为还是这只是 Xcode 11 的资产目录编译器构建阶段中的一个错误。我通过反馈助手提交了一个错误。

于 2019-10-18T19:07:57.987 回答
0

我也有这个问题。尝试了空项目并使用捆绑的 macOS 应用程序对其进行了复制,因此可以假设这是 macOS Catalina 中的一个错误。

正如 trojanfoe 在评论中建议的那样,现在唯一要做的就是通过反馈助手向 Apple 报告。

Thomas Zoechling 提到了另一个可能会影响早期 macOS 版本的问题,但并未解决这里的主要问题。

于 2019-12-03T14:57:53.147 回答