`
1197757723
  • 浏览: 126216 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

最近在做IAP的时候无意发现以前写的内购代码有个小漏洞,收到内购的结果处理会根据购买次数而相应的增加,实现消息监听的初始化和结果监听代码处理如下:

 

 

[objc] view plain copy
  1. - (id)initWithPayConstructor:(NSString *) productIdStr  
  2. {  
  3.     self = [super init];  
  4.     if (self) {  
  5.         // Custom initialization  
  6.         [self initProductId:productIdStr];  
  7.         // 监听购买结果  
  8.         [[SKPaymentQueue defaultQueue] addTransactionObserver:self];  
  9.     }  
  10.     return self;  
  11. }  

 

 

 

[objc] view plain copy
  1. //监听购买结果  
  2. - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transaction{  
  3.     for(SKPaymentTransaction *tran in transaction){  
  4.           
  5.         switch (tran.transactionState) {  
  6.             case SKPaymentTransactionStatePurchased:  
  7.                 {  
  8.                     NSLog(@"交易完成");  
  9.                     [self completeTransaction:tran];  
  10.                     CCHelp* cppHelper = GetCCHelp();  
  11.                     cppHelper->purchaseResult(1);  
  12.                       
  13.                     [[SKPaymentQueue defaultQueue] finishTransaction:tran];  
  14.                 }  
  15.                 break;  
  16.             case SKPaymentTransactionStatePurchasing:  
  17.                 {  
  18.                     NSLog(@"商品添加进列表");  
  19.                 }  
  20.                 break;  
  21.             case SKPaymentTransactionStateRestored:  
  22.                 {  
  23.                     NSLog(@"已经购买过商品");  
  24.                     [self restoreTransaction:tran];  
  25.                       
  26.                     [[SKPaymentQueue defaultQueue] finishTransaction:tran];  
  27.                 }  
  28.                 break;  
  29.             case SKPaymentTransactionStateFailed:  
  30.                 {  
  31.                     NSLog(@"交易失败");  
  32.                     [self failedTransaction:tran];  
  33.                     CCHelp* cppHelper = GetCCHelp();  
  34.                     cppHelper->purchaseResult(4);  
  35.                       
  36.                     [[SKPaymentQueue defaultQueue] finishTransaction:tran];  
  37.                 }  
  38.                 break;  
  39.             default:  
  40.                 {  
  41.                     CCHelp* cppHelper = GetCCHelp();  
  42.                     cppHelper->purchaseResult(5);  
  43.                       
  44.                     [[SKPaymentQueue defaultQueue] finishTransaction:tran];  
  45.                 }  
  46.                 break;  
  47.         }  
  48.     }  
  49. }  


原因:每次购买都会重复添加transaction的消息监听,所以结果返回会重复调用。

 

解决方案1修改如下:加判断处理

 

[objc] view plain copy
  1. static bool hasAddObersver = NO;  
  2.   
  3. - (id)initWithPayConstructor:(NSString *) productIdStr  
  4. {  
  5.     self = [super init];  
  6.     if (self) {  
  7.         // Custom initialization  
  8.         [self initProductId:productIdStr];  
  9.           
  10.         if (!hasAddObersver) {  
  11.             hasAddObersver = YES;  
  12.             // 监听购买结果  
  13.             [[SKPaymentQueue defaultQueue] addTransactionObserver:self];  
  14.         }  
  15.     }  
  16.     return self;  
  17. }  
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics