根据 Adobe 的文档(Loader#securityDomain):
为了导入加载成功,加载的 SWF 文件的服务器必须有一个信任加载 SWF 文件域的策略文件。
诀窍是告诉 Loader 在加载 swf 时检查跨域文件,true
方法是在创建时作为第一个参数传递LoaderContext
,例如:
var request:URLRequest = new URLRequest(_file.url);
var context:LoaderContext = new LoaderContext(true, null, SecurityDomain.currentDomain);
var loader:Loader = new Loader();
loader.load(request, context);
随附的 cross-domain.xml 应位于与子 SWF 相同的位置,或者位于其父文件夹之一中。根据 Adobe 的文档,这是一个非限制性的跨域文件:
<?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="all"/>
<allow-access-from domain="*" secure="false"/>
<allow-http-request-headers-from domain="*" headers="*" secure="false"/>
</cross-domain-policy>
另一件可能使您更容易的事情是传递接口而不是类,这将有效地绕过冲突代码。这将起作用,因为默认情况下,子类在运行时从父类继承接口(参见Loader#applicationDomain point #1)。只要该对象遵守接口,子类就可以安全地实例化它自己的每个对象版本。例如:
var applicationDomain:ApplicationDomain = loader.contextLoaderInfo.applicationDomain;
var classDefinition:Class = applicationDomain.getDefinition("MyBigAwesomeClass") as class;
var instance:IMyBigAwesomeInterface = new classDefinition() as IMyByAwesomeInterface;
MyBigAwesomeClass 的定义将如下所示:
public class MyBigAwesomeClass implements IMyBigAwesomeInterface
{
...
}