`

Adobe AIR教程:面向iOS设备的原生扩展

ane 
阅读更多

来自 51CTO:http://mobile.51cto.com/others-302272.htm

本文的主要内容如下

AIR Native Extension介绍

ANE的组成部分

ActionScript 3.0扩展

Objective-C 扩展

使用ADT打包ANE

使用ADT打包IPA

AIR Native Extension介绍

AIR Native Extension (ANE)是AIR 3.0的一项重要特性,简单的说,它允许AIR应用程序通过扩展文件与原生应用程序类库相互通讯,从而让AIR应用实现一些只有原生程序才可以做到的功能。

在ANE出现以前,移动平台上的AIR对系统的访问非常有限,功能的实现都是封装在封闭的,由Adobe定义好的ActionScript 3.0 API内,比如Accelerometer, GeoLocator等AS类。ANE则将AIR彻底开放出来,AIR不再针对具体的功能提供封闭的API,而是允许开发者通过AIR的扩展机制自由调用使用原生语言开发的类库。这样可以让AIR应用程序享有与原生应用程序同等的机会,其意义对Flash技术来说是划时代的。

ANE的组成部分

ANE支持向Windows、Mac OSX、Android和iOS各个平台原生应用程序的扩展,本文只针对iOS平台进行介绍。在iOS平台中,ANE的组成部分基本分为ActionScript 3.0扩展类库和Objective-C原生扩展类库两个部分,这两个部分打包后生成AIR扩展文件(.ane),最后和AIR应用程序一起打包成iOS原生应用IPA文件。如下图所示。

 

图1 ANE的组成部分

ActionScript 3.0扩展

ANE的AS扩展部分是一个SWC,AIR 3.0 SDK里为flash.external.ExtensionContext类添加了新的方法。如下例所示:

  1. import flash.external.ExtensionContext; 
  2. ... 
  3. private var ext:ExtensionContext; 
  4. ... 
  5. ext = ExtensionContext.createExtensionContext("com.adobe.appPurchase",""); 

在这个例子里,ExtensionContext通过静态方法createExtensionContext()来获得一个实例,参数com.adobe.appPurchase是这个扩展的ID,它非常重要,在扩展的配置文件里和应用程序描述文件中都需要用这个ID进行配对。

调用原生类中定义的方法可以用方法call()来实现,由于是同步调用,所以函数可以有返回值。如在原生类中定义的方法finish,可以用下面的代码来调用。

  1. var result:Object = ext.call("finish"); 

我们还可以给ExtensionContext类添加事件侦听,用来获取从原生类中派发回来的事件。

  1. ext.addEventListener(StatusEvent.STATUS,onStatus); 
  2. public function onStatus(e:StatusEvent):void{ 
  3. switch(e.code){ 
  4. case "removeTransaction": 
  5. ... 
  6. } 

Objective-C 扩展

接下来是原生类的部分,如果你注册成为苹果iOS开发者,那么你可以在苹果开发者网站上免费下载Object-C的开发工具XCode。关于如何注册成为苹果iOS开发者,请参考我的这篇文章,如何成为一个合法的iOS开发者。

总的来说,Objective-C 虽然语法比较奇怪,但只要掌握了基本的规则,还是和ActionScript一样易懂。OBJC扩展类需要引入一个FlashRuntimeExtension.h类包,它实现了和ActionScript沟通的接口。

引入FlashRuntimeExtension.h之后,可以用下面的代码定义一个FREObject方法,FREObject是接口类型。这里要注意,与AS的接口包括函数返回值,都要定义成FREObject类型,比如代码中的retVal。

  1. FREObject finishTransaction1(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[]) { 
  2. NSLog(@"Finish Transaction Called"); 
  3. BOOL matchFound = NO
  4. const uint8_t* str = nil
  5. uint32_t len = -1; 
  6. ...... 
  7. FREObject retVal; 
  8. if(FRENewObjectFromBool(matchFound, &retVal) == FRE_OK){ 
  9. return retVal; 
  10. }else{ 
  11. return nil; 

要把FREObject方法定义成接口,还需要在ContextInitializer方法内进行配置,如下:

  1. //这里是需要定义的接口的数量 
  2. *numFunctionsToTest = 6
  3. //定义一个FRENamedFunction类型的实例func,初始化函数的个数 
  4. FRENamedFunction* func = (FRENamedFunction*)malloc(sizeof(FRENamedFunction)*6); 
  5. //定义一个接口,name是字符串"getProducts",函数体是getProducts 
  6. func[0].name = (const uint8_t*)"getProducts"; 
  7. func[0].functionData = NULL
  8. func[0].function = &getProducts; 
  9. func[1].name = (const uint8_t*)"startPayment"; 
  10. func[1].functionData = NULL
  11. func[1].function = &startAppPayment; 
  12. func[2].name = (const uint8_t*)"finish"; 
  13. func[2].functionData = NULL
  14. func[2].function = &finishTransaction1; 
  15. func[3].name = (const uint8_t*)"muted"; 
  16. func[3].functionData = NULL
  17. func[3].function = &muted; 
  18. func[4].name = (const uint8_t*)"restore"; 
  19. func[4].functionData = NULL
  20. func[4].function = &restoreTrans; 
  21. func[5].name = (const uint8_t*)"trans"; 
  22. func[5].functionData = NULL
  23. func[5].function = &getTrans; 
  24. *funcfunctionsToSet = func; 
  25. .... 

而ContextInitializer方法,是在原生扩展类的初始化函数ExtInitializer中指定的:

  1. void ExtInitializer(void** extDataToSet, FREContextInitializer* ctxInitializerToSet, 
  2. FREContextFinalizer* ctxFinalizerToSet) { 
  3. NSLog(@"Extension Initialized"); 
  4. *extDataToSet = NULL
  5. *ctxInitializerToSet = &ContextInitializer; 
  6. *ctxFinalizerToSet = &ContextFinalizer; 

ExtInitializer是原生扩展的程序入口,它可以通过扩展配置文件extension.xml来定义:

  1. com.adobe.appPurchase 
  2. libAppPurchase.a 
  3. ExtInitializer 
  4. ExtFinalizer 

我介绍的这个顺序,实际上就是实际程序编写的思路,先确定接口,再实现连接。 也许有朋友和我一开始接触OBJC的时候一样,对这些代码一头雾水。没有关系,在这篇教程里我只是对流程做简短的介绍,具体的代码解析会在本系列的最后一篇教程里做更详细的讲解。那么接下来让我来介绍下一个部分,打包扩展。

使用ADT打包ANE

在图1中,我介绍了.ane文件的组成,它包括了AS类库(.swc)和原生类(.a)两个部分,以及刚才我们介绍的这个扩展配置文件extension.xml。那么要打包ane我们还需要哪些文件呢?

 

图2 打包ANE所需要的文件

如图2所示,所选择的文件以及文件夹就是打包ANE所需要的所有文件,它包括:

1,AIR SDK打包应用程序和类库(bin,lib)

2,ActionScript扩展类包.swc,如图ANE_IAP_ASLib.swc

3,ActionScript扩展类包.swf,如图library.swf,可以通过将SWC的文件扩展名改成ZIP后解压缩得到。

4,Objective-C扩展类包.a,如图libAppPurchase.a,可以通过在Xcode中编译项目得到。

5,扩展配置文件XML,如图extension.xml

6,一个打包证书,如图selfsigned.p12,可以通过Flash CS5的AIR发布设置生成。

一切就绪后便可以使用命令行进行打包,注意路径,下例路径为当前文件夹。

  1. bin/adt -package -storetype pkcs12 -keystore selfsigned.p12 -storepass 1234 -target ane ext/InApp.ane extension.xml -swc ANE_IAP_ASLib.swc -platform iPhone-ARM library.swf libAppPurchase.a 

使用ADT打包IPA

.ane文件打包成功后,便可以用来打包IPA文件,也就是iOS应用程序包。如果你对开发iOS应用的必要流程还不很清楚,请参阅我的这篇教程,如何使用iOS开发者授权以及如何申请证书。我以前介绍过如何用Flash Professional CS5打包IPA,今天主要介绍如何用AIR SDK的打包工具ADT来生成含有ANE扩展的IPA。

 

图3 使用ADT生成含有ANE扩展的IPA所需要的文件

如图3所示,所选择的文件就是生成IPA的必要文件:

1,应用程序文件SWF,如图是ANE_IAP_Example.swf。

2,开发者设备授权文件.mobileprovision,如图是ghostbride_dev.mobileprovision。

3,开发者签名证书文件.p12,如图是jameslidevelopment.p12。

4,应用程序描述文件XML,如图是info-app.xml。

5,扩展包路径,如图是ext

6,如果应用程序有图标图片,还需要图标文件夹,如图是icon

在应用描述文件XML中,需要对扩展追加一个定义:

  1. com.adobe.appPurchase 

这里可以看到,在AS扩展类、扩展配置文件extension.xml和应用描述文件info-app.xml中都指定了一个统一扩展的ID: com.adobe.appPurchase。

利用下面的命令行可以打包生成Main.ipa:

  1. bin/adt -package -target ipa-test-interpreter -provisioning-profile ghostbride_dev.mobileprovision -storetype pkcs12 -keystore jameslidevelopment.p12 -storepass 1234 Main.ipa info-app.xml ANE_IAP_Example.swf -extdir ext icon 
分享到:
评论

相关推荐

    as3 adobe air ios airplay

    adobe air 连接 airplay功能

    dreamweaver的adobe air扩展Adobe_AIR.mxp

    dreamweaver的adobe air扩展Adobe_AIR.mxp

    ADOBE AIR 教程

    ADOBE AIR教程,初步了解ADOBE AIR的应用,与前途。

    AdobeAIR入门教程

    AdobeAIR入门教程,adobe公司内部资料,值得学习。

    Adobe AIR开发教程

    一本关于FLEX adobe AIR 开发的入门书籍。很适合刚接触AIR开发的人。挺不好找的。

    构建Adobe AIR应用程序

    构建 ADOBE® AIR® 应用程序 目录 第 1 章: Adobe AIR 简介 第 2 章: Adobe AIR 安装 安装 Adobe AIR 删除 Adobe AIR 安装和运行 AIR 范例应用程序 Adobe AIR 更新 第 3 章: 使用 AIR API 特定于 AIR 的 ...

    Advertising-ANE:Adobe Air 的广告原生扩展

    Adobe Air 的广告原生扩展 此广告 ANE 添加了对使用 Adob​​e Air 的所有主要移动系统和流行广告网络的支持。 支持IOS、安卓和Kindle。 由带给您。 感谢我们的支持者。 Michał Moczyński 马库斯弗雷泽 德怀特....

    adobe air3.1本机扩展开发的中文开发手手册

    adobe air3.1最新关于本机扩展开发的中文开发手手册,使air突破actionscript限制,可使用c语言和java开发本机扩展。

    system-ane:移动系统 AIR 原生扩展

    用于核心移动系统 API 的 AIR 本机扩展 获取设备标识符 发送消息(日志、通知) 监听传感器 先决条件 JDK(通用) 设置JAVA_HOME环境。 变量是必不可少的 Gradle(普通) 设置GRADLE_HOME环境。 变量是必不可少...

    Adobe air官方中文开发教程

    Adobe air官方中文开发教程,供大家一起参考学习。

    adobe air 安装包part1

    adobe air 安装包part1adobe air 安装包part1adobe air 安装包part1adobe air 安装包part1

    Adobe AIR技术学习

    Adobe AIR技术学习Adobe AIR技术学习

    AdobeAIR.dmg

    AdobeAIR.dmg

    Adobe Air 入门教程

    1、创建 Adobe AIR 文件 2、设置 Adobe AIR 发布设置3、 3、预览 Adobe AIR 应用程序 4、调试 Adobe AIR 应用程序 5、创建 AIR 应用程序和安装程序文件 6、创建自定义应用程序描述符文件 7、对应用程序进行签名

    adobeAir开发工具

    通过 Adobe AIR 运行时,开发人员可以将同一代码打包到 Windows 和 Mac OS 桌面设备以及 iOS 和 Android 设备的原生应用程序和游戏中,范围覆盖 5 亿多台设备上的 10 亿多桌面系统和移动应用程序商店。

    AdobeAIR_mac

    利用 Adobe® AIR® 技术,开发人员可以创建和打包跨平台游戏/适用于 iOS、Android、Windows 和 Mac OS 等主要平台的应用程序。

    针对 HTML 开发人员的 Adobe AIR 1.1 语言参考

    针对 HTML 开发人员的 Adobe AIR 语言参考包括 Adobe AIR API 的详细信息。Adobe AIR API 通过 window.runtime 对象可以用于基于 HTML 的 AIR 应用程序中的 JavaScript 代码。您还可以通过 air 对象引用这些类,即在...

    IOSStatusBarAne:ios 状态栏刷新 (objective-c) 空中移动应用程序 (as3,flex) 的原生扩展

    :) ios 状态栏使用 ane 文件刷新本机扩展。 ios7 状态栏错误解决方案已修复。 ios7 cameraroll as there after status bar not refresh 修复了错误解决方案。 Adobe Air i0S7 StatusBar Overlays 阶段,修复了 Adob...

    adobe air 安装包part2

    adobe air 安装包partadobe air 安装包part

    Adobe AIR_3.2.0

    AdobeAIR是最新的播放器为用户提供方便

Global site tag (gtag.js) - Google Analytics