Подтвердить что ты не робот

Как создать плагин Apple mail

Я собираюсь создать почтовый плагин для приложения OS X Mail.app для некоторых дополнительных функций.

Я не знаю, с чего начать, поскольку официальная документация для плагинов отсутствует.

Кто-нибудь может мне помочь, как я могу начать проект. Есть ли начальная ссылка или учебник, пожалуйста, предложите?

4b9b3361

Ответ 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
  1. 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
  1. добавить некоторые NSLog протоколирующие вызовы для проверки правильной вещи, они будут видны в консоли XCode при запуске/отладке Mail.app из XCode или, альтернативно, в системных журналах Console.app
  2. Это должно успешно запустить плагин в Mail без ошибок!
  3. Следующие шаги включают сумасшедшие вещи, такие как MethodSwizzling и ClassPosing, чтобы изменить поведение почты, где GPGMail может быть полезным примером. (Еще не было там)

Для справки, вот некоторые из ресурсов, которые мне помогли:

Ответ 2

Нет официального способа создания такого инструмента - вам нужно начать попытки подключиться к Mail.app без какой-либо официальной поддержки.

Если вы хотите упорствовать в этом, вам нужно понять, как работают внутренние функции Mail.app, что является кучей использования отладчика и дампа класса для проверки библиотек в других приложениях:

https://github.com/nygard/class-dump

Вероятно, вам также понадобится способ ввода кода в другие приложения, например:

https://github.com/rentzsch/mach_inject

И каждый раз, когда Apple обновляет Mail.app, вам может потребоваться повторить все:)