Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何创建Apple mail插件_Objective C_Macos_Cocoa_Plugins - Fatal编程技术网

Objective c 如何创建Apple mail插件

Objective c 如何创建Apple mail插件,objective-c,macos,cocoa,plugins,Objective C,Macos,Cocoa,Plugins,我将为OSX mail.app应用程序创建一个邮件插件,以实现一些附加功能 我不知道从哪里开始,因为没有插件的官方文档 谁能帮我一下,我怎样才能开始这个项目。 是否有任何初始链接或教程,请建议?没有官方支持的方法来构建这样的工具-您需要开始尝试在没有任何官方支持的情况下连接到Mail.app 如果您想坚持这种做法,那么您需要了解Mail.app内部是如何工作的,这是一系列使用调试器和类转储检查其他应用程序中的库的工作: 您可能还需要一种将代码注入其他应用程序的方法,例如: 每次苹果更新Mai

我将为OSX mail.app应用程序创建一个邮件插件,以实现一些附加功能

我不知道从哪里开始,因为没有插件的官方文档

谁能帮我一下,我怎样才能开始这个项目。
是否有任何初始链接或教程,请建议?

没有官方支持的方法来构建这样的工具-您需要开始尝试在没有任何官方支持的情况下连接到Mail.app

如果您想坚持这种做法,那么您需要了解Mail.app内部是如何工作的,这是一系列使用调试器和类转储检查其他应用程序中的库的工作:

您可能还需要一种将代码注入其他应用程序的方法,例如:


每次苹果更新Mail.app,你都可能需要重做一切:)

如前所述,编写苹果邮件插件并不简单,因为它只有一个私有插件API,完全没有文档记录,可以随Mail.app的任何新版本而更改。最好的代码示例是,它是开源的&仍然是活动的(已经)。以下是我成功开始的步骤(完成后将在github上发布):

如何构建最小的Apple Mail插件(从Mavericks和Xcode 6.0.1开始)
  • 您需要在XCode中创建一个OSX“Bundle”项目
  • 包装扩展是
    mailbundle
    (在项目生成设置中的打包下)
  • 捆绑包需要存储在
    ~/Library/Mail/Bundles
    下(作为构建阶段添加复制文件操作,将其作为绝对路径目标,并将构建/文件夹中的*.mailbundle作为要复制的项)
  • 为了开发,我在运行方案中将
    /Applications/Mail.app
    设置为可执行文件,以便在XCode中运行将构建它,复制包并启动邮件;请注意,此时您将从邮件中得到一个错误,即您的插件无法启动且已被禁用
  • 您需要在Info.plist中提供
    支持的插件不兼容UUID的列表,即
  • 用于从Mail.app的私有API生成头文件
  • 起点是
    MVMailBundle
    ,您必须从它继承,并且它有一个
    registerBundle
    方法将您引入
    • 我在一个小的头文件中从生成的巨大头文件中提取了它,以便在需要的地方包含它(正如GPGMail所做的那样)
  • 创建一个新类
    MyMailBundle
    ,继承自
    NSObject
    • 它需要一个
      初始化
      方法
    • 并在Info.plist中将其设置为“Principle class”,以便在Mail.app加载捆绑包时运行它
  • 添加一些
    NSLog
    logging调用以验证是否发生了正确的事情,当从XCode内运行/调试Mail.app或在console.app的系统日志中运行/调试Mail.app时,这些调用将在XCode的控制台中可见
  • 这将成功运行插件在邮件中没有错误
  • 接下来的步骤涉及到一些疯狂的事情,比如修改邮件的行为,其中GPGMail可以是一个很好的工具。(我自己还没去过那里)
  • 以下是一些帮助我的资源,以供参考:

    • -一些很好的链接,但显然他从未完成项目,所以没有代码
    • -使用PyObjC用Python编写插件,解释基本机制,非常有用
    • -对于XCode 2,我认为,不幸的是,模板(下载一个zip)不再作为XCode中的模板工作,但是代码仍然很有用
    • -来自同一个人,但也来自2007年,非常过时;包含,但如果无法使用该模板,则它实际上没有帮助

    这是什么意思?什么是“苹果邮件插件”?也许你的意思是MFMailComposeViewController?我要求创建一个邮件插件,插件不是一个应用程序,它可以是一个安装程序,可以在现有应用程序中添加一些附加功能,而不影响其原始源代码。例如,我们想更改apple mail中的页脚视图,然后我们可以为apple mail创建一个具有相同附加功能的插件。我没有说MFMailComposeViewController是一个应用程序,因为它是一个类。是的,我知道,你说的是MFMailComposeViewController,它是一个类。好的。在这种情况下,请参阅优胜美地的PlugCompatibilityUUID is
    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