SKPaymentTransactionStatePurchased错误地多次调用

mur*_*ang 6 in-app-purchase ios 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");
}
Run Code Online (Sandbox Code Playgroud)

这可以处理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)

}
}
Run Code Online (Sandbox Code Playgroud)

接受付款和完成交易

- (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;
    }

}

}
Run Code Online (Sandbox Code Playgroud)

非常感谢您的宝贵时间!

mur*_*ang 10

修复了问题.

问题是,每次我点击按钮或更改视图时,观察者都会被复制.

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

static bool hasAddObserver=NO;

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

  • 根据Apple的文档,*"您的应用程序应该在应用程序初始化期间向支付队列中添加一个观察者."*所以您的解决方案可行,但更好的方法是在应用程序启动后立即开始观察事务. (6认同)

spo*_*rad 5

我遇到了同样的问题,我会在 IAP 上点击购买,然后会收到来自 Apple 的多个回复和购买。

addTransactionObserver()每次我离开并通过viewDidLoad().

我需要取消观察它viewWillDisappear()

override func viewWillDisappear() {
  SKPaymentQueue.defaultQueue().removeTransactionObserver(self)
}
Run Code Online (Sandbox Code Playgroud)

我无法使用标志来阻止多个观察者,就像在 mursang 的回答中一样,因为我在其他视图中监听了事务。