最近在做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;
- }
相关推荐
IAP功能IAP功能IAP功能IAP功能IAP功能IAP功能IAP功能
验证IAP返回receipt结果demo
P89V51RD2 具有 IAP(在应用中编程)功能,用户通过在应用程序中调用 IAP 子程序,可实现有选择 的对 FLASH 块进行擦除和编程。 P89V51RD2 的 bootrom 区为 0000H~1FFFH,为...编语言混编的办法实现 IAP 调用的方法。
( stm32_IAP远程升级解决方案.pdf )
STC89C52IAP应用 #ifndef _IAP_H__ #define _IAP_H__ #include sfr IAP_DATA = 0xE2; //IAP读写操作数据寄存器 sfr IAP_ADDRH = 0xE3; //IAP操作时的地址寄存器高八位 sfr IAP_ADDRL = 0xE4; //IAP操作时的地址...
Unity3D调用IOS的内扣费IAP的简单例子,直接修改包名跟扣费点就可以运行用了。
IAP就是几块ROM中的程序/函数可以互相调用、切换。通俗 一点就是APROM中的程序可以调用LDROM中的函数,LDROM中的程序可以调用APROM中的 函数。对CPU来说它们都是同时可读的。同时,客户的应用程序可以放到APROM/...
有了这个特性之后,APROM 中的程序可以调用 LDROM 中的函数,LDROM 中的程序也可以调用 APROM 中的函数。对 CPU来说它们都是同时可读的,可以在里面执行代码。 使能IAP之后,因为程序可以下载到非0的地址,这就涉及...
STM32平台用于IAP下载的程序模板,先编写好Bootloader,后面编写应用程序,应用程序的更新就不再需要使用串口或者仿真器更新程序了。
对于AT32 MCU,除了出厂固化的bootloader,用户也可以在应用程序中编写自己的bootloader程 序,用于最终产品的固件...IAP_Programmer.exe上位机软件和嵌入式IAP USART示例的源代码位于BSP固件库的utilities文件夹 内。
bootloader和iic在STM中的使用IAP_MAIN :实现IAP的程序,实际的BootLoader
iAP2 Sample Source R1 iAP2 Sample Source R1 iAP2 Sample Source R1 iAP2 Sample Source R1 iAP2 Sample Source R1 iAP2 Sample Source R1 iAP2 Sample Source R1 iAP2 Sample Source R1
STM32 系列单片机 IAP 下载例程
Symbian IAP 浅谈 Symbian IAP 浅谈Symbian IAP 浅谈
,STM32F103实现APP和IAP程序IAP段通过串口终端更新APP程序
STC51单片机IAP15W4K58S4最小系统板-教程资料-技小新-IAP15W4K58S4最小系统板-程序烧写方法.pdf
某种微控制器支持IAP技术的首要前提是其必须是基于可重复编程闪存的微控制器。STM32微控制器带有可编程的内置闪存,同时STM32拥有在数量上和种类上都非常丰富的外设通信接口,因此在STM32上实现IAP技术是完全可行的...
基于STM32单片机,通过W5500以太网芯片下载APP的IAP程序,实测正常使用。
IAP15W4K61S4 单片机声控红外温度步进电机光敏等传感器实验例程源码(15例) IAP15W4K61S4 单片机 - 4位数码管实验例程KEIL源码 IAP15W4K61S4 单片机 - 光敏传感器实验例程KEIL源码 IAP15W4K61S4 单片机 - 四相步进...