例如:
- iOS内购输入完密码之后,切后台,杀进程,如何处理这次的购买
- iOS内购输入完密码之后,还没有交付商品,游戏挂掉了,如何处理这次的购买
- 当用户进入隧道前刚好购买了一个商品,然后进入了隧道,隧道内可能没有网络链接,那么如何处理这次购买
我碰到的问题是,在沙盒环境下,内购输入完密码之后没等系统回调购买成功界面,就切后台杀进程,然后再次打开应用之后系统没有回调任何信息,我的这次购买没有得到金币,而下次点击商店的购买按钮之后,没有弹出商品信息界面,而是直接购买成功。
我已知的情况是,当iOS内购成功后会回调App一些数据,拿着这些数据可以做验单,无论是客户端来做,还是发送到游戏服务器来做,也就是说IAP成功后会从Apple的服务器上拿到商品数据,这个数据是StoreKit拿到之后通过观察者回传给App的,如果在StoreKit拿到数据回传观察者之前进程被杀掉,那么我根据上面的信息我猜想手机系统会把这个数据保存住。下次什么时机随送给App或者App通过什么接口来查询有没有未被消费的数据。
通过阅读Apple Developer官网文档,找到了一些线索 Original API for In-App Purchase https://developer.apple.com/documentation/storekit/original_api_for_in-app_purchase Processing a Transaction https://developer.apple.com/documentation/storekit/original_api_for_in-app_purchase/processing_a_transaction
Make sure that the observer is ready to handle a transaction at any time, not only after you add a transaction to the queue. For example, if a user buys something in your app right before going into a tunnel, your app may not be able to deliver the purchased content if there is no network connection. The next time your app launches, StoreKit calls your transaction queue observer again and your app should handle the transaction and deliver the purchased content. Similarly, if your app fails to mark a transaction as finished, StoreKit calls the observer every time your app launches until the transaction finishes. 翻译成中文 确保在任何时间观察者(SKPaymentTransactionObserver)都能够处理交易,不只是在你添加交易到队列之后。例如,当用户进入隧道前刚好在App内购买了一些东西,如果隧道内没有网络连接你的应用没有能力交付购买的内容。下一次你打开App的时候,StoreKit将会再次调用你的交易队列观察者并且此时你的应用应该处理交易以及下发购买的内容。同样的,当你的App标记一个交易为结束状态失败时,StoreKit会在每次应用打开的时候调用观察者(SKPaymentTransactionObserver)直到这个交易被标记为完成。
也就是说一个交易(transaction)完成的时候,应该把它标记为完成,如果没有被标记为完成每次打开App的时候StoreKit都会通知SKPaymentTransactionObserver
还有文档上说 Always register a transaction queue observer as soon as your app is launched, as shown below. For more guidance, see Setting Up the Transaction Observer for the Payment Queue.
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[[SKPaymentQueue defaultQueue] addTransactionObserver:observer];
}
检查一下我的代码,我是用CocosPods集成的iOS IAP,我没有在这个方法里面注册 transaction queue observer
|