用于浏览器扩展的Flash播放器API

时间:2014-08-23 19:31:35

标签: api flash browser haxe

让我们假设我们在网站上托管了一个基于P2P多人Flash游戏。是否可以创建一个可以监听Flash应用程序内容的浏览器扩展?例如,我想知道一个玩家何时连接到一个房间,被踢或被禁止,或者只是自己离开。对不起,这不是一个特定的问题,但我需要一个方向开始。提前谢谢!

1 个答案:

答案 0 :(得分:0)

我可以看到一些在Flash和浏览器插件之间进行通信的方法。

一种是打开到本地计算机上运行的服务器的套接字。由于安全沙箱,这可能不是最简单的方法,但如果可行的话,它当然可能是一个,因为你已经编写了套接字处理代码,并且正在收听/写入其他代码插座并不是非常复杂。对于这种方法,你只需要你的插件就可以开始监听套接字,并让flash applet连接到它。

另一种方法可能是尝试在cookie中传递消息。但是很确定这会引起很多悲伤。

另一种方式,我怀疑这可能会变得更容易,就是使用ExternalInterface类在Flash和JavaScript之间进行通信,然后从JavaScript到插件。如果您可以在网上找到副本,Adobe的IntrovertIM示例应该可以帮助您入门。

在Flash中,创建两个函数,一个jsToSwf(command:String, args:Array<String>):Dynamic函数,用于处理发送给该回调的JS的传入消息,以及swfToJs(command:String, args:Array<String> = null):Dynamic函数,该函数调用flash.external.ExternalInterface.call("swfToJs", command, args);

要进行设置,您需要执行以下操作:

if (flash.external.ExternalInterface.available) {
  flash.external.ExternalInterface.addCallback("jsToSwf", jsToSwf);
  swfToJs("IS JS READY?");
}

addCallback的两个参数是JS中调用的函数,以及它在Flash中调用的函数。它们不必是同一个东西,但它有点像他们这样做是有道理的)

在JS中,您需要相同的功能:function swfToJs(command, params)接受来自Flash的命令和参数列表;和jsToSwf(command, params)来电getSwf("Furcadia").jsToSwf(command, params);

getSwf("name")可能应该是这样的:

/** Get ref to specified SWF file.
// Unfortunately, document.getElementById() doesn't
// work well with Flash Player/ExternalInterface. */
function getSwf(movieName) {
    result = '';
    if (navigator.appName.indexOf("Microsoft") != -1) {
        result = window[movieName];
    } else {
        result = document[movieName];
    }
    return result;
}

唯一令人讨厌的是你需要做一点握手才能确保每个人都在倾听。因此,当你准备好Flash时,它会调用swfToJs("IS JS READY?");,然后JS方面,在获取该命令时,使用jsToSwf("JS IS READY!");回复然后获取该信息,Flash确认收到swfToJs("FLASH IS READY!");并且双方都设置了国旗说他们现在很清楚发送他们喜欢的任何命令。

所以,你现在已经让Flash与JS交谈了。但JS如何与浏览器扩展进行对话?而且,你的意思是扩展或附加,因为有区别!好吧,由于你没有指定哪个浏览器,因此它成了一整套蠕虫。

每个浏览器处理事物的方式不同。例如,Mozilla有port.emit() / port.on()和较旧的postMessage()作为JS的API与附加组件进行通信。

尽管如此,我认为ExternalInterface让我们将一个难题(Flash-to-external-code comms)简化为一个更简单的问题(Js-to-external-code comms)。

相关问题