在 iOS 设备上,对于在运行时加载和编译代码存在限制。由于这些限制,将外部 SWF 文件加载到您的应用程序中势必会有一些不同:
-
所有包含 ActionScript 代码的 SWF 文件都必须包括在应用程序包中。不能从外部源(如通过网络)加载包含代码的 SWF。在对应用程序进行打包时,对于 iOS 设备,应用程序包中所有 SWF 文件中的所有 ActionScript 代码都将编译成本机代码。
-
您不能加载 SWF 文件,然后卸载它再重新加载。如果这样做,会发生错误。
-
加载到内存中然后又卸载的行为与在桌面平台上这样操作的结果相同。如果加载 SWF 文件然后卸载它,包含在该 SWF 中的所有可视资源都将从内存中卸载掉。不过,对所加载 SWF 中的 ActionScript 类的任何类引用将保留在内存中,可以在 ActionScript 代码中访问这些类引用。
-
加载的所有 SWF 文件必须与主 SWF 文件使用相同的应用程序域。这并非默认行为,因此对于每个要加载的 SWF,您必须创建一个 LoaderContext 对象来指定主应用程序域,并将该 LoaderContext 对象传递给 Loader.load() 方法调用。如果要加载的 SWF 所处的应用程序域与主 SWF 应用程序域不同,便会发生错误。即使加载的 SWF 只包含可视资源而不包含 ActionScript 代码,也是这样。
下例中的代码将一个 SWF 从应用程序包中加载到主 SWF 应用程序域中:
var loader:Loader = new Loader(); var url:URLRequest = new URLRequest("swfs/SecondarySwf.swf"); var loaderContext:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain, null); loader.load(url, loaderContext);
对于只包含资源而不包含代码的 SWF 文件,可以从应用程序包加载,也可以通过网络加载。无论哪一种情况,都必须仍将 SWF 文件加载到主应用程序域中。
对于 AIR 3.6 之前的版本,在编译过程期间,所有代码都是从非主应用程序 SWF 中去除。只包含可视资源的 SWF 文件可以包括在应用程序包中并在运行时加载,但对于包含代码的 SWF 不是这样。如果要加载的 SWF 包含 ActionScript 代码,便会发生错误。该错误会导致应用程序中出现一个“未编译的 ActionScript”错误对话框。
Packaging and loading multiple SWFs in AIR apps on iOS