摘要
在Sandbox环境中恢复非消耗品时,我收到了奇怪的SKPaymentTransaction
对象:
transaction.transactionState == SKPaymentTransactionStatePurchased
transaction.originalTransaction != nil
我认为仅当transactionState为SKPaymentTransactionStateRestored
时才会分配originalTransaction属性。
这是iOS错误吗?
详情
我的IAP代码如下。
- (void)paymentQueue:(SKPaymentQueue *)queue
updatedTransactions:(NSArray *)transactions {
for (SKPaymentTransaction* transaction in transactions) { // (1)
switch (transaction.transactionState) {
case SKPaymentTransactionStatePurchasing: {
break;
}
case SKPaymentTransactionStatePurchased: { // (2)
BOOL success = [self _provideContents]
if (success) {
[queue finishTransaction:transaction];
}
break;
}
case SKPaymentTransactionStateRestored: { // (3)
BOOL success = [self _resotreContents];
if (success) {
[queue finishTransaction:transaction];
}
break;
}
...
}
}
- (void)paymentQueue:(SKPaymentQueue *)queue
removedTransactions:(NSArray *)transactions {
// (4)
}
}
我的应用程序有200个非消耗性IAP项目。 我的测试沙盒用户已经购买了所有200个IAP项目。
我使用调试器运行我的应用程序,然后点击我的应用程序上的“恢复”按钮,并使用上面的沙盒用户帐户登录。
我在//(1)行设置了断点。当调试器在//(1)行中断时,我确认transactions.count == 200
和transactions[0].transactionStete == SKPaymentTransactionStateRestored
。
我在//(1)上停止执行我的应用程序。我的应用程序进程突然终止。 在这段时间内,仍有200笔未完成的交易。
我重新启动App并再次执行//(1)行,//(3)行执行200次。所以所有交易都完成了。
但是我点击了设备上的主页按钮并重新启动了我的应用程序,意外的是,//(2)行被执行了大约80~90次。那个案子的交易是:
transaction.transactionState == SKPaymentTransactionStatePurchased
transaction.originalTransaction != nil
为什么某些交易会再次更新? 为什么不恢复transactionState,是否已购买?
这种奇怪的行为只发生在购买200个IAP项目的沙箱用户身上。对于购买了10或20件商品的另一个沙箱用户,没有发生。