如何允许javascript与Flex/Flash/Actionscript进行通信



这里有一个问题。

我有一个大型javascript后台网站。该后端通过带有套接字桥的套接字与服务器进行通信,使用http://blog.deconcept.com/swfobject/

套接字"桥"是一个Flex/Flash.swf应用程序/可执行文件/插件/东西,缺少它的源代码。

我得换一下。

更多事实:

file appExePluginThing.swf
appExePluginThing.swf Macromedia Flash data (compressed), version 9

我用过https://www.free-decompiler.com/flash/反编译.swf文件,我想我已经整理好了原始代码与库以及Flash/Flex内置的东西

我已经使用FDT(免费版本)将反编译的代码重建到MYappExePluginThing.swf中,这样我就可以用javascript代码运行它,看看会发生什么。

我来这里是因为发生的事情不好。基本上,我的javascript代码(MYjavascript.js)已经到了进行的地步

window.log("init()");
var so = new SWFObject("flash/MYappExePluginThing.swf"", socketObjectId, "0", "0", "9", "#FFFFFF");
window.log("init() created MYappExecPluginThing!!!");
so.addParam("allowScriptAccess", "always");
log("init() added Param!!");
so.write(elId);
log("init() wrote!");

IE9的控制台(是的,你没看错)显示

init()
created MYappExecPluginThing!!!
init() added Param!!
init() wrote!

但我在MYappExePluginThing.as中进行的调试都没有显示,其他什么也没有发生。

我想弄清楚我搞砸了什么/发生了什么事?MYappExePluginThing.as正在运行吗?它在等什么吗?它失败了吗?为什么MYappExePluginThing.as中的日志消息没有显示?

第一件最明显的事情是我正在使用FDT,我怀疑它不是用来构建原始的。FlashBuilder或其他IDE中是否存在某种神奇的"构建javascript可访问的swf东西"?

我发现的第一件值得注意的事情是:

file MYappExePluginThing.swf
MYappExePluginThing.swf  Macromedia Flash data (compressed), version 14

我使用的是Flex 4.6,据我所知,它可能具有与appExePluginThing.swf 中使用的完全不同的允许javascript通信的机制

有人知道这是不是真的吗?

例如,当FDT运行这个东西时(我可以编译,但FDT不会创建.swf,除非我运行它),我在以下方法中得到警告:

private function init() : void
{
Log.log("console.log", "MYappExePluginThing init()");
//var initCallback:String = Application.application.parameters.initCallback?Application.application.parameters.initCallback:"MYjavascript.MYappExePluginThing_init";
var initCallback:String = FlexGlobals.topLevelApplication.parameters.initCallback?FlexGlobals.topLevelApplication.parameters.initCallback:"MYjavascript.MYappExePluginThing_init";
try
{
ExternalInterface.addCallback("method1Callback",method1);
ExternalInterface.addCallback("method2Callback",method2);
ExternalInterface.call(initCallback);
}
catch(err:Error)
{
Log.log("console.log", "MYappExePluginThing init() ERROR err="+err);
}
}

我收到一个警告,Application.Application已被弃用,我应该更改:

var initCallback:String = Application.application.parameters.initCallback?Application.application.parameters.initCallback:"MYjavascript.MYappExePluginThing_init";

至:

var initCallback:String = FlexGlobals.topLevelApplication.parameters.initCallback?FlexGlobals.topLevelApplication.parameters.initCallback:"MYjavascript.MYappExePluginThing_init";

我做了,但对事情的进展没有任何影响。

(仅供参考Log.Log()是我添加的东西:

public class Log{
public static function log(dest:String, mssg:String):void{
if(ExternalInterface.available){
try{
ExternalInterface.call(dest, mssg);
}
catch(se:SecurityError){
}
catch(e:Error){
}
}
trace(mssg);            
}
}

)

此外,在MYjavascript.js中,MYappExePluginThing_init看起来像这样:

this.MYappExePluginThing_init = function () {
log("MYjavascript.js - MYappExePluginThing_init:");
};

它应该在MYappExePluginThing完成初始化时执行。

但事实并非如此。控制台上没有显示该消息。

不幸的是,我找不到任何解释如何在Flex 4.6中允许javascript通信的参考资料,所以我可以检查我是否正确地构建了这个结构。

这是所有Flex/Flash应用程序都能做的内置功能吗?我的swf被访问了吗?是不是有什么错误?它是否无法与我的javascript进行通信?

有人有参考资料的链接吗?

如果这是你的问题,你下一步会怎么做?

(不是一个完整的解决方案,但我在评论部分没有空间了。)

为了回答您的基本问题,除了您展示的内容之外,您不需要做任何特别的事情来允许AS3到JS的通信。但是,您可能会在localhost上遇到沙箱安全问题;为了避免问题,请将您的SWF设置为本地受信任(右键单击Flash Player>全局设置>高级>受信任的位置设置)。不过,我猜这不是你的问题,因为你通常会遇到沙盒违规错误。

更可能的IMO是由于反编译和重新编译导致某些东西损坏。主权财富基金并不打算这么做,这基本上是一种黑客攻击,因为主权财富基金是一种开放格式。

我建议您调试正在运行的SWF。通过使用断点和逐步执行代码,您应该能够缩小哪里出了问题。您还可以更容易地看到您的SWF抛出的任何错误。

这不是一个真正的答案,但让您开始的一个想法是开始在Flash端记录所有内容,以查看损坏的位置。由于您使用的是IE,我建议您获得调试闪存播放器,安装它,然后运行Vizzy来显示您的痕迹。

应该能让你很好地了解应用程序的故障位置。

  • Vizzy
  • 调试播放器

最新更新