【发布时间】:2017-07-13 17:37:22
【问题描述】:
在极少数情况下,我的一些用户似乎无法进行非消耗性购买。当他们尝试购买时,它不会激活“高级”,并且当他们从当前安装或全新安装恢复时,paymentQueue: updatedTransactions: 不会被调用。
我专门添加了许多日志记录,以尝试确定还原未遵循预期流程的原因。在还原失败期间,不会触发任何“RESTORE”类别事件。
供参考,[self success]; 只显示内容视图,[self fail:] 向用户显示错误消息。
在viewDidLoad 中调用[[SKPaymentQueue defaultQueue] addTransactionObserver:self]; 并且在按下按钮时调用[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];。
- (void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue {
// COMPLETION POINT - RESTORE COMPLETE***
[MBProgressHUD hideHUDForView:self.view animated:TRUE];
if ([SKPaymentQueue defaultQueue].transactions.count == 0) {
[self.tracker send:[[GAIDictionaryBuilder createEventWithCategory:@"RESTORE"
action:@"failure_hard"
label:@"no_purchases"
value:nil] build]];
[self fail:@"There are no items available to restore at this time."];
} else {
[self success];
}
}
- (void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error {
// COMPLETION POINT - RESTORE FAILED
[MBProgressHUD hideHUDForView:self.view animated:TRUE];
[self.tracker send:[[GAIDictionaryBuilder createEventWithCategory:@"RESTORE"
action:@"failure_hard"
label:error.localizedDescription
value:nil] build]];
[self fail:error.localizedDescription];
}
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions {
// Make sure completion states call [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
// in order to prevent sign in popup
// http://stackoverflow.com/a/10853107/740474
[MBProgressHUD hideHUDForView:self.view animated:TRUE];
for (SKPaymentTransaction *transaction in transactions) {
switch (transaction.transactionState) {
case SKPaymentTransactionStatePurchasing:
break;
case SKPaymentTransactionStateDeferred:
break;
case SKPaymentTransactionStateFailed:
// COMPLETION POINT - PURCHASE FAILED
[self.tracker send:[[GAIDictionaryBuilder createEventWithCategory:@"PURCHASE"
action:@"failure_hard"
label:transaction.error.localizedDescription
value:nil] build]];
if (transaction.error.code != SKErrorPaymentCancelled) {
// only show error if not a cancel
[self fail:transaction.error.localizedDescription];
}
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
break;
case SKPaymentTransactionStatePurchased:
// COMPLETION POINT - PURCHASE SUCCESS
if ([transaction.payment.productIdentifier isEqualToString:(NSString*)productID]) {
// premium purchase successful
[self.tracker send:[[GAIDictionaryBuilder createEventWithCategory:@"PURCHASE"
action:@"success"
label:nil
value:nil] build]];
[Utils setPremium:YES];
[self success];
} else {
[self.tracker send:[[GAIDictionaryBuilder createEventWithCategory:@"PURCHASE"
action:@"failure_hard"
label:@"no_id"
value:nil] build]];
[self fail:@"The item you purchased was not returned from Apple servers. Please contact us."];
}
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
break;
case SKPaymentTransactionStateRestored:
if ([transaction.payment.productIdentifier isEqualToString:(NSString*)productID]) {
// premium purchase restored
[self.tracker send:[[GAIDictionaryBuilder createEventWithCategory:@"RESTORE"
action:@"restore_success"
label:nil
value:nil] build]];
[Utils setPremium:YES];
} else {
[self.tracker send:[[GAIDictionaryBuilder createEventWithCategory:@"RESTORE"
action:@"failure_hard"
label:@"no_id"
value:nil] build]];
}
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
break;
default:
// For debugging
[self.tracker send:[[GAIDictionaryBuilder createEventWithCategory:@"STORE"
action:@"transaction_weird"
label:[NSString stringWithFormat:@"Unexpected transaction state %@", @(transaction.transactionState)]
value:nil] build]];
break;
}
}
}
任何建议将不胜感激
【问题讨论】:
-
您解决了这个问题吗?我有相同的问题。 paymentQueue:updatedTransactions:在恢复操作期间未调用。没有错误并且调用了 paymentQueueRestoreCompletedTransactionsFinished 所以我的观察者必须是正确的。
-
很遗憾没有。只有少数少数用户受到影响,我们无法查明发生了什么。老实说,他们似乎购买了并且购买被默默地取消/失败,并且不会让他们再次购买,给他们一种他们已经购买但没有收到产品的印象。可能是某种拒付利用?老实说,我不知道,我只能说他们说他们购买了并且没有得到恢复。
-
我只是想通了(我想)。事实证明,我们有两种 IAP,一种是可下载的,一种是不可下载的。使用的代码只是测试是否 transaction.downloadable 为 nil 以区分两者。我相信可下载的数组可以是非零但为空的,你必须允许这种情况。如果我们使用不可下载的 IAP 进入可下载代码,则交易永远不会完成。
-
签入 iOS 13 以上版本stackoverflow.com/a/66343882/239485
标签: ios in-app-purchase skpaymenttransaction