我将为OS X Mail.app应用程序创建一个邮件插件,以获得一些额外的功能。
我不知道从哪里开始,因为没有插件的官方文档。
任何人都可以帮助我,我该如何开始这个项目。 是否有任何初始链接或教程,请提出建议?
答案 0 :(得分:46)
如上所述,编写Apple Mail插件并不简单,因为它只有一个私有插件API,完全没有文档,可以随任何新版本的Mail.app进行更改。最好的代码示例是GPGMail,它是开源的&仍然有效(已working on Yosemite support)。这是我成功开始的事情(一旦完成就会把它放在github上):
mailbundle
(在项目构建设置中的包装下)~/Library/Mail/Bundles
下(作为构建阶段添加一个复制文件操作,将其作为绝对路径目标,并将构建/文件夹中的* .mailbundle作为要复制的项目)/Applications/Mail.app
设置为可执行文件,以便在XCode中运行将构建它,复制包并启动邮件;请注意,此时您将从Mail收到错误,指出您的插件无法启动并被禁用SupportedPluginCompatibilityUUIDs
的列表,stole it from GPGMail,这些change with new Mail/OSX versions MVMailBundle
,你必须继承它,并且有一个registerBundle
方法来吸引你
MyMailBundle
,继承自NSObject
initialize
方法#import <Cocoa/Cocoa.h>
@interface MyMailBundle : NSObject
+ (void)initialize;
@end
initialize
实施:之前,您可以使用简单的方式,directly inherit作为done in Letterbox,但是,since 64-bit runtimes of Objective-C您必须使用dynamic way as done by 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
供参考,以下是一些帮助我的资源:
答案 1 :(得分:4)
没有官方支持的方法来构建这样的工具 - 您需要在没有任何官方支持的情况下开始尝试挂接到Mail.app。
如果你想坚持这种事情,那么你需要了解Mail.app内部的工作方式,这是一堆使用调试器和类转储来检查其他应用程序中的库:
https://github.com/nygard/class-dump
您可能还想要一种方法将代码注入其他应用程序,例如:
https://github.com/rentzsch/mach_inject
每次Apple更新Mail.app时,您都可能需要重做所有内容:)