文件图标已更改为macOS Catalina中的App图标

问题描述 投票:5回答:1

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

现在,即使在与我的应用程序同时存在Microsoft应用程序的情况下,该方法也可以在macOS Catalina beta之前完美运行。从macOS Catalina beta开始,我看到的是我的应用程序图标,而不是所有文件图标。

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

这是Catalina Beta的错误吗?或我可以做的任何事情来使它工作。

我的清单上有UTExportedTypeDeclarations看起来像这样。 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>
objective-c macos cocoa macos-catalina
1个回答
1
投票

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

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

如果LSItemContentTypes数组包含系统尚不知道的类型(=新引入的自定义类型),则还必须通过在UTExportedTypeDeclarations中定义字典来导出这些类型。

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

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

我不确定这是否是预期的行为,或者这仅仅是Xcode 11的Asset Catalog编译器构建阶段的错误。我通过反馈助手提交了一个错误。

© www.soinside.com 2019 - 2024. All rights reserved.