AIR Native Extension实现iOS应用内付费(In-App Purchase)全教程(二)——AIR面向iOS设备的原生扩展
2011-10-08 13:31
811 查看
本文的主要内容如下
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类添加了新的方法。如下例所示:
在这个例子里,ExtensionContext通过静态方法createExtensionContext()来获得一个实例,参数com.adobe.appPurchase是这个扩展的ID,它非常重要,在扩展的配置文件里和应用程序描述文件中都需要用这个ID进行配对。
调用原生类中定义的方法可以用方法call()来实现,由于是同步调用,所以函数可以有返回值。如在原生类中定义的方法finish,可以用下面的代码来调用。
我们还可以给ExtensionContext类添加事件侦听,用来获取从原生类中派发回来的事件。
————————————————————————————
Objective-C
扩展
接下来是原生类的部分,如果你注册成为苹果iOS开发者,那么你可以在苹果开发者网站上免费下载Object-C的开发工具XCode。关于如何注册成为苹果iOS开发者,请参考我的这篇文章,如何成为一个合法的iOS开发者。
总的来说,Objective-C 虽然语法比较奇怪,但只要掌握了基本的规则,还是和ActionScript一样易懂。OBJC扩展类需要引入一个FlashRuntimeExtension.h类包,它实现了和ActionScript沟通的接口。
引入FlashRuntimeExtension.h之后,可以用下面的代码定义一个FREObject方法,FREObject是接口类型。这里要注意,与AS的接口包括函数返回值,都要定义成FREObject类型,比如代码中的retVal。
要把FREObject方法定义成接口,还需要在ContextInitializer方法内进行配置,如下:
而ContextInitializer方法,是在原生扩展类的初始化函数ExtInitializer中指定的:
ExtInitializer是原生扩展的程序入口,它可以通过扩展配置文件extension.xml来定义:
我介绍的这个顺序,实际上就是实际程序编写的思路,先确定接口,再实现连接。 也许有朋友和我一开始接触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发布设置生成。
一切就绪后便可以使用命令行进行打包,注意路径,下例路径为当前文件夹。
————————————————————————————
使用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中,需要对扩展追加一个定义:
这里可以看到,在AS扩展类、扩展配置文件extension.xml和应用描述文件info-app.xml中都指定了一个统一扩展的ID: com.adobe.appPurchase。
利用下面的命令行可以打包生成Main.ipa:
与朋友分享! 113 views
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 2 3 4 5 | import flash.external.ExtensionContext; ... private var ext:ExtensionContext; ... ext = ExtensionContext.createExtensionContext("com.adobe.appPurchase",""); |
调用原生类中定义的方法可以用方法call()来实现,由于是同步调用,所以函数可以有返回值。如在原生类中定义的方法finish,可以用下面的代码来调用。
1 | var result:Object = ext.call("finish"); |
1 2 3 4 56 | ext.addEventListener(StatusEvent.STATUS,onStatus); public function onStatus(e:StatusEvent):void{ switch(e.code){ case "removeTransaction": ... } } |
Objective-C
扩展
接下来是原生类的部分,如果你注册成为苹果iOS开发者,那么你可以在苹果开发者网站上免费下载Object-C的开发工具XCode。关于如何注册成为苹果iOS开发者,请参考我的这篇文章,如何成为一个合法的iOS开发者。
总的来说,Objective-C 虽然语法比较奇怪,但只要掌握了基本的规则,还是和ActionScript一样易懂。OBJC扩展类需要引入一个FlashRuntimeExtension.h类包,它实现了和ActionScript沟通的接口。
引入FlashRuntimeExtension.h之后,可以用下面的代码定义一个FREObject方法,FREObject是接口类型。这里要注意,与AS的接口包括函数返回值,都要定义成FREObject类型,比如代码中的retVal。
1 2 3 4 56 | FREObject finishTransaction1(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[]) { NSLog(@"Finish Transaction Called"); BOOL matchFound = NO; const uint8_t* str = nil; uint32_t len = -1; ...... FREObject retVal; if(FRENewObjectFromBool(matchFound, &retVal) == FRE_OK){ return retVal; }else{ return nil; } } |
1 2 3 4 56 | //这里是需要定义的接口的数量 *numFunctionsToTest = 6; //定义一个FRENamedFunction类型的实例func,初始化函数的个数 FRENamedFunction* func = (FRENamedFunction*)malloc(sizeof(FRENamedFunction)*6); //定义一个接口,name是字符串"getProducts",函数体是getProducts func[0].name = (const uint8_t*)"getProducts"; func[0].functionData = NULL; func[0].function = &getProducts; func[1].name = (const uint8_t*)"startPayment"; func[1].functionData = NULL; func[1].function = &startAppPayment; func[2].name = (const uint8_t*)"finish"; func[2].functionData = NULL; func[2].function = &finishTransaction1; func[3].name = (const uint8_t*)"muted"; func[3].functionData = NULL; func[3].function = &muted; func[4].name = (const uint8_t*)"restore"; func[4].functionData = NULL; func[4].function = &restoreTrans; func[5].name = (const uint8_t*)"trans"; func[5].functionData = NULL; func[5].function = &getTrans; *functionsToSet = func; .... |
1 2 3 4 56 | void ExtInitializer(void** extDataToSet, FREContextInitializer* ctxInitializerToSet, FREContextFinalizer* ctxFinalizerToSet) { NSLog(@"Extension Initialized"); *extDataToSet = NULL; *ctxInitializerToSet = &ContextInitializer; *ctxFinalizerToSet = &ContextFinalizer; } |
1 2 3 4 56 | <?xml version="1.0" encoding="utf-8" standalone="yes"?> <extension xmlns="http://ns.adobe.com/air/extension/2.5"> <id>com.adobe.appPurchase</id> <versionNumber>1</versionNumber> <platforms> <platform name="iPhone-ARM"> <applicationDeployment> <nativeLibrary>libAppPurchase.a</nativeLibrary> <initializer>ExtInitializer</initializer> <finalizer>ExtFinalizer</finalizer> </applicationDeployment> </platform> </platforms> </extension> |
————————————————————————————
使用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中,需要对扩展追加一个定义:
12 | <extensions> <extensionID>com.adobe.appPurchase</extensionID> </extensions> |
利用下面的命令行可以打包生成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 |
相关文章推荐
- AIR Native Extension实现iOS应用内付费(In-App Purchase)全教程(四)——ANE面向IAP的测试和开发
- AIR Native Extension实现iOS应用内付费(In-App Purchase)全教程(四)——ANE面向IAP的测试和开发
- AIR Native Extension实现iOS应用内付费(In-App Purchase)全教程(一)——概览
- AIR Native Extension实现iOS应用内付费(In-App Purchase)全教程(三)——iOS应用内付费简介和准备流程
- 『IOS』应用内(in-app purchase)付费相关记录
- AIR面向iOS设备的原生扩展
- iOS应用内置付费 In-App Purchase 详细介绍(IAP详解)
- AIR面向IOS设备的原生扩展
- AIR Native Extension for iOS 接入第三方sdk 如何实现 AppDelegate 生命周期
- iOS应用内置付费(In-App Purchase)专题
- 实现iOS应用内付费(In-App&nbsp;P…
- AIR面向IOS设备的原生扩展(二)
- [ios][air] AIR面向IOS设备的原生扩展
- IOS应用内购买(In App Purchase)总结
- IOS应用内购买(InApp Purchase)总结
- Unity4.x实现Native App启动Unity,制作混合应用(Integrate Native iOS App into Unity App)
- ios 应用内购买 In-App Purchase
- iOS开发内购教程In App Purchase 需要了解的
- ios应用内购买开发记录教程 ios iap In-App Purchases
- ios 应用内支付(In-App Purchase,沙盒测试,后台验证)