与其他 Flash Player 和 AIR 实例通信

Flash Player 9 和更高版本,Adobe AIR 1.0 和更高版本

LocalConnection 类支持在 Adobe® AIR® 应用程序之间以及在浏览器中运行的 SWF 内容之间进行通信。您也可以使用 LocalConnection 类在 AIR 应用程序与在浏览器中运行的 SWF 内容之间进行通信。使用 LocalConnection 类,您可以构建能在 Flash Player 和 AIR 实例之间共享数据的通用应用程序。

关于 LocalConnection 类

LocalConnection 对象仅可在运行于同一台客户端计算机上的 AIR 应用程序和 SWF 文件之间通信。但是,应用程序可以在不同的应用程序中运行。例如,两个 AIR 应用程序可以使用 LocalConnection 类进行通信,和 AIR 应用程序与浏览器中运行的 SWF 文件之间的通信原理相同。

最简便的 LocalConnection 对象使用方法是只允许位于同一个域或同一 AIR 应用程序中的 LocalConnection 对象之间进行通信。这样,您就不必担心安全问题了。但如果您需要在不同域之间进行通信,则可采用多种方法来实施安全措施。有关详细信息,请参阅用于 Adobe Flash Platform 的 ActionScript 3.0 参考中列出的 send() 方法的 connectionName 参数和 LocalConnection 类中的 allowDomain()domain 条目的介绍。

若要向 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 属性包含可调用的所有回调方法。

isPerUser 属性

isPerUser 属性添加到 Flash Player (10.0.32) 和 AIR (1.5.2) 中,旨在解决多个用户登录到 Mac 计算机时发生的冲突。在其他操作系统上,将忽略此属性,因为本地连接始终限制为单个用户。在新代码中应该将 isPerUser 属性设置为 true。但是,目前的默认值为 false 以实现向后兼容。在以后的运行时版本中此默认值可能会更改。

在两个应用程序之间发送消息

可使用 LocalConnection 类在不同的 AIR 应用程序之间以及在浏览器中运行的不同 Adobe® Flash® Player (SWF) 应用程序之间进行通信。还可使用此 LocalConnection 类在 AIR 应用程序和在浏览器中运行的 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 实例中的方法时,运行时会在 clientObject 对象中查找此方法。

如果已存在具有指定名称的连接,则会引发 Argument Error 异常,指出由于已经连接了该对象,连接尝试失败。

以下代码段说明如何创建名为 conn1 的 LocalConnection:
connection.connect("conn1");
从辅助应用程序连接到主应用程序要求您首先在发送 LocalConnection 对象中创建一个 LocalConnection 对象;然后使用连接名称和要执行的方法名称来调用 LocalConnection.send() 方法。例如,要向您早期创建的 LocalConnection 对象发送 doQuit 方法,可使用以下代码:
sendingConnection.send("conn1", "doQuit");

此代码使用连接名称 conn1 连接到现有 LocalConnection 对象,并调用远程应用程序中的 doMessage() 方法。如果想要将参数发送到远程应用程序,可以在 send() 方法中的方法名称后指定附加参数,如以下代码段所示:

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

连接到不同域中的内容和 AIR 应用程序

若要只允许从特定域进行通信,可以调用 LocalConnection 类的 allowDomain()allowInsecureDomain() 方法,并传递包含允许访问此 LocalConnection 对象的一个或多个域的列表,以便传递允许的一个或多个域名。

可以向 LocalConnection.allowDomain()LocalConnection.allowInsecureDomain() 方法传递两个特殊值:*localhost。星号值 (*) 表示允许从所有域访问。字符串 localhost 允许将从应用程序资源目录之外的本地安装内容调用应用程序。

如果 LocalConnection.send() 方法尝试从调用代码没有访问权限的安全沙箱与应用程序进行通信,则会调度 securityError 事件 (SecurityErrorEvent.SECURITY_ERROR)。若要解决此错误,可以在接收方的 LocalConnection.allowDomain() 方法中指定调用方的域。

如果仅在同一个域中的内容之间实现通信,可以指定一个不以下划线 (_) 开头且不指定域名的 connectionName 参数(例如 myDomain:connectionName)。在 LocalConnection.connect(connectionName) 命令中使用相同的字符串。

如果要实现不同域中的内容之间的通信,可以指定一个以下划线开头的 connectionName 参数。指定下划线使具有接收方 LocalConnection 对象的内容更易于在域之间移植。下面是两种可能的情形:

  • 如果 connectionName 字符串不以下划线开头,则运行时会添加一个包含超级域名和冒号的前缀(例如 myDomain:connectionName)。虽然这可以确保您的连接不会与其他域中具有同一名称的连接冲突,但任何发送方 LocalConnection 对象都必须指定此超级域(例如 myDomain:connectionName)。如果将具有接收方 LocalConnection 对象的 HTML 或 SWF 文件移动到另一个域中,则运行时会更改前缀,以反映新的超级域(例如 anotherDomain:connectionName)。必须手动编辑所有发送方 LocalConnection 对象,以指向新超级域。

  • 如果 connectionName 字符串以下划线开头(例如 _connectionName),则运行时不会向该字符串添加前缀。这意味着接收方和发送方 LocalConnection 对象都将使用相同的 connectionName 字符串。如果接收方对象使用 LocalConnection.allowDomain() 来指定可以接受来自任何域的连接,则可以将具有接收方 LocalConnection 对象的 HTML 或 SWF 文件移动到另一个域,而无需更改任何发送方 LocalConnection 对象。

    connectionName 中使用下划线名称的缺点是存在潜在冲突,例如当两个应用程序使用同一 connectionName 同时尝试连接时。第二个相关缺点是安全方面的。使用下划线语法的连接名称不会标识侦听应用程序的域。出于这些原因,应优先选择使用域限定名称。

Adobe AIR

要与在 AIR 应用程序安全沙箱中运行的内容(随 AIR 应用程序一起安装的内容)通信,必须将可标识 AIR 应用程序的超级域用作连接名称的前缀。超级域字符串以 app# 开头,然后依次是应用程序 ID、点 (.)字符和发行商 ID(如果已定义)。例如,在 ID为 com.example.air.MyApp 且没有发行商 ID 的应用程序中,connectionName 参数中使用的正确超级域为 "app#com.example.air.MyApp"。因此,如果基础连接名称为“appConnection”,则应在 connectionName 参数中使用的整个字符串为 "app#com.example.air.MyApp:appConnection"。如果应用程序包含发行商 ID,则必须将该 ID 也包含在超级域字符串中,即 "app#com.example.air.MyApp.B146A943FBD637B68C334022D304CEA226D129B4.1"

当您允许其他 AIR 应用程序通过本地连接与您的应用程序通信时,必须调用 LocalConnection 对象的 allowDomain() 来传入本地连接域名。对于 AIR 应用程序,此域名的形式与连接字符串相同,都包含了应用程序 ID 和发行商 ID。例如,如果发送方 AIR 应用程序的应用程序 ID 为 com.example.air.FriendlyApp 且发行商 ID 为 214649436BD677B62C33D02233043EA236D13934.1,则用于允许此应用程序进行连接的域字符串为:app#com.example.air.FriendlyApp.214649436BD677B62C33D02233043EA236D13934.1。(自 AIR 1.5.3 起,并不是所有 AIR 应用程序都包含发行商 ID。)