Objective c 如何创建Apple mail插件
我将为OSX mail.app应用程序创建一个邮件插件,以实现一些附加功能 我不知道从哪里开始,因为没有插件的官方文档 谁能帮我一下,我怎样才能开始这个项目。Objective c 如何创建Apple mail插件,objective-c,macos,cocoa,plugins,Objective C,Macos,Cocoa,Plugins,我将为OSX mail.app应用程序创建一个邮件插件,以实现一些附加功能 我不知道从哪里开始,因为没有插件的官方文档 谁能帮我一下,我怎样才能开始这个项目。 是否有任何初始链接或教程,请建议?没有官方支持的方法来构建这样的工具-您需要开始尝试在没有任何官方支持的情况下连接到Mail.app 如果您想坚持这种做法,那么您需要了解Mail.app内部是如何工作的,这是一系列使用调试器和类转储检查其他应用程序中的库的工作: 您可能还需要一种将代码注入其他应用程序的方法,例如: 每次苹果更新Mai
是否有任何初始链接或教程,请建议?没有官方支持的方法来构建这样的工具-您需要开始尝试在没有任何官方支持的情况下连接到Mail.app 如果您想坚持这种做法,那么您需要了解Mail.app内部是如何工作的,这是一系列使用调试器和类转储检查其他应用程序中的库的工作: 您可能还需要一种将代码注入其他应用程序的方法,例如:
每次苹果更新Mail.app,你都可能需要重做一切:)如前所述,编写苹果邮件插件并不简单,因为它只有一个私有插件API,完全没有文档记录,可以随Mail.app的任何新版本而更改。最好的代码示例是,它是开源的&仍然是活动的(已经)。以下是我成功开始的步骤(完成后将在github上发布): 如何构建最小的Apple Mail插件(从Mavericks和Xcode 6.0.1开始)
mailbundle
(在项目生成设置中的打包下)~/Library/Mail/Bundles
下(作为构建阶段添加复制文件操作,将其作为绝对路径目标,并将构建/文件夹中的*.mailbundle作为要复制的项)/Applications/Mail.app
设置为可执行文件,以便在XCode中运行将构建它,复制包并启动邮件;请注意,此时您将从邮件中得到一个错误,即您的插件无法启动且已被禁用支持的插件不兼容UUID的列表,即
MVMailBundle
,您必须从它继承,并且它有一个registerBundle
方法将您引入
- 我在一个小的头文件中从生成的巨大头文件中提取了它,以便在需要的地方包含它(正如GPGMail所做的那样)
MyMailBundle
,继承自NSObject
- 它需要一个
初始化
方法
- 并在Info.plist中将其设置为“Principle class”,以便在Mail.app加载捆绑包时运行它
NSLog
logging调用以验证是否发生了正确的事情,当从XCode内运行/调试Mail.app或在console.app的系统日志中运行/调试Mail.app时,这些调用将在XCode的控制台中可见- -一些很好的链接,但显然他从未完成项目,所以没有代码
- -使用PyObjC用Python编写插件,解释基本机制,非常有用
- -对于XCode 2,我认为,不幸的是,模板(下载一个zip)不再作为XCode中的模板工作,但是代码仍然很有用
- -来自同一个人,但也来自2007年,非常过时;包含,但如果无法使用该模板,则它实际上没有帮助
800E5C92-87D3-429B-8740-5C6183CD13EA
。这非常有用,谢谢。在搜索示例时,我遇到了这样一个repo:-使用Alexander提供的UUID进行了更新,它与Yosemite一起工作。OSX 10.10.1上Mail.app的插件UUID是7C051997-F45A-4523-B053-2D262F94C775
,您可以使用:cat/Applications/Mail.app/Contents/Info.plist | grep UUID-A获取当前运行系统的UUID1
您还需要告诉Mail,您希望在终端中使用以下命令启用捆绑包<代码>默认值写入com.apple.mail EnableBundles-bool true
#import <Cocoa/Cocoa.h>
@interface MyMailBundle : NSObject
+ (void)initialize;
@end
#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