最近在做IAP的时候无意发现以前写的内购代码有个小漏洞,收到内购的结果处理会根据购买次数而相应的增加,实现消息监听的初始化和结果监听代码处理如下:
- (id)initWithPayConstructor:(NSString *) productIdStr
{
self = [super init];
if (self) {
// Custom initialization
[self initProductId:productIdStr];
// 监听购买结果
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
}
return self;
}
//监听购买结果
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transaction{
for(SKPaymentTransaction *tran in transaction){
switch (tran.transactionState) {
case SKPaymentTransactionStatePurchased:
{
NSLog(@"交易完成");
[self completeTransaction:tran];
CCHelp* cppHelper = GetCCHelp();
cppHelper->purchaseResult(1);
[[SKPaymentQueue defaultQueue] finishTransaction:tran];
}
break;
case SKPaymentTransactionStatePurchasing:
{
NSLog(@"商品添加进列表");
}
break;
case SKPaymentTransactionStateRestored:
{
NSLog(@"已经购买过商品");
[self restoreTransaction:tran];
[[SKPaymentQueue defaultQueue] finishTransaction:tran];
}
break;
case SKPaymentTransactionStateFailed:
{
NSLog(@"交易失败");
[self failedTransaction:tran];
CCHelp* cppHelper = GetCCHelp();
cppHelper->purchaseResult(4);
[[SKPaymentQueue defaultQueue] finishTransaction:tran];
}
break;
default:
{
CCHelp* cppHelper = GetCCHelp();
cppHelper->purchaseResult(5);
[[SKPaymentQueue defaultQueue] finishTransaction:tran];
}
break;
}
}
}
原因:每次购买都会重复添加transaction的消息监听,所以结果返回会重复调用。
解决方案1修改如下:加判断处理
static bool hasAddObersver = NO;
- (id)initWithPayConstructor:(NSString *) productIdStr
{
self = [super init];
if (self) {
// Custom initialization
[self initProductId:productIdStr];
if (!hasAddObersver) {
hasAddObersver = YES;
// 监听购买结果
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
}
}
return self;
}