Cocos2d-x使用iOS游戏内付费IAP(C++篇)
前期准备设备与账号在开始编码之前我们需要准备测试环境。
本文不涉及IDP申请流程和真机调试设置,重点解析IAP相关的设置。 新建IAP付费条目新建app ID登录iOS Dev Center,点击“Certificates,Identifiers & Profiles->Identifiers->App IDs”,切换到App IDs界面,再点击“+”新建用于测试的AppID,默认设置”In-App-Purchase”已开启,如下图所示:
创建发布程序无IAP的iOS App的真机测试是不需要下面的步骤的,而有IAP的则不同,需要先建立发布程序,设置好IAP信息才能测试相关的功能。 登录iTunes Connect,切换到“Manage Your Apps ”,点击“Add New App”新建一个待发布程序, Bundle ID选择刚才创建的App ID。 接下来的程序信息界面可随意填写,截图可使用符合大小要求的假图,先保证能创建成功、可测试,等到需要正式提交审核的时候再修改成最终截图。 为发布程序新建IAP付费项目点击刚才创建完成的App进入“App Information”界面,再点击“Manager In-App Purchases”进入IAP管理界面。 我们点击左上角的“Create New”来新建一个IAP付费项目,接下来的Select Type界面会有5中IAP类型可供选择。如图:
前两种是主类型: 游戏中使用得最多的就是“购买游戏币”了,我们这里只关注Consumable类型,可多次购买。 更多其他类型的信息可查询StoreKitGuide.pdf。 选择“Consumable”,进入详细信息设置界面。 Product ID全服唯一,起个自己觉得舒服的名称, 一般建议:Bundle ID + IAP description. Language需要至少一种,选择“English”,方便测试。 当完成IAP付费项目的新建后,回到“Manager In-App Purchases”界面,可以看到下面的信息。 你可以随时修改已存在的项目,即使在游戏上线后也能修改(Product ID除外),这样可以在不发布新程序的情况下,做一些促销活动。 新建IAP付费测试账号IAP的测试至关重要,你肯定不想给钱测试,被苹果扣掉30%。苹果的SandBox提供了一整套测试相关的服务。依然在iTunes Connect中设置。 点击“Manage Users->Test User”进入测试账号添加界面,点击左上交的“Add New User”,填入Email等信息。
到此,前期准备工作都已完成,你也许需要等待几个小时让iTunes Connect设置生效,以便代码能获取到IAP信息,接下来我们正式进入代码阶段。 IAP的C++封装新建项目使用tool下的create_project.py创建项目,注意project ID 必须填写为上面我们申请的APP ID,这样真机调试才能取到我们设置的IAP信息。 C++开发的游戏,付费点直接使用Object-c的IAP接口会有诸多不便,在StoreKit基础上再封装一层C++接口会方便很多。新建IOSiAP.h和IOSiAP.mm两个文件,加入到Xcode工程。mm文件为C++和Object-c混编文件,可在里面实现两种语言的互相调用。 IAP付费流程与接口抽象如下图所示: 首先,IAP付费首先需要客户端发起请求,获取服务器上的IAP条目信息。之所用需要这个步骤,是因为iTunes Connect后台可以修改付费条目的价格、说明等信息。 然后,客户端根据获取到的IAP条目信息展示UI,当用户点击支付后发起payment请求。 最后,等待payment的回调响应。如果成功,游戏币增加;如果失败,UI提示给用户。 从付费流程,我们可以看出需要3个接口:
具体在IOSiAP.h中的抽象如下: class IOSiAP { public: IOSiAP(); ~ void requestProducts(std::vector &productIdentifiers);IOSProduct *iOSProductByIdentifier::stringidentifier paymentWithProduct(iosProduct, int quantity = 1 IOSiAPDelegate*delegate // === internal use for object-c class ===skProducts;// object-c SKProductskTransactionObserver// object-c TransactionObserver stdvector iOSProducts}; 其中的identifier是IAP付费项目的“Product ID”。 IOSProduct是一个简单的数据类,存放Product information。 productIdentifier localizedTitle localizedDescription localizedPrice// has be localed,just display it on UI.bool isValid index//internal use : index of skProducts IOSiAPDelegate是消息回调通知类,由具体的调用者来实现。typedefenum IOSIAP_PAYMENT_PURCHASING// just notify,UI do nothing IOSIAP_PAYMENT_PURCHAED// need unlock App Functionality IOSIAP_PAYMENT_FAILED// remove waiting on UI,tall user payment was failed IOSIAP_PAYMENT_RESTORED// need unlock App Functionality,consumble payment No need to care about this. IOSIAP_PAYMENT_REMOVED// remove waiting on UI}IOSiAPPaymentEvent virtualIOSiAPDelegate(){}// for requestProduct onRequestProductsFinish(void)0 onRequestProductsError code// for payment onPaymentEventIOSiAPPaymentEventevent 其中的前两个消息是requestProducts()的消息回调,最后一个是payment的回调。而payment又分5种状态。 要点如下:
下面我们看下iAPProductsRequestDelegate是如何桥接的。 @interface iAPProductsRequestDelegate NSObject @propertynonatomic assigniosiap@end 实现SKProductsRequestDelegate的协议接口。 @implementation iAPProductsRequestDelegate -productsRequest:(*)request didReceiveResponseSKProductsResponseresponse // release oldif_iosiap->[(NSArray*)( release// record new product _iosiapskProducts responseproducts retain index ltproducts count SKProductskProduct products objectAtIndexindex // check is valid isValid trueinvalidIdentifier in responseinvalidProductIdentifiers NSLog(@"invalidIdentifier:%@" invalidIdentifier ([skProductproductIdentifier isEqualToStringinvalidIdentifier]) isValid false break iosProduct newIOSProduct iosProductproductIdentifier stdstringproductIdentifier UTF8String]);localizedTitle localizedTitle UTF8StringlocalizedDescription localizedDescription UTF8String// locale price to stringNSNumberFormatterformatter formatter setFormatterBehavior:NSNumberFormatterBehavior10_4formatter setNumberStyleNSNumberFormatterCurrencyStyleformatter setLocalepriceLocalepriceStr formatter stringFromNumberpriceformatter releaselocalizedPrice priceStr UTF8String iosProductindex isValid _iosiapiOSProductspush_back requestDidFinishSKRequestrequest ;onRequestProductsFinishrequestrequest releaserequest didFailWithErrorNSErrorerror "%@" erroronRequestProductsErrorerror code 解析如下: Where to Go你可以在这里获取到本文的源码,把工程放到Cocos2d-x 3.0 beta下的projects目录下即可运行使用。 这里没有提及接口测试,我们将在下一章JSB篇中讲解。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |