itok's Lab

昔の開発ネタを記録として残してます

iPhotoプラグインを作る「フォト蔵編」-1 : iPhotoプラグインの作り方-1 : サンプルソースを触る

まずは、iPhotoプラグインの作り方を調べます。。。と、Appleのサイトを見ても何にも載ってませんねえ。。。

いろいろ、徘徊した結果、わかったこと。iPhotoプラグインの作成なんて公式にサポートされているものじゃなさそう。いわば、みなさんがハックした結果ってこととでもいうんですかね。

そんなわけで、参考にしたのは、以前のエントリーにもあった二つの英語サイト。特に後者のほうがサンプルソースもあって読みやすいです。

で、こちらから、サンプルを落としつつ、その手順に従って、プラグインのひな形を作っていきます。

サンプルを動かす

とりあえず、サンプルプロジェクトを動かしてみましょう。

ビルドして、ExampleExport.iPhotoExpoter を iPhoto.app/Contents/PlugIns 以下にコピーします。

で、iPhotoを起動時、「書き出し」メニューを選べば、サンプルのGUIがみえるはず、、、だったんですが、どうもうまくいってません。コンソールログを見ると

Not a valid plugin: /Applications/iPhoto.app/Contents/PlugIns/
ExampleExport.iPhotoExpoter

ってでてます。これって、もしかしたら、サンプルが古いから?(テスト環境は10.5 + iPhoto'08)と思い、いったん中断。先に iPhoto の現状を確認(つまりクラスダンプ)することにしましょう。

class dumpする

これぞ、まさに第一歩。Cocoaの実行バイナリからクラス構造をダンプします。class-dumpコマンドの実行ファイルは、こちらのサイトからもらってきて、適当にパスの通った場所に設置。

で、こんな感じで実行。

# class-dump -C Export /Applications/iPhoto.app/Contents/MacOS/iPhoto > iPhoto.class

これでiPhoto内の"Export"っていうシンボルを持つクラス(プロトコル含む)のインターフェースがテキストファイルに出力されます。なんて便利。初めて使ったんですけれど、こうやってみなさんは裏口を開けていくのね、と。

ダンプしたインターフェースをヘッダへ

ダンプしたテキストファイルから必要なものをインクルードヘッダとして使います。主にはこんな感じで。

  • ExportMgr → ExportMgr.h : iPhoto書き出しに使用(選択ファイルの情報などを取得)
  • ExportPluginProtocol → ExportPluginProtocol.h : プラグインプロトコルそのもの(これを実装すればよい)
  • ExportPluginBoxProtocol → ExportPluginBoxProtocol.h : NSBoxのサブクラスで使用
  • ExportImageProtocol → ExportImageProtocol.h

ヘッダを比較

ここで、先ほどのサンプルヘッダと、ダンプして作ったヘッダを比較してみました。確かに過不足ありましたね。今回の場合は、-(BOOL)handlesMovieFiles; が増えているようです。

なので、早速サンプルソースに空実装を追加して、再度プラグインとして組み込んでみます。

すると、確かに「書き出し」ウィンドウ内に新しいタブがあらわれてきました。なるほどなるほど、こうやって読み込まれていくのね、というわけで、「書き出し」ボタンを押してみます。。。が、それはそれで、なにやらメソッドが存在しないとかいうエラーをコンソールにはいておしまい。これまたソースを比較してみると、ExportMgr のメソッドがずいぶんと変わっているみたいです。

まあ、これはこれで、プラグイン読み込みとデータ書き出しの雰囲気がなんとなくわかったので、よしとしましょう。次は実際に自分でプラグインを書いてみます。