【问题标题】:Icon for Mac OSX bundleMac OSX 捆绑包的图标
【发布时间】:2012-12-30 23:42:09
【问题描述】:

我编译了一个名为 MyBundle.bundle 的 Mac OSX 包,它用作另一个应用程序的插件。我希望捆绑包有一个唯一的图标,所以我将 Info.plist 文件设置为:

<key>CFBundleIconFile</key>
<string>MyIcon.icns</string>

并将文件 MyIcon.icns 放在包的 MyBundle.bundle/Contents/Resources 文件夹中。

这不起作用,查找器显示包的通用图标并忽略指定的 MyIcon.icns 文件。如果我将包的扩展名从 .bundle 更改为 .app,图标会立即显示 - 所以我知道 Info.plist 是正确的。

我发现了一种解决方法,可以模拟用户在捆绑包上复制和粘贴图标:

我将图标作为“icns”类型和 id -16455 的资源添加到包的 .rsrc 文件中。

我比打电话

/Developer/Tools/SetFile -a BC MyBundle.bundle

这行得通,但真的很蹩脚。从 Mac OS 10.8 开始,SetFile 需要永远执行。

我的问题:是否可以强制 Finder 显示捆绑包的图标而无需此类 hack?

顺便说一句:有一个关于同一主题的问题:Set icon of non app mac os x bundle;但是那里唯一的答案是关于如何创建图标的说明,并且对解决问题没有帮助。

【问题讨论】:

  • 你能发布一个捆绑目录的“ls -lR”吗?

标签: macos icons bundle finder


【解决方案1】:

你可以使用 NSWorkspace

[[NSWorkspace sharedWorkspace] setIcon:(NSImage *)image forFile:(NSString *)fullPath options:(NSWorkspaceIconCreationOptions)options]

https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/NSWorkspace_Class/Reference/Reference.html

【讨论】:

  • 此解决方案将涉及编写一个实用程序来查找图像、加载它并调用setIcon 方法。而且我不确定它是否会真正起作用,因为该图标已经为捆绑包正确设置。问题是取景器无法将其识别为已设置。这段代码会说服查找器显示图标吗?
  • 是的。它为 Finder 识别的包设置文件夹的图标。
  • 嗨@FruityGeek,我更改了捆绑资源文件夹中的图标。它不会更新图标。所以我用它来强制更新,但是我使用了不在资源文件夹中的图像路径,这个函数确实使图像立即更新,但是它没有更改我的应用程序包中 /Contents/Resources/appicon.icns 中的文件.即使我重新启动它使用我设置的新图标,但我的旧图像仍保留在资源文件夹中,这让我觉得除了简单的刷新之外还有一些棘手的事情正在发生。您能否分享您对此的看法。 Thax 是否有一个运行jsut刷新的函数
  • @yairchu 和 FruityGeek,这个剪辑显示了我在更改后图标不刷新的困境,我试图通过使用 NSFileManager 创建和删除文件来强制更新,但它没有用,所以我遇到了你的 @ 解决方案987654325@ 但随后出现了我之前评论中解释的有趣的困境。 Youtube :: Demo of Create-Remove File Not Updating Icon
【解决方案2】:

此解决方案将为您的所有 .bundle 关联相同的图标。我不确定这是您需要的(或者您是否需要为每个 .bundle 指定一个特定/不同的图标)。

如果您可以修改应用程序包:您可以定义与应用程序关联的文档类型。为此,您必须编辑应用程序包:

  • 将插件图标放入应用资源中:TheOtherApp.app/Contents/Resources/MyIcon.icns
  • 编辑TheOtherApp.app/Contents/Info.plist并添加如下内容:

     <key>CFBundleDocumentTypes</key> 
     <array>
      <dict>
        <key>CFBundleTypeName</key>
        <string>TheOtherApp Plugin</string>
        <key>CFBundleTypeRole</key>
        <string>None</string>
        <key>CFBundleTypeIconFile</key>
        <string>FlexoDocument.icns</string>
        <key>CFBundleTypeExtensions</key>
        <array>
          <string>bundle</string>
        </array>
        <key>LSTypeIsPackage</key>
        <string>true</string>
      </dict>
    </array>
    

有关 CFBundleDocumentTypes 的更多信息,请访问 developer.apple.com

您可能需要重新启动查找器和/或应用程序才能看到效果。

【讨论】:

  • 谢谢,但我确实需要为每个 .bundle 指定一个特定/不同的图标
  • 错误地投了反对票。请对答案进行一些随机编辑,以便我投票。很抱歉给您带来麻烦。
【解决方案3】:

尝试在 plist.info 文件中不包含 .icns 部分:

<key>CFBundleIconFile</key>
<string>MyIcon.icns</string>

改成:

<key>CFBundleIconFile</key>
<string>MyIcon</string>

我使用这种技术成功地创建了一个带有自定义图标的包:https://gist.github.com/Noitidart/6a2cbe0b4c74499765be

【讨论】:

    【解决方案4】:

    简单方法:打开一个图片文件全选复制,点击项目,apple-i获取信息,点击弹出窗口中的图标,点击apple-v。

    就这么简单。

    【讨论】:

    • 你读过这个问题吗?它说:我找到了一种解决方法,可以模拟用户在捆绑包上复制和粘贴图标,问题是:是否可以强制 Finder 显示捆绑包的图标没有这样的黑客行为?我需要一种为数百个捆绑包自动设置图标的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-19
    • 1970-01-01
    • 2017-11-09
    • 2018-04-04
    • 1970-01-01
    • 2014-10-08
    • 1970-01-01
    相关资源
    最近更新 更多