我将为 OS X Mail.app 应用程序创建一个邮件插件以获得一些附加功能。
我不知道从哪里开始,因为没有插件的官方文档。
谁能帮助我,我该如何开始这个项目。有没有初始链接或教程,请建议?
我将为 OS X Mail.app 应用程序创建一个邮件插件以获得一些附加功能。
我不知道从哪里开始,因为没有插件的官方文档。
谁能帮助我,我该如何开始这个项目。有没有初始链接或教程,请建议?
如前所述,编写 Apple Mail 插件并不简单,因为它只有一个私有插件 API,它完全没有文档记录,并且可以随着任何新版本的 Mail.app 更改。最好的代码示例是GPGMail,它是开源的并且仍然有效(已经在 Yosemite 支持上工作)。这是我成功地开始做的事情(完成后将把它放在 github 上):
mailbundle
(在项目构建设置中的打包下)~/Library/Mail/Bundles
(作为构建阶段添加一个复制文件操作,将其作为绝对路径目标,并将您的构建/文件夹中的 *.mailbundle 作为要复制的项目)/Applications/Mail.app
为可执行文件,以便在 XCode 中运行将构建它,复制包并启动邮件;请注意,此时您将收到来自 Mail 的错误消息,指出您的插件无法启动并被禁用SupportedPluginCompatibilityUUIDs
在 Info.plist 中提供一个列表,我从 GPGMail 偷了它,这些随着新的 Mail/OSX 版本而改变MVMailBundle
,你必须从它继承,它有一种registerBundle
方法可以吸引你
MyMailBundle
,继承自NSObject
initialize
方法#import <Cocoa/Cocoa.h>
@interface MyMailBundle : NSObject
+ (void)initialize;
@end
initialize
实现:以前,您可以使用简单的方法并直接继承,就像在 Letterbox 中所做的那样,但是,由于 Objective-C 的 64 位运行时,您必须使用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 或在 Console.app 的系统日志中时,它们将在 XCode 的控制台中可见作为参考,这里有一些对我有帮助的资源:
没有官方支持的方式来构建这样的工具 - 你需要开始尝试在没有任何官方支持的情况下连接到 Mail.app。
如果你想坚持这种事情,那么你需要了解 Mail.app 内部是如何工作的,这是一堆使用调试器和类转储来检查其他应用程序中的库:
https://github.com/nygard/class-dump
您可能还需要一种将代码注入其他应用程序的方法,例如:
https://github.com/rentzsch/mach_inject
每次 Apple 更新 Mail.app 时,您都可能需要重做所有事情 :)