在制作iPhone应用程序时是否可以嵌入或加载SWF(Apple是否允许)

时间:2011-12-31 14:28:04

标签: iphone flash actionscript-3 actionscript air

我在为iPhone制作应用时是否嵌入swfs或加载它们有点困惑。有谁知道每个的优点(最好使用)?我知道嵌入swfs应该比加载它们快一点,但这就是全部吗?

另外,这有点重要,我读到Apple会拒绝任何带有外部swfs的应用程序?那确实是对的吗?如果是这样,嵌入或加载所述swfs会解决这个问题吗?

提前致谢

编辑:经过一番搜索,转而认为Apple确实在加载外部swfs方面存在问题,你仍然可以这样做,但是你的swfs不需要附加任何动作脚本,这里是一个链接{{ 3}}它没有说任何关于嵌入swfs的事情,所以我的问题是:你可以在iphone上编写应用程序时嵌入swfs吗?

编辑澄清一下,当我说外部SWF时。我的意思是在您的系统本地找到的SWF,但您需要将它们添加到您的程序,因为它们包含您需要的MovieClips或Sprite等。我不是指您需要从网站或在线资源下载的SWF。 (希望澄清事情)

编辑更改了问题标题...问题解决了,感谢所有帮助人员和新年快乐= D

3 个答案:

答案 0 :(得分:7)

更新,2012年10月:

在Adobe AIR 3.5中,adl引入了一项名为“多个SWF支持”的功能,允许使用加载程序加载.ipa(本地文件,而不是服务器)中提供的SWF,以便在其中包含代码。 adl编译器AOT编译包含在.ipa中的SWF,允许它们加载并在iOS下工作。

撰写本文时,AIR 3.5目前处于测试阶段,可在adobe labs网站上找到:

请注意,此功能需要-swf-version = 18或更高版本的根SWF(不一定是正在加载的资产)和AIR命名空间以3.5结尾的应用程序xml文件。

旧答案:

我想更新这个答案,因为自从我第一次研究这个问题以来,我已经学到了很多这个问题。

问题的根源在于,在使用AIR制作iOS应用时,Apple TOS不允许对代码进行运行时解释 - 这包括SWF字节码。因此,不允许加载包含代码的SWF(即使是简单的动画命令,如stop(),gotoAndPlay()等),也不会通过Loader (在AIR 3.5之前)运行

  • 请注意,为其矢量图形内容加载SWF非常好。将显示图形,但代码将不会执行。

但是,有一些解决方法。这两种解决方法都是通过将带有代码的资产编译到主SWF中来避免Loader,因为一旦它们成为主SWF的一部分,AIR编译器(adt)就会将代码交叉编译为objective-c,一切都会正常工作在iOS设备上。

使用SWC库

这是iOS开发的最佳选择。如果将图形资源(.fla文件)编译为SWC(或从库中的符号导出SWC),然后针对这些SWC编译主swf,这将通过编译器和actionscript代码在iOS设备上执行。

将SWFMerge用于[嵌入] ed 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中不起作用,因为新的gameLevel()会创建一个Loader并解释SWF字节码。但是,如果您首先通过我的名为SWFMerge的工具运行上述SWF,它将采用您的嵌入式SWF并将其合并到您的根SWF中。然后ADT会将你的主swf(包括嵌入代码)编译成objective-C,它将在iOS上工作,并注意:new gameLevel()现在直接在你的资产实例中产生 - 而不是一个Loader。

SWFMerge工具在此处:

http://www.onetacoshort.com/temp/SWFMerge_alpha.swf

如果此解决方法适合您或您遇到问题,请在评论中告诉我。

使用装载程序

在AIR 3.5之前,如果您使用Loader加载SWF文件(无论此swf是否包含在您的IPA中或从Web服务器提供),目标SWF图形将加载正常,但SWF中的代码不会再次执行,因为Apple的TOS不允许这样做。

从AIR 3.5开始,将.ipa中的SWF文件打包为资产,使用Loader即使它们包含代码也能正常工作,因为此代码现在由adt进行AOT编译。这需要-swf-version = 18或更高版本的根SWF(不一定是资产)和AIR命名空间以3.5结尾的应用程序xml文件。

但是,技术上可以解释SWF字节码,它只是App Store的法律限制而不是。如果您只想在iOS设备上进行测试而不会通过App Store分发您的应用,则可以使用adt的-target ipa-test-interpreter选项编译SWF,并在其中加载包含代码的SWF。

答案 1 :(得分:3)

我不熟悉Apple和iPhone应用程序的规则,但通常在我制作应用程序/游戏时,我会嵌入所有内容。优点:

  • 您的游戏/应用程序在一个swf中,便于分享
  • 您的游戏/应用加载速度更快,因为所有资产都在加载时加载
  • 您不依赖互联网访问来获取您的资产(如果您从网站上加载它们) - 适合应用
  • 您的游戏/应用程序将“正常工作” - 没有安全问题,网址更改/资产网站停机时没有问题(如果它们是外部的)
  • 如果你使用swc代替swf(swc也可以加载btw),那么你也可以从严格打字中受益

缺点:

  • 如果您需要更新其中一个资源,则需要重新发布游戏/应用

答案 2 :(得分:2)

答案是肯定的,你可以嵌入SWF,但这不是唯一的方法。您还可以使用普通的Loader方法,以及与主SWF相关的所有内容:

var myLoader:Loader = new Loader();
// iOS apps act as if the main SWF is in a folder 
// and the other SWFs are in the same (or sub) folders. 
var url:URLRequest = new URLRequest("loadedSWF.swf");
myLoader.load(url);
addChild(myLoader);
myLoader.x = 50;
myLoader.y = 30;

有一点需要注意:在编译期间(在“Air for iOS设置”中,在“包含的文件”列表中),您必须列出要加载的SWF,它们将被编译到IPA中。

所以,你不能调用外部SWF,但你当然可以使用embed标签或使用(可能称之为)IPA嵌入来访问其他SWF。


修改

由于问题和标题在我第一次回答这个问题后有所改变,所以这里有一个更通用的摘要。 Apple不允许以与在网站上使用Flash Player时相同的方式加载本地SWF。除非将内容编译到应用程序中,否则无法使用i-device 中的“相对”或“本地”引用加载SWF(或其他任何内容)。这不适用于某些类型的“远程”SWF加载,也不适用于Actionscript“Native”编码,但这不是(原始)问题的内容。