IAP监听购买结果paymentQueue,SKPaymentTransaction方法重复累计调用解决

来源:互联网 发布:淘宝手机怎么上传宝贝 编辑:程序博客网 时间:2024/05/16 11:43

最近在做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;}



0 0
原创粉丝点击