我有两个swf文件托管在不同的域aaa.com/a.swf和bbb.com/b.swf上。 a.swf正在加载b.swf并尝试将其转换为某个接口。当这两个swf文件都在同一个域下时,一切正常。但是当它们位于不同的域下时,在将b.swf转换为已实现的接口IComponent后,我将变为null。这两个swfs都是使用use-network = true和相同的IComponent.as编译的。
public class Wrapper extends Sprite
{
public function Wrapper()
{
super();
var request:URLRequest = new URLRequest("http://aaa.com/Component.swf");
var loaderContext:LoaderContext = new LoaderContext();
loaderContext.applicationDomain = ApplicationDomain.currentDomain;
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onLoadingComplete);
loader.load(request,loaderContext);
addChild(loader);
}
private function onLoadingComplete(event:Event):void
{
var target:LoaderInfo = event.target as LoaderInfo;
var component:IComponent = target.content as IComponent;
component.init({"s":1});
component.run();
}
}
public class Component extends Sprite implements IComponent
{
public function Component()
{
super();
Security.allowInsecureDomain("*");
}
public function init(params:Object):void
{
//some actions
}
public function run():void
{
//some actions
}
}
答案 0 :(得分:1)
试试这个:
//Assuming you've set a crossdomain policy file
var loaderContext:LoaderContext =
new LoaderContext( true , ApplicationDomain.currentDomain )
似乎它不工作的原因与IComponent未被识别或存在定义冲突的事实有关。我原以为将ApplicationDomain设置为currentDomain,应该避免定义冲突......但是可能值得尝试将每个SWF保留在自己的域中。
//Assuming you've set a crossdomain policy file
var loaderContext:LoaderContext =
new LoaderContext( true );
您还可以在加载其他SWF之前检查IComponent是否“存在”。这有助于诊断正在发生的事情......
var ClassName:Object = getDefinitionByName('IComponent');
trace( ClassName );
答案 1 :(得分:0)
也许您必须通过crossdomain.xml文件设置跨域安全策略
http://www.adobe.com/devnet/flashplayer/articles/fplayer9_security.html
例如:
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy
SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-access-from domain="*.example.com" />
</cross-domain-policy>
答案 2 :(得分:0)
感谢大家的回答,我今天找到了一个有效的解决方案。 而不是将加载的内容强制转换为IComponent我将其转换为对象
var component:Object = (event.target as LoaderInfo).content as Object;
component["init"](null);
component["run"]();
我从测试中得知,即使我们使用静态字段和方法的共享类,它也不起作用。包装器和组件都实例化它们自己的共享类实例。真的很奇怪。
如果您遇到同样的问题,请确保您的包装器/组件类具有Security.allowDomain调用
答案 3 :(得分:0)
这是播放器中的错误:
http://bugs.adobe.com/jira/browse/ASC-3529
当您尝试“共享”从不同域加载的swfs之间的接口时,会发生这种情况。如果您将两个swfs放在同一个应用程序域下(如您所示),这应该可以工作。
使用对象可以工作,但首先会破坏使用接口的目的。
这是一种解决方法,基本上将swf作为二进制文件加载,然后使用Loader::loadBytes
将swf实际加载到内存中:
答案 4 :(得分:-1)
我对语法错误的看法毫无意义,这是一个编辑:
此代码:
private function ololo():void{
var request:URLRequest = new URLRequest("http://domain/file.swf");
var loaderContext:LoaderContext = new LoaderContext();
loaderContext.applicationDomain = ApplicationDomain.currentDomain;
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onLoadingComplete);
loader.load(request,loaderContext);
}
private function onLoadingComplete(e:Event):void {
var target:LoaderInfo = e.target as LoaderInfo;
addChild(target.content as Sprite);
}
即使文件位于完全不同的域上,也能正常工作。
如果您将IComponent
视为Sprite
?