Значок значка файла поиска (наложение значка) на Mac OSX> = 10,6 - PullRequest
4 голосов
/ 08 декабря 2011

Я ищу решение для наложения значков файлов (значок значков) (как это делает Dropbox на Mac) с какао на Mac.Кто-нибудь знает способ сделать это?Я также искал документы Xcode и смотрю исходный код scpplugins , который является своего рода старым углеродным кодом.

Спасибо за любую помощь

Ответы [ 5 ]

5 голосов
/ 11 июля 2012

Немного опоздал, но, возможно, кому-нибудь поможет.

Я решил ту же проблему с классом NSWorkspace (см. setIcon: forFile: параметры )

Основная идея:

1.) Попробуйте получить предварительный просмотр файла с помощью QLThumbnailImageCreate (если не NULL, вы получите значок миниатюры)

2.) Если вы не получили миниатюру, то получитезначок OS X по умолчанию для файла (NSWorkspace iconForFile )

3.) Объединение миниатюр (или значка по умолчанию) с вашим значком

4.) Установить новый значок в файл (NSWorkspace setIcon: forFile: параметры )

4 голосов
/ 24 января 2012

Поскольку Finder был переработан в Snow Leopard, более старые методы Carbon больше не будут работать. Маршрут, который я выбрал, чтобы пометить значки в Finder, заключается в написании собственного пакета, который затем необходимо вставить в Finder.

Посмотрите на mach_inject Вольфа Ренцша (https://github.com/rentzsch/mach_star/tree/master/mach_inject), чтобы иметь возможность внедрить пользовательский пакет в приложение Какао.

Используйте class-dump, чтобы иметь возможность просмотреть заголовочные файлы приложения Cocoa (например, Finder в Snow Leopard и Lion), чтобы получить представление о том, что вам нужно переопределить в вашем собственном пакете.

1 голос
/ 24 декабря 2014

Я знаю, что это старый вопрос.

В последнее время появилась библиотека, которая реализует эту функциональность: https://github.com/liferay/liferay-nativity.

0 голосов
/ 03 апреля 2017

Вы можете использовать следующие два метода для наложения иконки на папки / файлы.

  1. Вы можете использовать -setIcon: forFile: options: метод в NSWorkspace, если вы хотите изменить значок файла или папки в Mac OS X. Однако после применения наложения значков с помощью этого метода наложение завершается, даже если вы переместили этот файл / папку за пределы. Это не может быть точным решением.

  2. Вместо этого используйте в вашем приложении цель расширения синхронизации Finder (Файл - Новый - Цель - расширение синхронизации Finder). После того как вы создали расширение, ваше приложение не имеет прямой связи с этой целью. Для активации используйте команду AppleScript (я не думаю, что есть лучшая альтернатива для этого.)

Для активации

NSString * pluginPath = [[[NSBundle mainBundle] builtInPlugInsPath] stringByAppendingPathComponent: @ "yourextension.appex"];

NSString * pluginkitString = [NSString stringWithFormat: @ "pluginkit -e use -a \"% @ \ "", pluginPath]; система ([pluginkitString cStringUsingEncoding: NSUTF8StringEncoding]);

Когда цель активирована, наше приложение может обмениваться данными с этим расширением. Немногие из них:

Использование NSDistributedNotificationCenter. Этот класс предоставляет способ отправлять уведомления объектам в других задачах (например, расширение здесь).

Другой способ - использовать [[NSUserDefaults alloc] initWithSuiteName: @ "teamid.com.company.test"];

И ваше приложение, и цель должны иметь общий идентификатор группы (т. Е. «Teamid.com.company.test»). Для этого включите «Группы приложений» в разделе «Назначение - Возможности - Группы приложений» и укажите идентификатор, подобный приведенному выше (то есть «teamid.com.company.test»), где teamid - это идентификатор, который вы получите на портале для разработчиков Apple. Проделайте те же шаги для своей цели расширения.

Прежде чем сделать вывод, убедитесь, что расширение активировано или нет. Чтобы проверить это, перейдите в Системные настройки - Расширения - Ваш App Finder. Это глобальная точка, в которой пользователь может включить / отключить наложение значков для вашего приложения.

0 голосов
/ 08 декабря 2011

NSDockTile делает это очень просто:

NSDockTile *dockTile = [NSApp dockTile];
[dockTile setBadgeLabel:@"33"];
...