7

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

首先,我有一个按钮,当你点击它时,我的应用程序请求产品,捕捉响应,你支付,你得到产品(一切正常)。但是我的问题来了。如果我点击按钮再次购买任何东西,我会收到两次提醒我买了两次东西。即使我第三次点击,我也会收到三个警报,说我买了东西 3 次,根据我点击的次数,有 4 次和 5 次。

所以似乎一些变量一直在存储请求。这是我的代码:

这将验证产品 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;
    }

}

}

非常感谢您的宝贵时间!

4

5 回答 5

11

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

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

static bool hasAddObserver=NO;

PAYMENT METHOD{
if (!hasAddObserver) {
    [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
    hasAddObserver=YES;
}
.....
于 2013-11-21T22:00:23.730 回答
5

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

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

我需要在以下位置不观察它viewWillDisappear()

override func viewWillDisappear() {
  SKPaymentQueue.defaultQueue().removeTransactionObserver(self)
}

我不能使用标志来阻止像 mursang 回答中的多个观察者,因为我在其他视图中听取了交易。

于 2015-10-30T07:27:13.157 回答
1

你记得打电话吗

[[SKPaymentQueue defaultQueue] finishTransaction:transaction];

什么时候购买完成?

于 2013-11-21T15:21:00.520 回答
0

[addTransactionObserver]应该只运行一次。

所以你可以使用单例模式来解决这个问题。

+ (InAppPurchase *)sharedInstance
{
    static dispatch_once_t once;
    static InAppPurchase * sharedInstance;
    dispatch_once(&once, ^{
        sharedInstance = [[self alloc] initWithProductIdentifiers:nil];
    });
    return sharedInstance;
}

- (id)initWithProductIdentifiers:(NSSet *)productIdentifiers {

    if ((self = [super init])) {
        // Add self as transaction observer
        [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
    }
    return self;
}
于 2014-10-29T04:06:51.447 回答
0

Swift 3:根据@sponrad 的回答

override func viewWillDisappear(_ animated: Bool) { 
    SKPaymentQueue.default().remove(self)
}
于 2017-07-19T07:23:17.217 回答