在刚开始做内购的时候,就听我们老大说要处理好购买中断问题,就是用户已经支付过钱但是你们的服务器没有向苹果服务器发送验证,这个要是不处理好就可能上不了线的。
当时也是对这个很头疼,于是就问同学要了个教程,是himi的http://www.himigame.com/iphone-cocos2d/550.html,里面讲得很清楚,但是里面还是没有讲到对消耗品的中断处理问题,后来在测这个的时候,自己模拟中断的情况,就老是显示的是您已经购买了此程序内购买(In App Purchase)项目,但尚未下载问题,有的时候点击过后还购买了两次,后来在自己打断点调试后发现了一个很重要的问题就是监听是何时执行的。
添加监听就是这行代码SKPaymentQueue defaultQueue] addTransactionObserver:self,这行代码很关键,我当时是在点击购买的按钮时进行执行的这行代码,点击购买后从苹果服务器将产品接收过来直接发送购买请求,如果这次购买中断了,下一次再次点击购买的时候会,再次发送购买请求,这个时候通常会显示 “您已经购买了此程序内购买(In App Purchase)项目,但尚未下载” 这个错误。当我购买中断后苹果能检测到这个未完成交易,但是他只返回了个错误然后什么也不做吗?最后发现,苹果果然进行了处理,就是在添加监听后,苹果发现如果有未完成的交易自己会马上执行paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions然后 transaction.transactionState = SKPaymentTransactionStatePurchased;
是一个交易完成时返回的结果,然后我又发起了一个购买请求,也就是为什么我模拟中断后点击购买会买了两次的原因了。所以这个SKPaymentQueue defaultQueue] addTransactionObserver:self添加监听的代码要在只要进入购买界面或者是刚进入应用程序的时候就要写了。
我是在点击购买后又发起了一个购买请求是完全错误的。这个只要知道监听是何时进行的和苹果对中断所做的处理内购是很简单的,但是我找了很长时间也没有个教程很明白的,所以就自己研究的。以上都是我自己对苹果iap内购机制的理解,不知道是不是正确的,望大神们多指教。