【问题标题】:Is it possible to embed or load SWFs when making iphone apps (Is it allowed by Apple)制作 iphone 应用程序时是否可以嵌入或加载 SWF(Apple 是否允许)
【发布时间】:2011-12-31 14:28:03
【问题描述】:

在为 iphone 制作应用程序时,我有点困惑是嵌入 swfs 还是加载它们。有谁知道每个的优点是什么(最好使用哪个)?我知道嵌入 swf 应该比加载它们快一点,但仅此而已吗?

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

提前致谢

编辑:经过一番搜索,发现 Apple 在加载外部 swfs 时确实存在问题,你仍然可以这样做,但你的 swfs 不需要附加任何动作脚本,这是一个链接 @987654321 @ 它没有说任何关于嵌入 swfs 的内容,所以我的问题是:你可以在 iphone 上编写应用程序时嵌入 swfs 吗??

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

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

【问题讨论】:

    标签: iphone flash actionscript-3 actionscript air


    【解决方案1】:

    2012 年 10 月更新:

    在 Adob​​e 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。

    【讨论】:

    • 我正在使用 inDesign。我用它来导出到 FLA。然后我导出到 SWF。我尝试直接嵌入并添加子项,但出现错误 Error #2100: The ByteArray parameter in Loader.loadBytes() must have length greater than 0. 如果我使用 ProLoader,我会得到同样的错误,并且项目有-swf-version=18 和以 3.5 结尾的命名空间。
    • @ccsakuweb,如果我理解正确,您是在使用 embed 嵌入 SWF,然后尝试使用 Loader.loadBytes 加载该 SWF?如果您的 SWF 中有任何代码,则该代码不适用于 iOS,因为不支持 loadBytes(因为它暗示运行时代码。Contact me 我会看看是否可以帮助您。
    • 我知道使用 AIR 3.5 可以。 =(然后我理解不好..我想要一个swfs列表,swfs里面有TLF文本。最后我加载了swfs但没有显示TLF文本。我想是因为那个限制。跨度>
    • 我不确定是否有 swc 而不是 swf 对我有用。因为我需要在列表的每个项目中使用不同的 swc(在 swf 之前)。 >
    • 我已经使用了你的合并,TLF 继续没有显示。 >stackoverflow.com/questions/13600859/…
    【解决方案2】:

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

    • 您的游戏/应用在一个 swf 中,便于分享
    • 您的游戏/应用加载速度更快,因为所有资产在加载时都存在
    • 您不依赖互联网访问来获取您的资产(如果您从网站加载它们) - 适合应用程序
    • 您的游戏/应用程序将“正常运行” - 没有安全问题,网址更改/资产网站关闭(如果它们是外部的)没有问题
    • 如果您使用 swc 而不是 swf(顺便说一句,也可以加载 swc),那么您也可以从严格类型中受益

    缺点:

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

    【讨论】:

    • 嵌入似乎很适合我。谢谢
    • 您的游戏/应用程序将“正常运行” - 不幸的是,这在 iOS 上并非如此。代码不会在包含代码的 [embed] 嵌入式 SWF 中执行(由于 Apple 的限制)。有关详细信息,请参阅我的答案。
    • 如果您使用 swc 而不是 swf(也可以加载 swc),那么您也可以从严格类型中受益 你的意思是?如何添加 swcs?在 libs 文件夹中并相互导入?我该怎么做?在列表的每个项目中加载不同的 swc 很奇怪吧? :S 我不知道我会怎么做。用装载机可以吗?
    【解决方案3】:

    答案是肯定的,您可以嵌入 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 设备中使用“相对”或“本地”引用加载 SWF(或其他任何内容)除非内容被编译到应用程序中。这不适用于某些类型的“远程” SWF 加载,也不适用于 Actionscript“本机”编码,但这不是(原始)问题的意义所在。

    【讨论】:

    • 所以只要知道我做对了(因为骗子说的不是这样)...我确实可以嵌入或加载本地 swf 文件,我不会遇到苹果的任何问题。不过,对于加载,我需要像你所说的那样包含 swf 文件,但我无法从在线资源加载外部 swf 文件(尽管这不是我需要的,所以没关系)......正确吗?
    • 对。在您的 iDevice 上运行时没有外部(例如,某些网站)SWF 加载是来自 Apple 的限制;嵌入/编译选项成为 Air IPA 的一部分。
    • 太棒了,谢谢。你帮了很多忙。我刚刚注意到我的问题从嵌入和加载之间的比较变为是否可以将 swf 文件嵌入和加载到您的 iphone。无论如何,我会接受你的回答并编辑我的原始帖子以适应它。
    • “对。在运行时在您的 iDevice 上不加载外部(例如,某些网站)SWF 是 Apple 的限制;嵌入/编译选项成为 Air IPA 的一部分”这是不正确的。 Apple 仅限制包含 actionscript 的外部 swf。
    • @WendiKidd 请注意,问题和标题已更改了几次。答案是正确的:您无法像在网站上使用 Flash Player 那样加载本地 SWF。 除非将内容编译到应用程序中,否则无法在 i 设备中使用“相对”或“本地”引用加载 SWF(或其他任何内容)。这不适用于某些类型的“远程” SWF 加载,但这不是(原始)问题所涉及的。
    猜你喜欢
    • 2015-11-15
    • 2019-09-03
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 2011-09-15
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    相关资源
    最近更新 更多