Adobe AIR教程:ANE面向IAP的測試和開發
本文的內容如下:
- 在Native擴展中使用StoreKit框架
- ActionScript擴展
- ANE-IAP開發實例分享
本文用到的工具和設備如下:
Flash Builder 4.5
Flex SDK 4.5.1
Flash Professional CS5.5
AIR SDK 3.0
Xcode 4.1 + iOS SDK 4.3
iPad 1
在Native擴展中使用StoreKit框架
下載安裝XCode 4和iOS SDK之后,讓我們先來了解一下蘋果原生類庫是如何處理應用內付費功能的。iOS SDK中有一個框架叫做StoreKit,它負責應用程序和應用商店的業務流程。StoreKit中有一些負責具體功能的類,商品的請求,請求結果,結果回調,購買,購買隊列等都由不同的類來完成。

圖1 StoreKit的業務流程
如上圖所示,StoreKit解決內付費業務的大體流程可以概括成這樣,SKProductsRequest向商店發出請求獲得商品信息,商店通過回調函數SKProductsRequestDelegate把請求的結果SKProductsReponse傳了回來,如果用戶選擇購買商品,則創建一個SKPayment實例到購買隊列SKPaymentQueue中,然后通過回調SKPaymentTransactionObserver來返回購買的結果。
我現在拿請求商品信息的部分來舉例說明一下:
- SKProductsRequest* req = [[SKProductsRequest alloc] initWithProductIdentifiers:pids];
- req.delegate = observer;
- [req start];
上面的Objective-C的代碼如果轉譯成ActionScript 3.0,相當于這個意思:
- var req:SKProductsRequest = SKProductsRequest.initWithProductIdentifiers(pids);
- req.delegate = observer;
- req.start();
SKProductsRequest繼承于父類SKRequest,通過靜態方法initWithProductIdentifiers和參數pids創建了一個實例req,參數pids是一個數組,列出了需要請求的內付費商品ID。req通過start方法向商店發出請求,并在發出請求的動作之前給自己注冊了一個回調函數observer。
observer是SKProductsRequestDelegate的實例,回調接口如下:
- - (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response;
轉譯成AS是如下的代碼:
- function productsRequest(request:SKProductsRequest, response:SKProductsResponse):void;
其中response就是請求的結果。
下面是一個完整的Objective-C函數體:
- - (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{
- NSLog(@"Products Received");
- NSMutableString* retXML = [[NSMutableString alloc] initWithString:@""];
- for (SKProduct* p in response.products) {
- [retXML appendFormat:@"%@%@%@%@",p.localizedTitle,p.localizedDescription,p.price,[p.priceLocale localeIdentifier],p.productIdentifier];
- }
- [retXML appendFormat:@""];
- for(NSString* s in response.invalidProductIdentifiers){
- [retXML appendFormat:@"%@",s];
- }
- [retXML appendFormat:@""];
- FREDispatchStatusEventAsync(g_ctx, (const uint8_t*)"productsReceived", (const uint8_t*)[retXML UTF8String]);
- [retXML release];
- [request release];
- }
這里主要實現的是將結果格式化成一個XML流,然后通過派發事件傳回給AS擴展類,注意這里派發事件用的是FREDispatchStatusEventAsync方法,它定義在FlashRuntimeExtension.h內部,前文我介紹過,這是負責與AS擴展類通信的類。
在AS類包中,通過注冊的StatusEvent來偵聽這個事件,并從e.level中取得XML流里的商品信息。
- ext.addEventListener(StatusEvent.STATUS,onStatus);
- ...
- function onStatus(e:StatusEvent):void{
- switch(e.code){
- case "productsReceived":
- var xml:XML = new XML(e.level);
- ......
- }
- }
購買的業務流程和請求信息的流程十分相似,這里我不一一介紹,大家可以在***下載項目的代碼來查看。
ActionScript擴展
在Saumitra提供的ANE擴展類中,AS部分的結構是這樣的:
com.adobe.nativeExtensions.AppPurchase;
com.adobe.nativeExtensions.AppPurchaseEvent; com.adobe.nativeExtensions.Base64; com.adobe.nativeExtensions.Product; com.adobe.nativeExtensions.Transaction; |
其中AppPurchase負責業務流程以及與Native擴展的接口,AppPurchaseEvent定義了各種StatusEvent的狀態,Product和Transaction定義了數據模型,Base64負責為參數轉碼。整個擴展類庫簡單易懂,我會在下面的項目實例中介紹其中用到的一些方法。
ANE-IAP開發實例分享
***總結本系列教程所有的知識來做一個例子。
我首先做的準備是在iTunesConnect中創建了一個新的應用,并新建了四個內付費商品:plane(非消耗型),diary(非消耗型),bottle(消耗型),key(消耗型)。我希望在iPad的沙箱環境中測試以下的業務流程:
請求商品信息,購買消耗型和非消耗性商品,恢復非消耗型商品的購買狀態,如果都成功則我的應用調試成功。
分析一下這個應用的UI需求,我需要一個按鈕來觸發請求商品信息的動作,然后需要一個列表來顯示商品信息,接下來需要給每個商品添加一個購買的按鈕。由于iPad上無法用trace等debug方法調試,所以我還需要一個監測的窗口來打印所有的流程信息。
下面是該應用的截屏:

圖2 請求商品列表

圖3 顯示商品信息

圖4 恢復非消耗型商品的購買狀態

圖5 購買新的消耗型商品

圖6 輸入測試用戶密碼

圖7 購買成功
資源:
實例ANE-IAP(包括AS擴展類,Native擴展類)下載
如何使用本例:
開發者需要使用自己的證書和設備來打包和發布,有關如何打包ANE和如何發布IPA,我已經在這個系列教程的前文提到過了,本文不做重復介紹。
注意事項:
1,本例使用Flash Professional作為Compiler,使用Flash Builder作為代碼編輯IDE,請在Flash Professional的發布設置中選擇Flash Player,并在發布的時候忽略這個錯誤: VerifyError: Error #1014: Class flash.external::ExtensionContext could not be found。直接使用生成的SWF即可。
2,在iPad上測試之前務必要先注銷已經登陸的蘋果帳號,注銷方法為,進入系統偏好設置,在左邊列表內點擊Store圖標,然后點擊在右側出現的帳號,再在彈出的窗口中點擊”注銷“。
3,如果你沒有用過XCode,不知道如何發布OBJC項目,請在安裝XCode之后打開下載的Native擴展包里的AppPurchase.xcodeproj文件,項目打開后按Command+B,在左邊項目資源列表的Products文件夾內會生成一個.a文件,右鍵點擊后可以在Finder中找到這個文件。
總結:
本文所提供的例子,只是應用內付費的入門,如果要做真正的產品,你需要搭建自己的服務器用來驗證購買商品的收據,以及在本地記錄商品的使用狀態并與服務器同步等等。這些知識不是本文的重點,這里不做詳細介紹,感興趣的朋友可以和我做進一步的探討。謝謝各位!