根据 Adobe 的文档 (Loader#securityDomain):
为了导入加载成功,加载的 SWF 文件的服务器
必须有一个信任加载 SWF 文件域的策略文件。
技巧是告诉Loader在加载swf时检查跨域文件,通过在创建LoaderContext时传递true作为第一个参数,例如:
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 位于同一位置,或其父文件夹之一。 Here's a non-restrictive cross-domain file according to documentation from 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 点#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
{
...
}