iPh*_*eDv 27 macos plugins cocoa objective-c
我将为OS X Mail.app应用程序创建一个邮件插件,以获得一些额外的功能.
我不知道从哪里开始,因为没有插件的官方文档.
任何人都可以帮助我,我该如何开始这个项目.是否有任何初始链接或教程,请建议?
Ale*_*hek 50
如上所述,编写Apple Mail插件并不简单,因为它只有一个私有插件API,完全没有文档,可以随任何新版本的Mail.app进行更改.最好的代码示例是GPGMail,它是开源的并且仍处于活动状态(已经在Yosemite支持下工作).这是我成功开始的事情(一旦完成就将它放在github上):
mailbundle
(在项目构建设置中的包装下)~/Library/Mail/Bundles
(作为Build Phase添加一个Copy Files操作,将其作为绝对路径目标,并从build /文件夹中添加*.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
Run Code Online (Sandbox Code Playgroud)
initialize
实现:以前,你可以使用简单的方式直接继承是在信箱做,但是,因为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
Run Code Online (Sandbox Code Playgroud)
NSLog
日志记录调用来验证正确的事情,当在XCode中运行/调试Mail.app时,或者在Console.app的系统日志中,它们将在XCode的控制台中可见.作为参考,以下是一些帮助我的资源: