看了一些网上教程,基本上是老版本的了。我针对本身遇到的一些问题,结合官方文档把IAP(In-App Purchase)过程梳理了一下。 P.S. 官方文档才是王道!html
应用内购买要和App Store发生交互,这里在正式编写代码前须要作几个工做。ios
收费App、含应用内购买的App等有付费功能的须要完善这部分信息。 1. 进入iTunes Connect服务器
iTunes Connect是苹果提供的一个平台,主要提供App发布和管理App的,最重要的功能是建立管理项目信息,项目付费产品(道具)管理、付费的测试帐号、提交App等等。 2. 进入协议、税务和银行业务app
这一部分具体能够参照这篇[iOS App提交指南(二)-协议、税务和银行业务](http://www.jianshu.com/p/c7cf65911bc1)
进入iTunes Connect异步
进入个人App ide
新建App测试
这里说一下,套装ID就是Bundle ID,保证和Xcode项目中的Bundle ID一致。其实不晓得填的地方点击那个小问号就有提示了。(我不知道为嘛要截这么多图,或许会让文章显得亲切点😄) ui
对了,新建App时要保证应用内购买的功能时勾选上的。编码
建好支持应用内购买的App后,就能够该App可购买的商品了。.net
建立App内购买项目
依次点击*{建立的App名}* -> 功能 -> App内购买项目 -> +
选择项目类型
通常对项目来讲大多数都是选择“消耗型项目”这个种类,好比游戏中购买虚拟货币等。具体区别请看这里
3. 项目摘要  - 参考名称:商品名称,能够根据商品等实际意义填写,不会显示在App Store - 产品ID:要求惟一性,能够用App的Bundle ID加后缀表示 - 价格等级:苹果的销售商品不能随意订价,按等级选择合适的便可。点击*查看价格表*能够看到各等级价格,以及商品卖出后你的实际收益。  其中**CNY**为人民币 4. 项目详情  - 语言:至少添加一种语言的项目描述 - 审核备注:我填了测试帐户信息 - 屏幕快照:按要求上传,我传的是支付页面的屏幕截图 5. 等待审核  **!这个状态下已经能编码对相应商品就行购买测试了,*审核经过*的状态得等到App提交后才行**
1. 进入**用户与职能** 2. 点击**沙箱技术测试员** 3. 点击**+**添加新帐号 ***注意:*** - 帐号记不住密码就删除,再用不一样的邮箱从新建立 - 帐号建立后不能被修改 - 沙盒测试帐户被删除后,该Apple ID也不能再用做*沙盒测试用户*和*iTunes Connect用户* - 帐号邮箱能够是随意编造 - ***该帐号不能用来在正式的App Store上登陆,只用于测试环境下***
总的来讲,交互分为三个阶段:
!在Xcode中要加入StoreKit.framework
// Load the product identifiers fron ProductIds.plist NSURL *plistURL = [[NSBundle mainBundle] URLForResource:@"ProductIds" withExtension:@"plist"]; NSArray *productIds = [NSArray arrayWithContentsOfURL:plistURL];
这里的product id就是在**iTunes Connect**中建立的应用内购买项目的ID。
// Create a product request object and initialize it with our product identifiers SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithArray:productIds]]; request.delegate = self; // Send the request to the App Store [request start];
这里由StoreKit发起异步请求。
-(void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response { ... }
SKMutablePayment *payment = [SKMutablePayment paymentWithProduct:product]; [[SKPaymentQueue defaultQueue] addPayment:payment];
SKPaymentQueue会自动向App Sotre 提交购买请求。
// Attach an observer to the payment queue [[SKPaymentQueue defaultQueue] addTransactionObserver:[StoreObserver sharedInstance]];
demo中是在App启动时就添加了监听器。 主要实现的方法是下面这个更新用的:
// Called when there are trasactions in the payment queue -(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions { for(SKPaymentTransaction * transaction in transactions) { switch (transaction.transactionState ) { ... // 购买成功 case SKPaymentTransactionStatePurchased: ... break; // 恢复交易 case SKPaymentTransactionStateRestored: ... break; // 购买失败 case SKPaymentTransactionStateFailed: ... break; default: break; } } } ```
Restore这种交易状态是恢复。若是有些人在iPhone上用一个帐号购买了一个产品,那么在iPad上又下载了这个应用,就不须要从新购买了。经过Restore在App Store中检测你这个帐号的购买记录,若是有购买记录存在,那就不用再次购买了,直接恢复,就会出现restoreTransaction。关于 商品恢复,请点击: 会打断app工做流,不该该每次启动时执行,应该让用户本身触发
finishTransaction
方法