我在应用程序中有很多次购买IAP。用户可以购买它们。
[我的问题是,我正在与Flurry集成以跟踪实际购买,而不仅仅是恢复购买,但是我的SKPaymentTransaction
的transactionState
总是以SKPaymentTransactionStatePurchased
而不是SKPaymentTransactionStateRestored
的形式返回。
显然SKPaymentTransactionStateRestored
仅在- (void)restoreCompletedTransactions
时才被调用,但是何时调用此方法?
我的想法是购买应该像这样:1)用户选择产品,2)询问用户是否要购买X金额的产品。 3)服务器检查用户是否已经购买过,以及是否通过设置SKPaymentTransactionStateRestored
恢复了购买。否则,处理交易并设置SKPaymentTransactionStatePurchased
。显然这是错误的,我想在两者之间的某个位置调用- (void)restoreCompletedTransactions
???
谢谢,
Will
编辑:
最初,我发布了一个很长的,不需要的方法来完成我需要做的事情,但是正如您将在下面看到的那样,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帐户后,该应用程序将让他们知道他们已经购买了该帐户,现在将还原该帐户。以下委托方法将被调用:
-(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)向我指出正确的方向,并使逻辑更清晰!
规范的期望似乎是您提供了一个调用restoreCompletedTransactions
的还原按钮。至于如果用户无视此情况而只是继续尝试通过您的购买界面以恢复他已经购买的功能会发生什么,您可能会担心自己,而不必担心。 docs说:
如果您正在实施应用内购买,则您需要在应用中的某个位置放置一个还原按钮] >>否则,这是拒绝的原因。您可能会在Get list of purchased products, inApp Purchase iPhone中看到一种情况。
Apple IOS SDK文档实际上在这个问题上具有误导性,因为它说:
据我观察,在两种可能的情况下,用户可能必须致电恢复购买,