我已经实现了IAP,我正在测试它,但是我遇到了以下问题,为此我搜索了很多解决方案。它不会一直发生,这让我责怪沙箱模式,但我认为这不是很聪明,所以我在寻求帮助:
这是我的代码:
- (void) paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{
for(SKPaymentTransaction *transaction in transactions)
{
switch (transaction.transactionState)
{
case SKPaymentTransactionStatePurchasing:
{
NSLog(@"transaction state -> Purchasing");
break;
}
case SKPaymentTransactionStatePurchased:
{
NSLog(@"purchased -- state");
[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
[self goToProductViewController];
break;
}
case SKPaymentTransactionStateRestored:
{
NSLog(@"transaction state -> RESTORED");
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
break;
}
case SKPaymentTransactionStateFailed:
{
NSLog(@"transaction state -> Cancelled");
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
break;
}
default:
break;
}
}
}
我做错了什么?为什么在确认之前购买产品,甚至在输入密码之前?我购买产品后,我正在调用购买产品的方法,而不是采购状态。如果这是正常行为,那么我如何才能确定产品已被确认购买的状态?它只有4次正常运行,就像它在确认之后等待实际调用方法goToProductViewController,但其余的几十次测试都没有。
提前谢谢!
答案 0 :(得分:0)
可能是因为您不符合 SKPaymentTransactionObserver 协议。
如果您还没有,请将<SKPaymentTransactionObserver>
添加到您的头文件中,并在didFinishLaunchingWithOptions
中实施观察者(下面的示例)
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
/* ... */
[[SKPaymentQueue defaultQueue] addTransactionObserver:observer];
}
由于您设置了Observer,因此请确保您的应用在更新整个UI和方法调用时完成事务,以准备访问新功能。使用以下方式完成交易:
SKPaymentTransaction *transaction = <# The current payment #>;
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
如果没有调用(或过去没有),则可能导致您当前遇到的问题。
答案 1 :(得分:0)
我建议您尝试购买具有不同商店ID的其他商品。也许你的观察者正在捕捉最后一次购买,而不是你刚刚初始化的购买者。要检查是否发生了什么,请尝试测试购买具有不同产品ID的其他产品。当你的观察者购买时购买。检查产品ID并将其与刚刚初始化的产品ID进行比较。
注意:如果您错过了需要使用新产品ID进行重新测试,则需要专注于此测试原因。
答案 2 :(得分:0)
四年后才回答,但是如果有人遇到同样的问题,如果您使用的是越狱的设备,请尝试重新启动未越狱的系统,我不确定是否有特定的调整导致这种情况,但是有效。