Apple event
![]() |
Apple event(アップルイベント)は、AppleのMac OSで採用されているプロセス間通信のプロトコルApple Event Interprocess Messaging Protocol (AEIMP) で送受信される高水準イベントである。System 7(日本語版は漢字Talk7)で初めて採用された。
Apple eventで扱われる「高水準なイベント」とはマウス座標の変化やキーボードの押下といった低水準なものではなく、処理の目的や人間の意向により近い内容を扱うものである。Apple eventはFinderからのアプリケーションの起動や書類のオープンなどの日常的な操作のほか、AppleScriptでも利用されている。
macOSではOpen Scripting Architecture (OSA) の一部として提供されており、Apple eventはMachメッセージ機構を用いてプロセス間を搬送される。
概要
[編集]Apple eventはプロセスが自身に対して送信することもできるが、基本的にプロセス間でやりとりされるものである。各プロセスは、システムの機能であるApple Event Managerを介してApple eventの送受信を行う。Apple eventは単に送信されるだけでなく、送信されたApple eventに対する返答(結果)を送り主に戻すこともできる。送信先は同一のコンピュータ上のプロセスのほか、ネットワーク内のコンピュータ上のプロセスも指定でき、ネットワーク経由の通信はリモートApple eventまたはプログラムリンクとも呼ばれ、AppleTalkネットワークまたはTCP/IPネットワークで利用でき、TCPおよびUDPでは3031番のポート番号が使われる。
データ構造
[編集]Apple eventには属性とパラメタという2種類の情報が格納され��。属性はイベントの役割を記したものであり、パラメタはイベントで用いられるデータである。属性とパラメタはApple eventに複数格納でき、4バイトキャラクタのキーワードによって各項目が識別される。Apple eventの属性には最低限「対象プロセス」と「イベントクラス」と「イベントID」を特定する情報がなくてはならない。イベントクラスとはイベントの内容をおおまかに分類するものであり、イベントIDとはイベントクラスをさらに細かく分類するものである。Apple eventを言葉に例えるならば、対象プロセスは話しかける相手、イベントクラスとイベントIDは動詞に相当するもの、パラメタは名詞に相当するものと言える。
イベントクラスには基本的な処理を扱うコアイベントクラスが定義されており、アプリケーションは最低限、次のようなイベントIDに対応することが推奨されている(注:コアイベントクラスのイベントIDは下記のほかにもある)。
- kAEOpenApplication ('oapp') - アプリケーションを起動する
- kAEQuitApplication ('quit') - アプリケーションを終了する
- kAEOpenDocuments ('odoc') - 書類を開く
- kAEPrintDocuments ('pdoc') - 書類を印刷する
Apple eventによって扱われるデータは、すべてApple eventデスクリプタと呼ばれる構造に格納される。Apple eventデスクリプタには、データの種類を識別する「デスクリプタタイプ」と、データの本体が格納される。Apple eventデスクリプタに格納できるデータの種類は任意であるが、あらかじめ多くのデスクリプタタイプ(数値、文字列、ファイル参照、オブジェクト指定子など)が定義されているほか、Apple eventデスクリプタはリスト(配列)やレコード(4バイトキャラクタのキーワードによって項目が識別される連想配列)を格納したり、入れ子にもできる。プログラムで扱われるApple event(送信前のもの、受信したもの)も、レコード型のApple eventデスクリプタの派生型である。
イベント駆動
[編集]Apple eventはシステムやプロセスから送信されるほかに、OSAによっても利用される。Mac OSのスクリプト言語であるAppleScriptもOSAに準拠した言語であり、Apple eventとの関係が密接である。AppleScriptの命令文やオブジェクト参照は、OSAのAppleScriptコンポーネントにより、システム内蔵またはアプリケーション内蔵のスクリプティング用語辞書に基づいてApple eventに変換され、対象のアプリケーションへと送信される。よって、アプリケーションがAppleScript(やOSA準拠のスクリプト)での制御に対応するには、それぞれの命令と対称するApple eventのイベントクラスとイベントIDに対応する必要がある。
プログラミングにおいては、Apple eventはイベントハンドラ(とりわけApple eventハンドラと呼ばれるプロシージャ)によって、イベントループ時に受信される。Apple eventハンドラを実装する必要がある状況は、ほとんどの場合、前述のコアイベントクラスに対応させる時か、AppleScriptに対応させる時である。CocoaフレームワークにおいてはApple eventハンドラを意識する必要は少なく、Mac OS X v10.3以降ではCocoaスクリプティングアーキテクチャにより、AppleScriptからのApple eventをキー値コーディング (KVC) によって処理することも可能になった。