gpt4 book ai didi

objective-c - 如何创建 Apple 邮件插件

转载 作者:太空狗 更新时间:2023-10-30 03:11:27 26 4
gpt4 key购买 nike

我将为 OS X Mail.app 应用程序创建一个邮件插件以获得一些附加功能。

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

任何人都可以帮助我,我该如何开始这个项目。是否有任何初始链接或教程,请建议?

最佳答案

如前所述,编写 Apple Mail 插件并不简单,因为它只有一个私有(private)插件 API,该 API 完全没有文档记录,并且可以随任何新版本的 Mail.app 进行更改。最好的代码示例是 GPGMail ,它是开源的并且仍然活跃(已经 working on Yosemite support )。这是我成功入门的方法(完成后会把它放在 github 上):

如何构建一个最小的 Apple Mail 插件(从 Mavericks 和 Xcode 6.0.1 开始)

  1. 您需要在 XCode 中创建一个 OSX“Bundle”项目
  2. 包装扩展名是mailbundle (在项目build设置中的打包下)
  3. 一个包需要存储在~/Library/Mail/Bundles下(在构建阶段添加一个复制文件操作,将其作为绝对路径目标,并将构建/文件夹中的 *.mailbundle 作为要复制的项目)
  4. 为了开发,我设置了/Applications/Mail.app作为我的运行方案中的可执行文件,以便在 XCode 中运行将构建它,复制包并启动邮件;请注意,此时您将从 Mail 收到一条错误消息,提示您的插件无法启动且已被禁用
  5. 您需要提供SupportedPluginCompatibilityUUIDs的列表在 Info.plist 中,我 stole it from GPGMail , 这些 change with new Mail/OSX versions
  6. 使用class-dump从 Mail.app 的私有(private) API 生成头文件
  7. 起点是MVMailBundle ,你必须从中继承并且有一个registerBundle吸引你的方法
    • 我从生成的巨大头文件中提取了一个小的 MVMailBundle.h在需要的地方包含 header (由 GPGMail 完成)
  8. 创建一个新类MyMailBundle , 继承自 NSObject
    • 它需要一个 initialize方法
    • 并在 Info.plist 中将其设置为“Principle class”,以便在 Mail.app 加载包时运行
#import <Cocoa/Cocoa.h>

@interface MyMailBundle : NSObject

+ (void)initialize;
@end
  1. 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
  1. 添加一些 NSLog记录调用以验证是否发生了正确的事情,当从 XCode 中运行/调试 Mail.app 或在 Console.app 的系统日志中时,它们将在 XCode 的控制台中可见
  2. 这应该可以在 Mail 中成功运行插件,没有错误!
  3. 接下来的步骤涉及疯狂的事情,例如 MethodSwizzlingClassPosing修改 Mail 的行为,其中 GPGMail 可以是 helpful example . (我自己还没去过)

作为引用,这里有一些对我有帮助的资源:

关于objective-c - 如何创建 Apple 邮件插件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12720536/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com