2008年6月21日土曜日

MailのPluginの調査1

Mailのバンドルの作り方
1.Xcodeで"Standard Apple Plug-ins"/"Address Book Action Plug-in for Objective-C"を選んでみる(他でも良いのかもしれない).
2.とりあえずMyMailPluginとする.
3.いらないFramework(AddressBook.framework)を外す.
4.MyMailPlugin.hはクラス名以外削除
@interface MyMailPlugin : NSObject
{
}
@end

5.MyMailPlugin.mも空っぽにする.
#import "MyMailPlugin.h"
@implementation MyMailPlugin
@end

6.class-dump等を使ってMail.appのheaderを調査しMVMailBundleのheaderを用意する.
@interface MVMailBundle : NSObject
{
}

+ (id)allBundles;
+ (id)composeAccessoryViewOwners;
+ (void)registerBundle;
+ (id)sharedInstance;
+ (BOOL)hasPreferencesPanel;
+ (id)preferencesOwnerClassName;
+ (id)preferencesPanelName;
+ (BOOL)hasComposeAccessoryViewOwner;
+ (id)composeAccessoryViewOwnerClassName;
- (void)dealloc;
- (void)_registerBundleForNotifications;

@end

7.こいつをMyMailPlugin.hの前半に挿入し,MyMailPluginをMVMailBundleの派生とする.
@interface MVMailBundle : NSObject
{
}

+ (id)allBundles;
+ (id)composeAccessoryViewOwners;
+ (void)registerBundle;
+ (id)sharedInstance;
+ (BOOL)hasPreferencesPanel;
+ (id)preferencesOwnerClassName;
+ (id)preferencesPanelName;
+ (BOOL)hasComposeAccessoryViewOwner;
+ (id)composeAccessoryViewOwnerClassName;
- (void)dealloc;
- (void)_registerBundleForNotifications;

@end


@interface MyMailPlugin : MVMailBundle
{
}
@end

8.MyMailPlugin.mに+ (void)initializeを追加する.
+ (void) initialize
{
[super initialize];
[self registerBundle];
NSLog(@"MyMailPlugin has registered.");
}

9.このままだとリンク時に「は?MVMailBundleってなに?」ってことになるのでターゲットのMyMailPluginの情報を表示していじる.あと出来上がるPluginの拡張子も変更.
9.1 ビルドタブ/リンク/他のリンカフラグの値を設定する 値 "-undefined dynamic_lookup"
9.2 ビルドタブ/パッケージング/ラッパーの拡張子の値を変更する 値 "mailbundle"
10.でビルド.build/Debug(or Release)/MyMailPlugin.mailbundleとして出来上がる(ハズ).
11.運良く出来たらこいつを~/Liburary/Mail/Bundles/の下に入れる.
12.コンソール.appを起動しておく(NSLogの結果を見るため).
13.Mail.appを起動.コンソールに"MyMailPlugin has registered."がでればおめでとう.

注意:Mail.appはデフォルトではPlugin(Bundle)を読み込まないのでターミナルからdefaultsコマンドで設定する必要がある.方法はググってください(おいらはGrowl Mailが勝手にやってくれてあったみたい).

とりあえずここまで.

0 件のコメント: