教程说明:以下教程为针对使用 Adobe 官方工具 Flash 与 Flex 的开发者用户,或者使有纯 AIR SDK 的用户,教程将尽可能的简单化,不会加入其它不相关的内容。如果对教程中的步骤有任何疑问,请直接登录网站后台留言提交问题(在线客服仅提供软件功能介绍、杂志制作指导、购买咨讯、用户名和邮箱找回等服务,但不包括其它公司开发类工具介绍,或编程语言语法或算法相关的介绍;因以下内容属于开发类技术,已超出本站在线客服所能提供的在线技术支持范围,请勿必在后台提交将由本站技术人员直接回复)。

如果用户还未阅读过《利用 FLASH SWF 文件打包&转换 iOS APP 基础知识介绍》篇,可能还不了解“打包方式”和“转换方式”生成 ipa 文件的区别。不过没有关系,因为这里只会讲述“打包方式”生成 ipa 文件的 APP 具体步骤,只需谨记——如果需要提交到苹果官方网站 APP Store,就必须使用苹果官方正版的开发者证书,并且必须使用“转换方式”生成 ipa 文件,而不能使用“打包方式”生成 ipa 文件;如果只需发布到第三方平台或临时分发或真机测试,那么仍然可以使用打包方式生成 ipa 文件(如果对“打包”和“转换”两种方式生成的 ipa 文件的差别感兴趣,可以阅读那篇基础知识介绍)。


更多的准备工作
1、下载 PDF2SWF Pages Suite V9.5.8.1 以上版本。虽然 9.0 版本开始已经加入了静态阅读器,但配置文件并不存在于库文件,只是以内嵌的方式存在;最新的 V9.5.8.1 以及以后的版本,静态阅读器中所有的元件都为库的原生元件,而配置文件也直接以 ActionScript3 (以下简称 AS3)原生类的形式存在(这些原生的元件和代码也会提高静态阅读器的执行效率)。

2、因为是嵌入式开发,所以首先要有被嵌入的资源文件。这一步是最简单的,利用 PDF2SWF Pages 一键转换功能,将 PDF 转换成 FLASH 文件(请注意转换模式是静态嵌入式阅读器,即转换后是一个独立的SWF文件)。有了用于被嵌入的资源文件(为了方便介绍,将该文件名指定为 pages.swf,并保存在一个空白的文件夹中),便可以使用 Adobe 官方工具进行创建 APP 了——即创建 iOS 的 *.ipa 文件。为了教程的通用性,无论是 Flash、 Flex,或者用第三方开发环境如 Haxe、 FDT 或 FD 等工具生成的 *.swf 文件,所以这里只介绍 AIR SDK 命令行的方式。

3、由于“转换”过程会使用 AOT 编译模式,将所有 AS3 的代码全部自动转换成 Object-c (以下称简 Obj-c)的代码,对所有包含 AS3 的 *.swf 文件都会重新编解码,所以转换过程时间会较长,并且对转换使用的计算机硬件也有较高的要求——即开发者必须具备 2G 以上内存的计算机一台,否则转换过程中可能会出现内存不足或 SDK 工具意外中止的情况。

4、更多关于 iOS 应用开发时的限制知识需了解。iOS 虽然解除了开发工具限制令,允许使用任意工具进行创作和开发,但 iOS 原生技术存在的限制并没有解除(即 Obj-C 语言开发时本身存在的限制),比如每个 APP 只允许一个应用域,不允许运行动态加载代码等,这些限制是因为本身 Obj-C 语言的限制,并非是针对 AS3 的,因为 Obj-c 不存在多个应用同时运行在一个播放器进程中的概念,也不存在一个应用加载应一个应用代码的概念等等。


教程与样例代码
事实上,只要使用 Adobe 官方工具进行嵌入式开发,无论是桌面系统,还是移动设备系统都大同小异,甚至完全相同,比如 Windows ,MAC OS ,Android ,以及 BlackBerry 等系统,因为生成后的原生应用包含的资源文件 *.swf 完完全全以标准的 SWF 文件格式存在,包括通过“打包”方式创建 iOS 的 APP也是完全一样的过程和代码;只有通过“转换”方式创建 iOS 的 APP 时稍有不同,因为它会将 *.swf 中 AS3 的代码全部提取后转变成 iOS 原生的本机语言 Obj-c 的代码。所以根据以上“准备工作”的第4点,AS3 代码会稍稍有些不同——

下面通过一个 Loader 类作为样例代码演示,它与 Android 的 APP 的 AS3 代码部份基本相同,但在 load() 方法多了一个 LoaderContext 对象,用于指定单个的应用域。如上所述,这是 iOS 和 Obj-c 本身存在的限制,并不是 AS3 的限制(从 Flash 开发人角度来看,这更像是 Obj-c 开发语言的缺陷,因为它是不存在多个应用在运行时相互加载的情况):


import flash.net.URLRequest;
import flash.display.Loader;
import flash.system.LoaderContext;
var loaderContext:LoaderContext = new LoaderContext(false,ApplicationDomain.currentDomain,null);
loaderContext.allowCodeImport = true;
var loader:Loader = new Loader();
loader.load(new URLRequest("pages.swf"),loaderContext);
this.addChild(loader);

其它更多的样例代码可参考《Android 系统的翻页电子杂志 APP 的简单制作教程》中的样例代码,无论是 load() 方法或 loadBytes(),都只需传递一个 LoaderContext  对象即可,applicationDomain 属生指向当前应用域即可。

而 ADT 的命令行参数 -target 只需传入一个 AOT 编译模式的值(AOT 编译模式的值可以是 ipa-ad-hoc ,ipa-app-store,ipa-debug,ipa-test,每一个值的说明请参考 Adobe 官方联机帮助的参数部份。但如果需要提交到苹果官方的 APP Store,那么这值必须是 ipa-app-store)。然而如果将转换后的资源文件作为唯一的主文件来使用时,它与转换方式与打包方式创建 iOS APP 的过程是完全一样的,只是的 ADT 的打包参数 -target 不再是 ipa-test-interpreter,而是改成 AOT 编译模式的任意一个值


备注
1、至少到目前为止,苹果官方在申核 APP 时不允许使用打包方式创建的 *.ipa 文件,因为苹果官方在审核 APP 时只允许 Obj-c 创建的应用。既便是使用其它跨平台开发,如 Delphi、C++等,在编译之后其实也全部转换成了 iOS 本机代码 Obj-C,而 AIR SDK 也是利用了 AOT 编译技术将 AS3 的代码全部转换成了 Obj-c 代码,*.swf 文件在转换之后,只包含了库元件的资源部份,而不再包含 ABC 码。

2、但备注1中会有例外——即如果与苹果官方签定了书面协议,那么仍然是可以使用打包方式创建 *.ipa 文件,并在提交到 APP Store 后,是允许被通过审核的;但如果是中小型的项目是签不到这种协议的,所以使用本教程中的转换方式可以避免签书面协议的申请,可以直接通过开发者帐户提交到 APP Store。

3、如果开发者使用了 Flex UI 框架组件部份,或正在使用第三方的组件框架,造成与资源文件冒泡事件冲突,请参考《Android 系统的翻页电子杂志 APP 的简单制作教程》中第四种方法,取消事件流的冒泡过程;如果是用户自定义的组件框架,也可以简单的通过直接修改自定义的事件名称来避免与资源文件的冒泡事件冲突。




 

友情链接 | 技术支持 | Copyright © 2008-2013 残象制作组 <The Incredible Image Workroom>