Kommunikation mit anderen Flash Player- und AIR-Instanzen

Flash Player 9 und höher, Adobe AIR 1.0 und höher

Die LocalConnection -Klasse ermöglicht die Kommunikation zwischen Adobe® AIR®-Anwendungen sowie zwischen SWF-Inhalt, der im Browser ausgeführt wird. Mit der LocalConnection-Klassen können Sie auch zwischen einer AIR-Anwendung und im Browser ausgeführtem SWF-Inhalt kommunizieren. Mit der LocalConnection-Klasse können Sie vielseitige Anwendungen erstellen, die Daten mit Flash Player- und AIR-Instanzen gemeinsam nutzen können.

LocalConnection-Klasse

Mit der LocalConnection-Klasse können Sie SWF-Dateien entwickeln, die ohne die fscommand()-Methode oder JavaScript Anweisungen untereinander austauschen können. LocalConnection-Objekte ermöglichen die Kommunikation zwischen verschiedenen SWF-Dateien auf demselben Client-Computer, die auch in verschiedenen Anwendungen ausgeführt werden können. Beispielsweise können eine in einem Browser ausgeführte SWF-Datei und eine in einem Projektor ausgeführte SWF-Datei Daten gemeinsam nutzen. Dabei verwaltet der Projektor die lokalen Informationen und die browserbasierte SWF-Datei stellt eine Remote-Verbindung her. (Ein „Projektor“ ist eine SWF-Datei, die in einem Format gespeichert wurde, das als eigenständige Anwendung ausgeführt werden kann, d. h. Flash Player ist in die ausführbare Datei eingebettet und muss nicht installiert sein.)

LocalConnection-Objekte können zur Kommunikation zwischen SWF-Dateien verwendet werden, die mit verschiedenen ActionScript-Versionen erstellt wurden:

  • In ActionScript 3.0 erstellte LocalConnection-Objekte können mit LocalConnection-Objekten kommunizieren, die in ActionScript 1.0 oder 2.0 erstellt wurden.

  • In ActionScript 1.0 oder 2.0 erstellte LocalConnection-Objekte können mit LocalConnection-Objekten kommunizieren, die in ActionScript 3.0 erstellt wurden.

Flash Player verarbeitet die Kommunikation zwischen LocalConnection-Objekten verschiedener Versionen automatisch.

Die einfachste Art der Verwendung von LocalConnection-Objekten besteht darin, die Kommunikation nur zwischen LocalConnection-Objekten zuzulassen, die sich in derselben Domäne oder derselben AIR-Anwendung befinden. Dadurch brauchen Sie sich nicht um Sicherheitsfragen zu kümmern. Wenn die Kommunikation zwischen verschiedenen Domänen erforderlich ist, gibt es eine Reihe von Möglichkeiten, Sicherheitsmaßnahmen zu integrieren. Weitere Informationen finden Sie in der Beschreibung des connectionName -Parameters der send() -Methode sowie in den Einträgen zu allowDomain() und domain der LocalConnection -Klasse im ActionScript 3.0-Referenzhandbuch für die Adobe Flash-Plattform .

Sie können LocalConnection-Objekte zum Senden und Empfangen von Daten innerhalb einer SWF-Datei verwenden. Dies wird jedoch nicht empfohlen. Verwenden Sie stattdessen gemeinsame Objekte.

Es gibt drei Verfahren, Ihre LocalConnection-Objekte in Rückrufmethoden einzufügen:

  • Erstellen einer Unterklasse der LocalConnection-Klasse und Hinzufügen von Methoden.

  • Einstellen der LocalConnection.client -Eigenschaft auf ein Objekt, das die Methoden implementiert.

  • Erstellen einer dynamischen Klasse, die LocalConnection erweitert, und dynamisches Anhängen der Methoden.

Das erste Verfahren, Rückrufmethoden hinzuzufügen, ist das Erweitern der LocalConnection-Klasse. Sie definieren die Methoden mit der benutzerdefinierten Klasse, anstatt sie der LocalConnection-Instanz dynamisch hinzuzufügen. Dieser Ansatz wird im folgenden Code gezeigt:

package 
{ 
    import flash.net.LocalConnection; 
    public class CustomLocalConnection extends LocalConnection 
    { 
        public function CustomLocalConnection(connectionName:String) 
        { 
            try 
            { 
                connect(connectionName); 
            } 
            catch (error:ArgumentError) 
            { 
                // server already created/connected 
            } 
        } 
        public function onMethod(timeString:String):void 
        { 
            trace("onMethod called at: " + timeString); 
        } 
    } 
}

Um eine neue Instanz der CustomLocalConnection-Klasse zu erstellen, können Sie den folgenden Code verwenden:

var serverLC:CustomLocalConnection; 
serverLC = new CustomLocalConnection("serverName");

Die zweite Möglichkeit, Rückrufmethoden hinzuzufügen, ist das Verwenden der Eigenschaft LocalConnection.client . Hierzu gehört das Erstellen einer benutzerdefinierten Klasse und das Zuweisen einer neuen Instanz zur client -Eigenschaft. Dies wird im folgenden Code gezeigt:

var lc:LocalConnection = new LocalConnection(); 
lc.client = new CustomClient();

Die Eigenschaft LocalConnection.client gibt die Objekt-Rückrufmethoden an, die aufgerufen werden müssen. Im vorangegangenen Code wurde die Eigenschaft client auf eine neue Instanz einer benutzerdefinierten Klasse eingestellt: CustomClient. Der Standardwert der Eigenschaft client ist die aktuelle LocalConnection-Instanz. Sie können die Eigenschaft client verwenden, wenn zwei Datenprozeduren den gleichen Methodensatz aufweisen, jedoch unterschiedlich agieren, beispielsweise in einer Anwendung, in der eine Schaltfläche in einem Fenster die Ansicht in einem zweiten Fenster umschaltet.

Zum Erstellen der CustomClient-Klasse können Sie den folgenden Code verwenden:

package 
{ 
    public class CustomClient extends Object 
    { 
        public function onMethod(timeString:String):void 
        { 
            trace("onMethod called at: " + timeString); 
        } 
    } 
}

Die dritte Möglichkeit zum Hinzufügen von Rückrufmethoden, das Erstellen einer dynamischen Klasse und das dynamische Anhängen der Methoden, ähnelt dem Verwenden der LocalConnection-Klasse in früheren Versionen von ActionScript. Dies wird im folgenden Code gezeigt:

import flash.net.LocalConnection; 
dynamic class DynamicLocalConnection extends LocalConnection {}

Rückrufmethoden können dieser Klasse mithilfe des folgenden Codes dynamisch hinzugefügt werden:

var connection:DynamicLocalConnection = new DynamicLocalConnection(); 
connection.onMethod = this.onMethod; 
// Add your code here. 
public function onMethod(timeString:String):void 
{ 
    trace("onMethod called at: " + timeString); 
}

Das zuvor beschriebene Verfahren zum Hinzufügen von Rückrufmethoden wird nicht empfohlen, da es dem Code an Portabilität mangelt. Darüber hinaus führt dieses Verfahren zum Erstellen lokaler Verbindungen möglicherweise zu Leistungsbeeinträchtigungen, da der Zugriff auf dynamische Eigenschaften deutlich langsamer erfolgt als der Zugriff auf versiegelte Eigenschaften.

isPerUser-Eigenschaft

Die isPerUser -Eigenschaft wurde in Flash Player (10.0.32) und AIR (1.5.2) eingeführt, um einen Konflikt zu beheben, der auftritt, wenn mehr als ein Benutzer bei einem Mac angemeldet ist. Unter anderen Betriebssystemen wird die Eigenschaft ignoriert, da die lokale Verbindung immer für einzelne Benutzer vorgesehen ist. Die isPerUser -Eigenschaft sollte in neuem Code auf true eingestellt werden. Zur Gewährleistung der Abwärtskompatibilität lautet der Standardwert derzeit jedoch false . Der Standardwert wird in zukünftigen Versionen der Laufzeiten möglicherweise geändert.

Senden von Meldungen zwischen zwei Anwendungen

Die LocalConnection-Klasse ermöglicht die Kommunikation zwischen verschiedenen AIR-Anwendungen sowie zwischen verschiedenen Adobe® Flash® Player (SWF)-Anwendungen, die in einem Browser ausgeführt werden. Mit der LocalConnection-Klassen können Sie auch zwischen einer AIR-Anwendung und einer im Browser ausgeführtem SWF-Anwendung kommunizieren.

Beispielsweise können Sie mehrere Flash Player-Instanzen auf einer Webseite integrieren oder eine Flash Player-Instanz Daten von einer zweiten Flash Player-Instanz in einem Popupfenster abrufen lassen.

Im folgenden Beispiel wird ein LocalConnection-Objekt definiert, das als Server fungiert und die von anderen Anwendungen eingehenden LocalConnection-Aufrufe akzeptiert:
package 
{ 
    import flash.net.LocalConnection; 
    import flash.display.Sprite; 
    public class ServerLC extends Sprite 
    { 
        public function ServerLC() 
        { 
            var lc:LocalConnection = new LocalConnection(); 
            lc.client = new CustomClient1(); 
            try 
            { 
                lc.connect("conn1"); 
            } 
            catch (error:Error) 
            { 
                trace("error:: already connected"); 
            } 
        } 
    } 
}

Zuerst wird ein LocalConnection-Objekt namens lc erstellt und anschließend wird für die client -Eigenschaft ein clientObject -Objekt festgelegt. Ruft eine andere Anwendung in dieser LocalConnection-Instanz eine Methode auf, sucht die Laufzeit im clientObject -Objekt nach dieser Methode.

Wenn Sie bereits über eine Verbindung mit dem angegebenen Namen verfügen, wird eine Argument-Fehlerausnahme ausgelöst, die darauf hinweist, dass der Versuch zur Verbindungsherstellung fehlgeschlagen ist, da das Objekt bereits verbunden ist.

Immer wenn eine Flash Player-Instanz eine Verbindung mit dieser SWF-Datei herstellt und versucht, eine Methode für die angegebene lokale Verbindung aufzurufen, wird die Anforderung an die von der client -Eigenschaft angegebene Klasse gesendet. Diese Eigenschaft ist auf die CustomClient1-Klasse eingestellt:

package 
{ 
    import flash.events.*; 
    import flash.system.fscommand; 
    import flash.utils.Timer; 
    public class CustomClient1 extends Object 
    { 
        public function doMessage(value:String = ""):void 
        { 
            trace(value); 
        } 
        public function doQuit():void 
        { 
            trace("quitting in 5 seconds"); 
            this.close(); 
            var quitTimer:Timer = new Timer(5000, 1); 
            quitTimer.addEventListener(TimerEvent.TIMER, closeHandler); 
        } 
        public function closeHandler(event:TimerEvent):void 
        { 
            fscommand("quit"); 
        } 
    } 
}

Zum Erstellen eines LocalConnection-Servers rufen Sie die LocalConnection.connect() -Methode auf und geben einen einmaligen Verbindungsnamen ein. Wenn bereits eine Verbindung mit dem angegebenen Namen besteht, wird ein ArgumentError-Fehler erzeugt, der darauf hinweist, dass die versuchte Verbindung fehlgeschlagen ist, da das Objekt bereits eine Verbindung hergestellt hat.

Im folgenden Codebeispiel wird gezeigt, wie ein LocalConnection-Objekt namens conn1 erstellt wird:
try 
{ 
    connection.connect("conn1"); 
} 
catch (error:ArgumentError) 
{ 
    trace("Error! Server already exists\n"); 
}
Um eine Verbindung zwischen der primären und sekundären Anwendung herzustellen, müssen Sie zuerst im sendenden LocalConnection-Objekt ein LocalConnection-Objekt erstellen. Rufen Sie dann die LocalConnection.send() -Methode mit dem Namen der Verbindung und dem Namen der auszuführenden Methode auf. Um beispielsweise die doQuit -Methode an das zuvor erstellte LocalConnection-Objekt zu senden, verwenden Sie den folgenden Code:
sendingConnection.send("conn1", "doQuit");

In diesem Beispiel wird eine Verbindung zu einem vorhandenen LocalConnection-Objekt mit dem Verbindungsnamen conn1 hergestellt und die doMessage() -Methode in der Remote-Anwendung aufgerufen. Um Parameter an die Remote-Anwendung zu senden, geben Sie in der send() -Methode nach dem Methodennamen zusätzliche Argumente an (siehe folgender Ausschnitt):

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

Herstellen von Verbindungen mit Inhalten in verschiedenen Domänen und mit AIR-Anwendungen

Um nur die Kommunikation von bestimmten Domänen zuzulassen, rufen Sie die allowDomain() - oder allowInsecureDomain() -Methode der LocalConnection-Klasse auf und übergeben eine Liste mit der Domäne oder den Domänen, der bzw. denen der Zugriff auf das LocalConnection-Objekt erlaubt ist, und übergeben den oder die Namen der zulässigen Domänen.

In früheren Versionen von ActionScript waren LocalConnection.allowDomain() und LocalConnection.allowInsecureDomain() Rückrufmethoden, die von den Entwicklern implementiert werden mussten und einen booleschen Wert zurückgaben. In ActionScript 3.0 sind LocalConnection.allowDomain() und LocalConnection.allowInsecureDomain() integrierte Methoden, die Entwickler genauso wie Security.allowDomain() und Security.allowInsecureDomain() aufrufen können, um mindestens einen Domänennamen zu übergeben, für den der Zugriff erlaubt ist.

In Flash Player 8 wurden Sicherheitsbeschränkungen für lokale SWF-Dateien eingeführt. SWF-Dateien, die auf das Internet zugreifen können, haben keinen Zugriff auf das lokale Dateisystem. Wenn Sie localhost angeben, können alle lokalen SWF-Dateien auf diese SWF-Datei zugreifen. Wenn die LocalConnection.send() -Methode versucht, mit einer SWF-Datei in einer Sicherheits-Sandbox zu kommunizieren, auf die der aufrufende Code keinen Zugriff hat, wird ein securityError -Ereignis( (ecurityErrorEvent.SECURITY_ERROR ) ausgelöst. Zur Umgehung dieses Fehlers können Sie in der LocalConnection.allowDomain() -Methode des Empfängers die Domäne des Aufrufers angeben.

Es gibt zwei spezielle Werte, die an die LocalConnection.allowDomain() - und LocalConnection.allowInsecureDomain() -Methoden übergeben werden können: * und localhost . Der Sternwert (*) ermöglicht den Zugriff von allen Domänen. Der String localhost ermöglicht es Inhalt, der zwar lokal aber außerhalb des Ressourcenverzeichnisses der Anwendung installiert ist, die Anwendung aufzurufen.

Wenn versucht wird, mithilfe der LocalConnection.send() -Methode mit einer Anwendung in einer Sicherheits-Sandbox zu kommunizieren, auf die der aufrufende Code keinen Zugriff hat, wird ein securityError -Ereignis( SecurityErrorEvent.SECURITY_ERROR ) ausgelöst. Zur Umgehung dieses Fehlers können Sie in der LocalConnection.allowDomain() -Methode des Empfängers die Domäne des Aufrufers angeben.

Wenn Sie die Kommunikation nur zwischen Inhalt in derselben Domäne implementieren, können Sie einen connectionName -Parameter angeben, der nicht mit einem Unterstrich ( _ ) beginnt und der keinen Domänennamen angibt (beispielsweise myDomain:connectionName ). Verwenden Sie denselben String im Befehl LocalConnection.connect(verbindungsName) .

Wenn Sie die Kommunikation nur zwischen Inhalten in unterschiedlichen Domänen implementieren, geben Sie einen connectionName -Parameter an, der mit einem Unterstrich beginnt. Dadurch wird die Portierbarkeit des Inhalts mit dem empfangenden LocalConnection-Objekt zwischen Domänen erhöht. Im Folgenden werden zwei mögliche Fälle erläutert:

  • Wenn der String für connectionName nicht mit einem Unterstrich (_) beginnt, fügt die Laufzeitumgebung ein Präfix mit dem Namen der Superdomäne und einen Doppelpunkt hinzu (z. B. myDomain:connectionName ). Dies stellt zwar sicher, dass es keinen Konflikt zwischen Ihrer Verbindung und gleichnamigen Verbindungen aus anderen Domänen gibt, allerdings müssen sendende LocalConnection-Objekte ebenfalls diese Superdomäne angeben (z. B. myDomain:connectionName ). Wenn die HTML- oder SWF-Datei mit dem empfangenden LocalConnection-Objekt in eine andere Domäne verschoben wird, ändert die Laufzeitumgebung das Präfix entsprechend der neuen Superdomäne (z. B. anotherDomain:connectionName ). Alle sendenden LocalConnection-Objekte müssen dann manuell bearbeitet werden, damit sie auf die neue Superdomäne verweisen.

  • Wenn der String für connectionName mit einem Unterstrich beginnt (z. B. _connectionName ), fügt die Laufzeitumgebung dem String kein Präfix hinzu. Das heißt, empfangende und sendende LocalConnection-Objekte verwenden identische Strings für connectionName . Wenn das empfangende Objekt mit LocalConnection.allowDomain() angibt, dass Verbindungen von allen Domänen zulässig sind, können Sie die HTML- oder SWF-Datei mit dem empfangenden LocalConnection-Objekt in eine andere Domäne verschieben, ohne die sendenden LocalConnection-Objekte zu ändern.

    Ein Nachteil, den die Verwendung von Namen mit Unterstrich in connectionName mit sich bringt, sind die möglichen Konflikte: wenn z. B. zwei Anwendungen versuchen, eine Verbindung mit demselben connectionName herzustellen. Im Zusammenhang damit gibt es einen zweiten, die Sicherheit betreffenden Nachteil. Verbindungsnamen, die die Unterstrichsyntax verwenden, identifizieren nicht die Domäne der wartenden Anwendung. Daher werden domänenqualifizierte Namen bevorzugt.

Adobe AIR

Zur Kommunikation mit Inhalt, der in der Sicherheits-Sandbox der AIR-Anwendung ausgeführt wird (mit der AIR-Anwendung installierter Inhalt), müssen Sie dem Verbindungsnamen als Präfix eine Superdomäne voranstellen, die die AIR-Anwendung identifiziert. Der String für die Superdomäne beginnt mit app# , gefolgt von der Anwendungs-ID und einem Punkt (.), gefolgt von der Herausgeber-ID (sofern definiert). Die richtige Superdomäne für den connectionName -Parameter einer Anwendung mit der Anwendungs-ID com.example.air.MyApp und ohne Herausgeber-ID lautet beispielsweise "app#com.example.air.MyApp" . Wenn der Basisverbindungsname beispielsweise „appConnection“ lautet, muss für den connectionName -Parameter der folgende String verwendet werden: "app#com.example.air.MyApp:appConnection" . Wenn die Anwendung eine Herausgeber-ID enthält, muss auch diese ID in den String für die Superdomäne aufgenommen werden: "app#com.example.air.MyApp.B146A943FBD637B68C334022D304CEA226D129B4.1" .

Wenn Sie zulassen, dass eine andere AIR-Anwendung mit Ihrer Anwendung über die lokale Verbindung kommuniziert, müssen Sie die allowDomain() -Methode des LocalConnection-Objekts aufrufen und den Domänennamen der lokalen Verbindung übergeben. Bei einer AIR-Anwendung wird dieser Domänenname aus den Anwendungs- und Herausgeber-IDs in gleicher Weise wie der Verbindungsstring gebildet. Beispiel: Wenn die Anwendungs-ID der sendenden AIR-Anwendung com.example.air.FriendlyApp und die Herausgeber-ID 214649436BD677B62C33D02233043EA236D13934.1 lautet, dann lautet der Domänenstring, mit dem Sie die Verbindung dieser Anwendung zulassen, app#com.example.air.FriendlyApp.214649436BD677B62C33D02233043EA236D13934.1 . (Ab AIR 1.5.3 verfügen nicht alle AIR-Anwendungen über Herausgeber-IDs.)