いくつかの追加機能のために、OSXMail.appアプリケーション用のメールプラグインを作成します。
プラグインの公式ドキュメントがないため、どこから始めればよいかわかりません。
誰かが私を助けてくれますか、どうすればプロジェクトを始めることができますか?最初のリンクやチュートリアルはありますか?提案してください。
いくつかの追加機能のために、OSXMail.appアプリケーション用のメールプラグインを作成します。
プラグインの公式ドキュメントがないため、どこから始めればよいかわかりません。
誰かが私を助けてくれますか、どうすればプロジェクトを始めることができますか?最初のリンクやチュートリアルはありますか?提案してください。
前述のように、Apple Mail プラグインの作成は簡単ではありません。プライベート プラグイン API しかなく、完全に文書化されておらず、Mail.app の新しいバージョンで変更される可能性があるためです。最良のコード例はGPGMail です。これはオープン ソースであり、現在もアクティブです (すでにYosemite のサポートに取り組んでいます)。開始するために私が成功したことは次のとおりです(終了したらgithubに載せます):
mailbundle
(プロジェクトのビルド設定のパッケージングの下にあります)~/Library/Mail/Bundles
(ビルド フェーズでは、ファイルのコピー アクションを絶対パスの宛先として追加し、build/ フォルダーの *.mailbundle をコピーするアイテムとして追加します)。/Applications/Mail.app
開発のために、Run in XCode がそれをビルドし、バンドルをコピーしてメールを開始するように、実行スキームで実行可能として設定しました。この時点で、メールから、プラグインを開始できず、無効になっているというエラーが表示されることに注意してください。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
( include of が必要です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 を実行/デバッグするときに XCode のコンソールに表示されるか、代わりに Console.app のシステム ログに表示されます。参考までに、私を助けてくれたリソースの一部を以下に示します。
このようなツールを作成するための公式にサポートされている方法はありません。公式のサポートなしで Mail.app への接続を試みる必要があります。
この種のことに固執したい場合は、Mail.app の内部がどのように機能するかを理解する必要があります。これは、デバッガーとクラス ダンプを使用して他のアプリのライブラリを検査することです。
https://github.com/nygard/class-dump
おそらく、他のアプリケーションにコードを挿入する方法も必要になるでしょう。たとえば、次のようになります。
https://github.com/rentzsch/mach_inject
Apple が Mail.app を更新するたびに、すべてをやり直す必要がある可能性があります :)