ios - SKPaymentTransactionStatePurchased 多次被错误调用

标签 ios in-app-purchase skproduct

我正在进行应用内购买,但我有一个错误,我无法找到它的来源...

首先,我有一个按钮,当您单击它时,我的应用程序会请求产品、捕获响应、付款并获得产品(一切正常)。 但是我的问题来了。如果我再次点击按钮购买任何东西,我会收到两次提醒,提示我买了两次东西。即使我第三次点击,我也会收到三次提醒,根据我点击的次数,我买了三次、四次和五次。

所以看起来有些变量一直在存储请求。这是我的代码:

这会验证产品 ID

- (void) validateProductIdentifiers
{ 
NSString *monedas = @" ID FROM PRODUCT ";
NSSet *product = [NSSet setWithObject:monedas];

productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:product];

productsRequest.delegate = self;
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
[productsRequest start];
NSLog(@"STARTED REQUEST");
}

这处理来自 Apple 的响应

- (void)productsRequest:(SKProductsRequest *)request
 didReceiveResponse:(SKProductsResponse *)response
{


productsRequest=nil;

int found=0;

SKProduct *paraPagar;
skProducts = response.products;

for (SKProduct * skProduct in skProducts) {
             NSLog(@"Found product: %@ %@ %0.2f",
          skProduct.productIdentifier,
          skProduct.localizedTitle,
          skProduct.price.floatValue);
    found=1;

    paraPagar = skProduct;
}
if (found==1){ 
    payment = [SKMutablePayment paymentWithProduct:paraPagar];
    payment.quantity = 1;

    [[SKPaymentQueue defaultQueue]addPayment:payment];

}else{ 

 //error (not relevant code)

}
}

接受付款并完成交易

- (void)paymentQueue:(SKPaymentQueue *)queue
updatedTransactions:(NSArray *)transactions
{



for (SKPaymentTransaction *transaction in transactions) {
    switch (transaction.transactionState) {

        case SKPaymentTransactionStatePurchased:
            NSLog(@"BOUGHT");

            [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
            [self completeTransaction:transaction];


            break;
        case SKPaymentTransactionStateFailed:
            NSLog(@"FAILED");
           [[SKPaymentQueue defaultQueue] finishTransaction:transaction];

            [self failedTransaction];
            break;
        case SKPaymentTransactionStateRestored:
            NSLog(@"RESTORED");
            //[self restoreTransaction:transaction];
            [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
        case SKPaymentTransactionStatePurchasing:
            NSLog(@"PURCHASING");
        default:
            break;
    }

}

}

非常感谢您的宝贵时间!

最佳答案

我的问题是每次单击按钮或更改 View 时观察者都会被复制。

解决方案是添加一个标志,以查看是否已经添加了观察者。

static bool hasAddObserver=NO;

PAYMENT METHOD{
if (!hasAddObserver) {
    [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
    hasAddObserver=YES;
}
.....

关于ios - SKPaymentTransactionStatePurchased 多次被错误调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20121981/

相关文章:

ios - fatal error : unexpectedly found nil while unwrapping an Optional value Parse sign up

iphone - iOS将音频从一台iOS设备传输到另一台iOS设备

android - 我正在尝试制作一个应用程序,它将从号码列表中一个接一个地调用电话

iphone - 如何使 "suckEffect"到iPhone的左下角?

ios - 以美元获取应用内商品价格 - 而不是用户的本地硬币

ios - Swift IAP SK产品显示错误价格

Android IAP 收到错误此版本的应用程序未配置为通过 google play 计费检查帮助中心

Android InApp Billing - 随机数的真正用途是什么?

android - IAB 助手未设置。无法执行操作 : queryInventory

ios - 在沙盒模式下出现的非 "Cleared For Sale"的 App Purchase 产品