我的应用程序中有很多一次性购买 IAP。用户可以购买它们。
我的问题是我正在与 Flurry 集成以跟踪实际购买而不是仅仅恢复购买,但我的 SKPaymentTransaction
的 transactionState
总是返回为 SKPaymentTransactionStatePurchased
而不是 SKPaymentTransactionStateRestored
。
显然 SKPaymentTransactionStateRestored
仅在 - (void)restoreCompletedTransactions
时调用,但我什么时候调用此方法?
我的想法是,购买应该是这样的:1) 用户选择产品,2) 询问用户是否愿意购买 X 金额的产品。 3)服务器检查用户之前是否购买过,以及他们是否通过设置SKPaymentTransactionStateRestored
恢复了它。否则,处理交易并设置 SKPaymentTransactionStatePurchased
。显然这是错误的,我想在两者之间的某个地方调用 - (void)restoreCompletedTransactions
???
谢谢,
将
最佳答案
编辑:
最初我发布了一个很长的、不需要的方法来完成我需要的事情,但正如您将在下面看到的,Matt 帮助我找出了我正在寻找的变量。
举个例子,假设一个用户之前购买了我的应用,购买了所有可用的非消耗性 IAP,然后删除了该应用。当用户重新安装应用时,我希望能够确定他们何时再次“购买”产品,是原始(首次)购买还是恢复购买?
我实现了“恢复所有购买”按钮,但假设用户忽略/没有看到它,并尝试选择他们之前购买的产品。
与正常购买一样,我执行以下操作:
if ([SKPaymentQueue canMakePayments])
{
self.productRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithObject:productID]];
self.productRequest.delegate = self;
[self.productRequest start];
}
else
{
//error message here
}
在用户登录到他们的 iTunes 帐户后,该应用程序将让他们知道他们已经购买了这个并且现在将被恢复。将调用以下委托(delegate)方法:
-(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{
for (SKPaymentTransaction *transaction in transactions)
{
switch (transaction.transactionState)
{
case SKPaymentTransactionStatePurchased:
{
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
if(transaction.originalTransaction)
{
NSLog(@"Just restoring the transaction");
}
else
{
NSLog(@"First time transaction");
}
break;
}
default:
break;
}
}
}
无论交易是恢复交易还是首次购买,transaction.transactionState
都将等于 SKPaymentTransactionStatePurchased
。
现在,我们如何确定该购买是原始购买还是修复购买?
简单:如上所见,只看transaction.originalTransaction
是否被初始化。根据 Apple 的说明://仅当状态为 SKPaymentTransactionStateRestored 时才有效。
如果 SKPaymentTransaction
的 originalTransaction
被初始化,这意味着之前有一个交易。否则,这笔交易是原始交易!
再次感谢 Matt 为我指明了正确的方向,并使逻辑更加清晰!
关于iOS StoreKit - 何时调用 - (void)restoreCompletedTransactions?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16084315/