在macOS Catalina中,文件图标变成了应用程序图标

7
我有一个Mac应用程序,可以打开office文件(.doc、.xls等),我需要为这些支持的文件显示自定义图标。我以前是通过在CFBundleDocumentTypes中添加支持的UTI类型并分配我的自定义icns图标来实现的。同时将我的应用程序设置为打开这些文件类型的默认应用程序。
直到macOS Catalina beta版本,即使Microsoft应用程序与我的应用程序一起存在,这种方法也能完美地运行。但是从macOS Catalina beta版本开始,我看到所有文件图标的位置都出现了我的应用程序图标。
我尝试清除图标缓存甚至重新启动Finder,但没有效果。后来,我尝试通过将UTI类型添加到UTExportedTypeDeclarationsUTImportedTypeDeclarations下来解决问题。
这是Catalina Beta的一个错误吗?还是有什么我可以做的让它工作起来呢?
我的plist中的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>

通过安装在 macOS beta 上的反馈应用程序向 Apple 报告。 - trojanfoe
1
是的,我已经向苹果发送了反馈。但无论如何,这个问题在发布的Catalina操作系统上仍然存在。 - Mihir Shah
我也遇到了同样的问题。我通过资源目录提供文档图标。在之前版本的Xcode中,该资源(作为.iconset存储在目录中的"通用图标")会在构建期间转换为.icns文件并复制到.app包中 - 但是现在似乎不再发生这种情况。 - Thomas Zoechling
这里也有同样的问题。如果有人发现解决方案,请告诉我们! - tarmes
我找到了一个解决方案,适用于导出自定义UTI声明的应用程序,但我认为这对于OP的用例无效,因为现有类型的图标应该被覆盖。将我的发现编译成一个答案。 - Thomas Zoechling
2个回答

4
看起来 macOS 10.15 改变了解析类型对应图标的方式。
我找到了一个方法来在 Catalina 上为我的应用程序获取正确的文档图标:
以前我只在我的 CFBundleDocumentTypes 字典中的 CFBundleTypeIconFile 键中定义了一个图标。但是自从 Catalina 之后,系统使用 LSItemContentTypes 数组来查找导出的 UTI,并且使用该 UTI 的图标(通过 UTTypeIconFile 定义)。
如果 LSItemContentTypes 数组包含系统尚未识别的类型(即新引入的自定义类型),这些类型也必须通过在 UTExportedTypeDeclarations 中定义字典进行导出。
这适用于我的情况,因为我使用具有自己 UTI 的自定义文件格式。
对于您描述的情况,其中使用现有 UTI,我不确定是否仍然可以覆盖您不“拥有”的 UTI 的图标。 我认为定义第三方类型自定义图标的正确方法是在导入类型数组(UTImportedTypeDeclarations)中定义字典。在这种情况下,只要没有其他应用程序通过导出 UTI 来声明所有权,系统就应该选择您的自定义图标。如果两个或多个应用程序声称拥有它,则设置为默认应用程序的应用程序的图标会获胜(未尝试过)。
我遇到的另一个问题是,分配给 UTTypeIconFile 的图标文件不能来自 Asset Catalog(这对于 CFBundleTypeIconFile 可以工作)。它需要引用捆绑包中 Resource 文件夹中的 .icns 文件。
现有的 .iconset 文件夹可以使用以下命令转换为 icns: iconutil --convert icns iconname.iconset 我不确定这是否是预期的行为,还是 Xcode 11 的 Asset Catalog 编译器构建阶段中的错误。我通过反馈助手提交了一个问题。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接