2012 年 10 月更新:
在 Adobe AIR 3.5 中,adl 引入了一项称为“多 SWF 支持”的功能,该功能允许使用加载程序加载在 .ipa 中交付的 SWF(本地文件,而不是来自服务器),以便在其中包含代码。 adl 编译器 AOT 编译包含在 .ipa 中的 SWF,允许它们在 iOS 下加载和工作。
在撰写本文时,AIR 3.5 目前处于测试阶段,可在 adobe labs 网站上获得:
请注意,此功能需要 -swf-version=18 或更高版本的根 SWF(不一定是正在加载的资产)和应用程序 xml 文件中以 3.5 结尾的 AIR 命名空间。
旧答案:
我想更新这个答案,因为自从我第一次研究这个问题以来,我已经了解了很多。
问题的根源在于,在使用 AIR 制作 iOS 应用程序时,Apple TOS 不允许运行时解释代码 - 这包括 SWF 字节码。因此,不允许加载带有代码的 SWF(即使是简单的动画命令,如 stop()、gotoAndPlay() 等),并且通过加载器无法工作(在 AIR 3.5 之前)。
- 请注意,为矢量图形内容加载 SWF 是非常好的。图形会显示,但代码不会执行。
但是,有一些解决方法。这两种解决方法都通过将带有代码的资产编译到主 SWF 中来避免加载器,因为一旦它们成为主 SWF 的一部分,AIR 编译器 (adt) 会将代码交叉编译到 Objective-c 中,一切都会正常工作在 iOS 设备上。
使用 SWC 库
这是 iOS 开发的最佳选择。如果您将图形资源(.fla 文件)编译成 SWC(或从库中的符号导出 SWC),然后针对这些 SWC 编译主 swf,这将通过编译器,并且 actionscript 代码将在 iOS 设备上执行。
将 SWFMerge 用于 [嵌入] 嵌入式 SWF
将资产嵌入 SWF 非常简单,如下所示:
[Embed(source="GameLevel.swf")]
private var GameLevel:Class;
public function main():void
{
var my_level:* = new GameLevel();
addChild(my_level);
}
在这种情况下,如果 gameLevel.swf 中有代码,它通常不会在 iOS 中工作,因为 new gameLevel() 会创建一个加载器并解释 SWF 字节码。但是,如果您首先通过我的名为 SWFMerge 的工具运行上述 SWF,它将获取您嵌入的 SWF 并将其合并到您的根 SWF 中。然后 ADT 会将您的主 swf(包括嵌入式代码)编译成 Objective-C,它将在 iOS 上运行,并注意:new gameLevel() 现在直接生成您的资产实例 - 而不是加载器。
SWFMerge 工具在这里:
http://www.onetacoshort.com/temp/SWFMerge_alpha.swf
如果此解决方法对您有效或您遇到问题,请在 cmets 中告诉我。
使用加载器
在 AIR 3.5 之前,如果您使用加载器加载 SWF 文件(无论此 swf 包含在您的 IPA 中还是从网络服务器提供),目标 SWF 图形都可以正常加载,但 SWF 内的任何代码都不会再次执行,因为 Apple 的 TOS 不允许这样做。
从 AIR 3.5 开始,将 .ipa 中的 SWF 文件打包为资产,即使它们包含代码,使用 Loader 也可以工作,因为此代码现在由 adt 进行 AOT 编译。这需要 -swf-version=18 或更高版本的根 SWF(不一定是资产)和应用程序 xml 文件中以 3.5 结尾的 AIR 命名空间。
但是,在技术上可以解释 SWF 字节码,这只是 App Store 的法律限制。如果您只想在 iOS 设备上进行测试并且不会通过 App Store 分发您的应用,您可以使用 adt 的 -target ipa-test-interpreter 选项编译您的 SWF,然后加载其中包含代码的 SWF。