Ответ 1
Как уже отмечалось, писать плагины Apple Mail не так просто, поскольку у него есть только частный API плагина, который полностью недокументирован и может изменяться с любой новой версией Mail.app. Лучший пример кода - GPGMail, который является открытым исходным кодом и по-прежнему активен (уже работает над поддержкой Yosemite). Вот что я успешно сделал, чтобы начать (выложите его на github как только закончите):
Как создать минимальный плагин Apple Mail (с Mavericks и Xcode 6.0.1)
- вам нужно создать проект OSX "Bundle" в XCode
- расширение оболочки
mailbundle
(в разделе "Упаковка в настройках проекта" ) - пакет должен храниться в
~/Library/Mail/Bundles
(так как Build Phase добавляет действие Copy Files с этим в качестве абсолютного пути и *.mailbundle из вашей сборки/папки как элемент для копирования) - для разработки, я установил
/Applications/Mail.app
как исполняемый файл в моей схеме запуска, так что Run в XCode будет его строить, скопировать пакет и начать почту; обратите внимание, что в этот момент вы получите сообщение от Mail, что ваш плагин не может быть запущен и отключен. - вам нужно предоставить список
SupportedPluginCompatibilityUUIDs
в Info.plist, я украсть его из GPGMail, эти изменить с новыми версиями Mail/OSX - используйте class-dump для генерации файлов заголовков из закрытого API Mail.app Начальная точка
-
MVMailBundle
, которую вы должны унаследовать и которая имеет методregisterBundle
, чтобы зацепить вас- Я извлек это из огромного сгенерированного файла заголовка в небольшой заголовок MVMailBundle.h, чтобы включить туда, где это необходимо (как это сделано GPGMail)
- создайте новый класс
MyMailBundle
, наследующий отNSObject
- ему нужен метод
initialize
- и установите его как "Класс принципа" в Info.plist, чтобы он запускался, когда пакет загружался Mail.app
- ему нужен метод
#import <Cocoa/Cocoa.h>
@interface MyMailBundle : NSObject
+ (void)initialize;
@end
-
initialize
реализация: ранее вы могли бы использовать простой способ и непосредственно наследовать как сделанный в Letterbox, однако с 64-разрядной версии Objective-C вам нужно использовать динамический путь, выполненный GPGMail:- с помощью
NSClassFromString
для динамического получения классаMVMailBundle
- и
class_setSuperclass
из<objc/runtime.h>
, чтобы ваш собственный класс наследовал от него - а затем вызовите
registerBundle
, на котором он указан какMVMailBundle
(требуется включитьMVMailBundle.h
)
- с помощью
#import <objc/runtime.h>
#import "MVMailBundle.h"
#import "MyMailBundle.h"
@implementation MyMailBundle
+ (void)initialize
{
NSLog(@"Loading MyMail plugin...");
// since 64-bit objective-c runtimes, you apparently can't load
// symbols directly (i.e. through class inheritance) and have to
// resort to NSClassFromString
Class mvMailBundleClass = NSClassFromString(@"MVMailBundle");
// If this class is not available that means Mail.app
// doesn't allow plugins anymore or has changed the API
if (!mvMailBundleClass)
return;
// dynamically change super class hierarchy
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated"
class_setSuperclass([self class], mvMailBundleClass);
#pragma GCC diagnostic pop
// register our plugin bundle in mail
[[((MyMailBundle *)self) class] registerBundle];
NSLog(@"Done registering MyMail plugin.");
}
@end
- добавить некоторые
NSLog
протоколирующие вызовы для проверки правильной вещи, они будут видны в консоли XCode при запуске/отладке Mail.app из XCode или, альтернативно, в системных журналах Console.app - Это должно успешно запустить плагин в Mail без ошибок!
- Следующие шаги включают сумасшедшие вещи, такие как MethodSwizzling и ClassPosing, чтобы изменить поведение почты, где GPGMail может быть полезным примером. (Еще не было там)
Для справки, вот некоторые из ресурсов, которые мне помогли:
- GPGMail
- Адам Нэш: готов к написанию плагина Apple Mail.app для Mac OS X - некоторые хорошие ссылки, но, видимо, он никогда закончил проект, поэтому код
- Джеймс Р. Иган: Демистификация плагинов Mail.app на Leopard - используя PyObjC для написания плагина на Python, объясняет основные mechansims, очень полезно
- Aaron Harnly: шаблон плагина для почты - для XCode 2 я думаю, к сожалению, шаблон (загрузка zip) не работает как шаблон в Xcode больше, но код по-прежнему полезен для просмотра
- Aaron Harnly: источники почтовых ящиков - от одного и того же парня, но также с 2007 года, очень устаревшие; содержит readme из шаблона, хотя это действительно не помогает, если вы не можете использовать шаблон.