Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

File icons getting changed to App icon in macOS Catalina

I have a Mac app that opens office files(.doc, .xls, etc.) and I need to show custom icon for these supported files. I used to achieve by adding the supported UTI types in CFBundleDocumentTypes and assign my custom icns icon. Also set my app as the default app which opens these file types.

Now this approach worked flawlessly until macOS Catalina beta, even with Microsoft apps being present along with my app. In macOS Catalina beta onwards, I am seeing my app icon in place of all the file icons.

I tried clearing icon cache and even relaunching Finder, but to no avail. Later on I even tried by adding the UTI types under UTExportedTypeDeclarations and UTImportedTypeDeclarations.

Is this a bug with Catalina Beta? Or anything I can do to get this working.

My plist has UTExportedTypeDeclarations looking like this. UTImportedTypeDeclarations and CFBundleDocumentTypes have similar values.

<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>
like image 253
Mihir Shah Avatar asked Oct 03 '19 13:10

Mihir Shah


People also ask

How do I change my folder icon back to normal on Mac?

On your Mac, select the file or folder. Choose File > Get Info in the menu bar. At the top of the Info window, select the small custom icon.


1 Answers

It looks like macOS 10.15 changed the way how the corresponding icon for a type is resolved.

I found a way how to get proper document icons for my app on Catalina:
Previously I only had an icon defined for the CFBundleTypeIconFile key in my CFBundleDocumentTypes dictionaries. But since Catalina, the system uses the LSItemContentTypes array to find an exported UTI and then uses the icon of that UTI (defined via the UTTypeIconFile).

If the LSItemContentTypes array contains types that are not known to the system yet (= newly introduced custom types), those types must also be exported by defining dictionaries in UTExportedTypeDeclarations.

This works for my case because I use a custom file format with its own UTI.
For the case you are describing, where existing UTIs are used, I am not sure if it is still possible to override the icons of UTIs that you don't "own". I think the correct way to define custom icons for 3rd party types would be to define dictionaries in the imported types array (UTImportedTypeDeclarations). In that case the system should choose your custom icon as long as no other app declares ownership of an UTI by exporting it. I suppose that the icon of the app that is set as Default application for a type wins in the case where 2 or more apps claim ownership for it (Haven't tried that).

Another issue I ran into was, that the icon file assigned to UTTypeIconFile can't come from an Asset Catalog (this worked for CFBundleTypeIconFile). It needs to refer to an .icns file in the Resource folder in your bundle.
Existing .iconset folders from the Asset Catalog can be converted to icns with the following command: iconutil --convert icns iconname.iconset

I am not sure if this intended behavior or if this is just a bug in the Asset Catalog compiler build phase of Xcode 11. I filed a bug via Feedback Assistant.

like image 59
Thomas Zoechling Avatar answered Sep 19 '22 10:09

Thomas Zoechling