Snow Leopard 登場後、いきなり超応用編からスタートしたこの AppleScriptObjC シリ ーズ(?)ですが、今回でひと区切りとさせていただきたいと思います。
もっと基礎的な部分に関しては、本家が出す、と言っているサンプルコードやドキュメントにお任せたいところですが、あまり期待できないので、精力的にサンプルコードをアップしている MacScripter / unScripted などをご参照ください。あるいは、何かリクエストをください。
最後は、Cocoa/Objective-C アプリで AppleScriptObjC を使えるようにする というお話。プロジェクト設定レベルのことなので、技術的な意義はあまりありませんが、よろしければご覧ください。
1. 任意の Cocoa/Objective-C プロジェクトを用意する
まずは、任意の Cocoa/Objective-C プロジェクトを用意します。これは既存のもので構いません。
ここでは、あえて Core Data アプリ向けのテンプレートを使ってみます。
2. AppleScriptObjC.framework をプロジェクトに追加する
次に、AppleScriptObjC.framework をプロジェクトに追加します。やり方はいろいろありますが、ここでは「Linked Frameworks」項目の上での右クリックから追加しています。
メニューを選択すると、フレームワーク選択シートが現れますので、AppleScriptObjC.framework を選択して「追加」ボタンを押せば OK です。
3. ガーベジコレクションを有効にする
Cocoa/Objective-C アプリのテンプレートでは、デフォルトでは ガーベジコレクション非対応 に設定されています。AppleScriptObjC を利用するには、どう設定するのが望ましいのでしょうか。
otool -ov /System/Library/Frameworks/AppleScriptObjC.framework/Versions/A/AppleScriptObjC
で AppleScriptObjC フレームワークの GC 対応状況を調べてみたところ、GC RR
(ガーベジコレクションまたは Retain/Release 方式)となっており、AppleScriptObjC フレームワークは ガーベジコレクションサポートあり(-fobjc-gc
)でビルドされていることが分かります。
…が、実際には、ガーベジコレクション非対応でアプリをビルドすると、ぼろぼろ警告が出てくる(おい)ので、ガーベジコレクションの設定は、サポートありまたは 必須(-fobjc-gc-only
)にするのが望ましいようです。ちなみに、AppleScriptObjC のテンプレートでは 必須がデフォルト となっています。
そこで、ガーベジコレクションの設定を切り替えます。これもいろいろ方法がありますが、ここでは「ターゲット」グループ内のターゲットをダブルクリックして設定ウィンドウを表示しています。
4. main 関数を編集する
最後に、main 関数にスクリーンショット内でアスタリスク(*)のコメントを入れてある 2 行を追加します。2 行で行っていることは次の通り:
- AppleScriptObjC.h をインポート
- バンドル内のスクリプトを読み込む(ここでスクリプトから Objective-C クラスが生成されるのでしょうか)
以上で、Cocoa/Objective-C ベースのプロジェクトでも、AppleScript で書いたクラスを活用できるようになります。サンプルコードでは、これまでの操作に加えて、実際に AppleScript で「Hello World」を表示するクラスを作成し、実際にボタンから表示させることができるようにしてあります。
サンプルコード
AppleScriptObjC は AppleScript Studio の後継と言われ、AppleScript だけでフルスペックの Cocoa アプリを開発できる環境として登場しましたが、Cocoa/Objective-C 開発者にも、自分のアプリにより簡単に AppleScript のアシストを受けられる手段として注目してほしい(Apple が意図した使い方ではないとは思いますが)、というのが、今回の三部作のテーマでした。
AppleScriptObjC 以前に用意されていた NSAppleScript クラスや Scripting Bridge を使うと、処理がスクリプト単位になって取り回しが難しかったり、Objective-C で 「AppleScript っぽいもの」を書く、という地獄(少なくとも私にとっては)を味わうことになりますが、かと言って、AppleScriptObjC を使ってアプリ全編を AppleScript で書く、というのも、Cocoa/Objective-C 開発者にとっては現実的ではないと思います。
これまでに紹介させていただいた方法を使って、AppleScript をうまく活用した面白い Cocoa アプリが生まれてくることを願っています(てか、Cocoa/Objective-C 開発者が対象なら、ここまで細かく設定方法を書く必要なかったな…汗)。