在我的Flex应用程序中,我需要一个Javascript控件来调用我的Actionscript方法。根据Flex/Actionscript文档,很简单,我在我的Actionscript代码中写了以下内容:
if (ExternalInterface.available)
ExternalInterface.addCallback("setName", setNameInActiveWindow);
在我编写的Javascript控件中:
document.getElementById('FlexAppId').setName(name);
非常好用,和预期一样,我已经投入生产。但是在生产环境中不起作用:(。完全相同的代码……我想不出来。上面的Javascript代码已经运行,但在Actionscript代码中没有执行回调函数。
这与域安全有关吗?在本地,我使用local.mydomain.com:8080,其中local.mydomain.com解析为127.0.0.1(我需要这样做以使某些小部件正常工作)。而Flex应用程序来自同一个本地web服务器。然而,在生产环境中,它只是www.mydomain.com(mydomain.com不是真实域名),而Flex应用程序来自flash.mydomain.com(CDN)。
我在www.mydomain.com上有一个crossdomain.xml文件:
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<site-control permitted-cross-domain-policies="master-only"/>
<allow-access-from domain="*.mydomain.com"/>
</cross-domain-policy>
更新:我尝试更改本地环境,以便从flash.mydomain.com引用Flex应用程序,就像在生产环境中一样。结果发现我在本地也遇到了同样的问题......所以似乎这是某种域安全性问题,尽管我已经有了上面的crossdomain.xml文件。我需要在crossdomain.xml中更改一些内容吗?还需要额外获取ExternalInterface.addCallback
才能使其工作吗?
更新2:搞定了!我不得不同时执行Security.allowDomain("*")
和Security.allowInsecureDomain("*")
。将其设置为flash.mydomain.com并不能解决该问题,我必须放置通配符。allowNetworking
没有影响。我需要allowScriptAccess="always"
,但我之前已经这样做了。使用ExternalInterface.call
调用Javascript只需要这个参数就可以轻松实现。但是,使用ExternalInterface.addCallback
添加回调需要上述带通配符的Security方法。