アプリケーション間通信



LocalConnection クラスを使用すると、Adobe® AIR™ アプリケーションとブラウザで実行される SWF コンテンツとの間だけでなく、AIR アプリケーション間でも通信できます。

LocalConnection クラスについて

LocalConnection オブジェクトでの通信相手は、同じクライアントコンピュータ上で動作する AIR アプリケーションと SWF ファイルに限られますが、通信相手が同じアプリケーションで動作している必要はありません。例えば、AIR アプリケーションとブラウザで実行される SWF ファイルで可能なように、LocalConnection クラスを使用して 2 つの AIR アプリケーションで通信できます。

LocalConnection オブジェクトの最も簡単な使用方法は、同じドメイン内または同じ AIR アプリケーション内の LocalConnection オブジェクト間の通信のみを許可することです。この場合、セキュリティに関する問題への対処は不要です。しかし、異なるドメイン間で通信を行う必要がある場合は、セキュリティ対策を実施する必要があります。いくつかの方法があります。詳しくは、send() メソッドの connectionName パラメータおよび allowDomain()domain のエントリ(LocalConnection クラスのリスト内)の説明を『Adobe AIR Language Reference』で参照してください。

LocalConnection オブジェクトにコールバックメソッドを追加するには、次のコードに示すように、LocalConnection.client プロパティに、メンバーメソッドを持つオブジェクトを設定します。

var lc = new air.LocalConnection(); 
var clientObject = new Object(); 
clientObject.doMethod1 = function() { 
    air.trace("doMethod1 called."); 
} 
clientObject.doMethod2 = function(param1) { 
    air.trace("doMethod2 called with one parameter: " + param1); 
    air.trace("The square of the parameter is: " + param1 * param1); 
} 
lc.client = clientObject;

LocalConnection.client プロパティに、呼び出すことができるすべてのコールバックメソッドが含まれます。

2 つのアプリケーション間でのメッセージ送信

LocalConnection クラスを使用すると、異なる AIR アプリケーション間でも、AIR アプリケーションとブラウザで実行される Adobe® Flash® Player(SWF)アプリケーションの間でも通信できます。

次のコードでは、サーバとして動作し、他のアプリケーションから受信する LocalConnection 呼び出しを受け付ける LocalConnection オブジェクトを定義します。

var lc = new air.LocalConnection(); 
lc.connect("connectionName"); 
var clientObject = new Object(); 
clientObject.echoMsg = function(msg) { 
    air.trace("This message was received: " + msg); 
} 
lc.client = clientObject;

このコードでは、まず、lc という LocalConnection オブジェクトを作成し、client プロパティを clientObject オブジェクトに設定します。この LocalConnection インスタンスのメソッドを別のアプリケーションが呼び出すと、AIR は clientObject オブジェクトでそのメソッドを探します。

指定した名前の接続が既に存在する場合は ArgumentError 例外がスローされます。この例外は、オブジェクトが接続済みであるために接続の試行が失敗したことを示します。

次のコードでは、conn1 という名前を指定して LocalConnection を作成する方法を示します。

connection.connect("conn1");

第 1 のアプリケーションに第 2 のアプリケーションから接続するには、まず、送信側 LocalConnection オブジェクト内で LocalConnection オブジェクトを作成し、次に、接続名と実行するメソッドの名前を指定して LocalConnection.send() メソッドを呼び出す必要があります。例えば、前述の例で作成した LocalConnection オブジェクトに接続するには、次のコードを使用します。

sendingConnection.send("conn1", "echoMsg", "Bonjour.");

このコードでは、既存の LocalConnection オブジェクトに接続名 conn1 で接続し、リモートアプリケーションの doMessage() メソッドを呼び出しています。リモートアプリケーションにパラメータを送信する場合は、次のコードに示すように、send() メソッドに対するメソッド名の指定の後に追加パラメータを指定します。

sendingConnection.send("conn1", "doMessage", "Hello world");

異なるドメインのコンテンツおよび他の AIR アプリケーションへの接続

特定のドメインからの通信のみ許可するには、LocalConnection クラスの allowDomain() メソッドまたは allowInsecureDomain() メソッドを呼び出し、この LocalConnection オブジェクトへのアクセスを許可するドメインのリストを渡し、許可するドメインの 1 つ以上の名前を渡します。

LocalConnection.allowDomain() メソッドおよび LocalConnection.allowInsecureDomain() メソッドに渡すことができる特別な値として、*localhost の 2 つがあります。アスタリスク値(*)は、すべてのドメインにアクセスを許可することを示します。localhost というストリングは、ローカル(ただし、アプリケーションリソースディレクトリ外)にインストールされているコンテンツから該当のアプリケーションへの呼び出しを許可することを示します。

LocalConnection.send() メソッドで、呼び出し元コードでのアクセスが認められていないアプリケーションにセキュリティサンドボックスから通信しようとすると、securityError イベント(SecurityErrorEvent.SECURITY_ERROR)が送出されます。このエラーを回避するには、受信側の LocalConnection.allowDomain() メソッドで、呼び出し元のドメインを指定してください。

同じドメイン内のコンテンツ間のみで通信を行う場合は、connectionName パラメータに対して、先頭がアンダースコア(_)以外で、かつドメイン名を含まない名前を指定します(例:myDomain:connectionName)。また、それと同じストリングを LocalConnection.connect(connectionName) コマンドでも使用します。

異なるドメインにあるコンテンツ間での通信を実装する場合は、connectionName パラメータに対して、アンダースコアで始まる名前を指定します。このアンダースコアを付けると、受信側 LocalConnection オブジェクトを含むコンテンツのドメイン間におけるポータビリティが高まります。考えられる 2 つの状況を次に示します。

  • connectionName のストリングがアンダースコア(_)で始まっていない場合、myDomain:connectionName のように、スーパードメイン名とコロンの接頭辞がランタイムによって追加されます。この処理には他のドメインにある同じ名前の接続との競合を回避する意味がありますが、その代わり、このスーパードメインをすべての送信側 LocalConnection オブジェクトで指定する必要があります(例:myDomain:connectionName)。受信側 LocalConnection オブジェクトを含んだ HTML ファイルまたは SWF ファイルを別のドメインに移動すると、ランタイムによって追加される接頭辞は、スーパードメインの変更を反映して変化します(例:anotherDomain:connectionName)。したがって、新しいスーパードメインを参照するようにすべての送信側 LocalConnection オブジェクトを手動で編集する必要が生じます。

  • connectionName のストリングが、_connectionName のようにアンダースコアで始まっている場合、ストリングに接頭辞は追加されません。つまり、受信側と送信側の LocalConnection オブジェクトは、connectionName にまったく同じストリングを使用します。すべてのドメインからの接続を受け付けることを受信側オブジェクトが LocalConnection.allowDomain() によって指定していれば、受信側 LocalConnection オブジェクトを含んだ HTML ファイルまたは SWF ファイルを別のドメインに移動した場合でも、送信側 LocalConnection オブジェクトに変更を加える必要はありません。

    connectionName でアンダースコア付きの名前を使用する場合の欠点の 1 つは、2 つのアプリケーションの両方が同じ connectionName を使用して接続しようとする場合など、競合の可能性があることです。もう 1 つの欠点は、セキュリティ関連です。アンダースコアシンタックスを使用する接続名では、リッスンしているアプリケーションのドメインは識別されません。これらの理由から、ドメイン修飾名の使用が推奨されます。

    AIR アプリケーションセキュリティサンドボックスで実行されるコンテンツ(AIR アプリケーションと共にインストールされるコンテンツ)では、ブラウザで実行される SWF コンテンツで使用するドメインの代わりに、app# というストリング、AIR アプリケーションのアプリケーション ID(アプリケーション記述ファイルで定義)、ドット(.)文字、アプリケーションの発行者 ID の順に続く 1 つの値を使用します。例えば、アプリケーション ID が com.example.air.MyApp で、発行者 ID が B146A943FBD637B68C334022D304CEA226D129B4 であるアプリケーションの connectionName は、「app#com.example.air.MyApp.B146A943FBD637B68C334022D304CEA226D129B4:connectionName」になります(詳しくは、基本アプリケーション情報の定義およびアプリケーション ID と発行者 ID の取得を参照してください)。

    ローカル接続を通じて別の AIR アプリケーションからユーザのアプリケーションに通信できるようにする場合は、LocalConnection オブジェクトの allowDomain() を呼び出し、ローカル接続のドメイン名を渡す必要があります。AIR アプリケーションでは、このドメイン名は接続ストリングと同じ要領でアプリケーション ID と発行者 ID により構成されます。例えば、送信側 AIR アプリケーションのアプリケーション ID が com.example.air.FriendlyApp で、発行者 ID が 214649436BD677B62C33D02233043EA236D13934 である場合、このアプリケーションから接続するときに使用するドメインストリングは「app#com.example.air.FriendlyApp.214649436BD677B62C33D02233043EA236D13934」になります。

    注意: アプリケーションを ADL(または Flash CS3、Flex Builder、Dreamweaver などの開発ツール)を使用して実行する場合、発行者 ID は null になり、ドメインストリングから省く必要があります。アプリケーションをインストールして実行する場合は、発行者 ID をドメインストリングに含めます。一時的な発行者 ID を ADL コマンドライン引数を使用して割り当てることができます。接続ストリングおよびドメイン名が適切にフォーマットされていることをテストするには、一時的な発行者 ID を使用します。