AppleScriptObjC を Cocoa/Objective-C アプリに統合する

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 行で行っていることは次の通り:

  1. AppleScriptObjC.h をインポート
  2. バンドル内のスクリプトを読み込む(ここでスクリプトから 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 開発者が対象なら、ここまで細かく設定方法を書く必要なかったな…汗)。

Leave a Reply

Your email address will not be published. Required fields are marked *