我已在我的应用程序中实施了针对应用内购买的额外收据验证(受https://developer.apple.com/library/ios/#releasenotes/StoreKit/IAP_ReceiptValidation/_index.html启发)。 因此,在我获得SKPaymentTransactionStatePurchased之后,我执行此验证,并且在成功时,我解锁了游戏的新内容,最后,我完成了交易
[[SKPaymentQueue defaultQueue] finishTransaction:myTransaction];
如果由于互联网连接失败或用户在验证过程中终止申请而无法完成验证过程会怎样?在这种情况下,我不解锁内容,也不完成交易。我认为这是合乎逻辑的。
但是,当我重新启动应用程序(已在“未完成的事务”状态中终止)并尝试购买应用内应用程序时,我使用transaction.error.code == SKErrorPaymentCancelled进入SKPaymentTransactionStateFailed状态。 还出现了一个消息框说:
“您已购买此商品,但尚未加载。点按”确定“立即加载。”
按“OK”后,我没有收到任何回叫 - 因此我没有解锁内容。
所以我的问题是: 1)将交易保留在未完成状态(如果无法验证)是否可以? 2)我该如何恢复它?也许我错过了一些伴随着“你已经购买过......”消息框的回调?
P.S。我的应用内购买是“消费品”。所以我不能用
[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
答案 0 :(得分:2)
好的,我解决了。重要的是从App Delegate收听支付队列,而不是从“购买UI屏幕”。换句话说,
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
必须在
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
不在我的自定义购买屏幕的viewDidLoad。
可以在这里找到很好的解释: When should i validate in-app purchase transaction receipt?