paymentQueue: updatedTransactions вызывается, когда не следует? - PullRequest
4 голосов
/ 10 марта 2012

У меня странная проблема с покупкой в ​​приложении ...

После того, как я запрашиваю информацию о продукте, иногда по какой-то причине автоматически вызывается paymentQueue: updatedTransactions.

В методе моего магазина viewDidLoad я инициализирую и запускаю запрос:

- (void)viewDidLoad
{
    [super viewDidLoad];

    productsArray = [[NSArray alloc] init];

    [[SKPaymentQueue defaultQueue] addTransactionObserver:self];

    NSSet *productIdentifiers = [NSSet setWithObjects:PRODUCT_ID, nil];
    productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:productIdentifiers];
    productsRequest.delegate = self;
    [productsRequest start];
}

Затем я получаю ответ:

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
{
    productsArray = [[NSArray alloc] initWithArray:response.products];

    NSLog(@"Products Count: %d",[productsArray count]);
    NSLog(@"Invalid Products Count: %d",[response.invalidProductIdentifiers count]);

    if ([productsArray count] > 0)
    {
        NSLog(@"Product title: %@" ,[productsArray objectAtIndex:0]);
        [self hideLoadingView];


    } else {
        UIAlertView* alertView = [[UIAlertView alloc] initWithTitle:@"No products found"
                                                            message:@"There might have been a problem. Please try again soon." delegate:self 
                                                  cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [alertView show];
        [alertView release];

        [self hideLoadingView];
        [purchaseBtn setEnabled:NO];

    }

    [productsRequest release];

    [[NSNotificationCenter defaultCenter] postNotificationName:kInAppPurchaseManagerProductsFetchedNotification object:self userInfo:nil];

}

Здесь я ожидаю завершения процесса, иподождите, пока пользователь нажмет кнопку покупки ... но иногда (например, в 70% случаев) я получаю всплывающее окно с именем пользователя / паролем, чтобы купить товар ... но пользователь этого не сделалнажмите что-нибудь ... (и если пользователь уже "вошел в систему", то он покупает элемент без запроса. Это НЕ так, как должно быть.

Этот метод иногда вызывается автоматически:

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{
    NSLog(@"updated transaction");
    for (SKPaymentTransaction *transaction in transactions)
    {
        switch (transaction.transactionState)
        {
            case SKPaymentTransactionStatePurchased:
                NSLog(@"transationStatePurchased");
                [self completeTransaction:transaction];
                break;
            case SKPaymentTransactionStateFailed:
                NSLog(@"transationStateFailed");
                [self failedTransaction:transaction];
                break;
            default:
                break;
        }
    }
}

и это IBAction кнопки покупки:

-(IBAction)buyItem:(id)sender {

    [self showLoadingView];

    SKPayment *payment = [SKPayment paymentWithProductIdentifier:[(SKProduct *)[productsArray objectAtIndex:0] productIdentifier]];
    [[SKPaymentQueue defaultQueue] addPayment:payment];

    }        
}

Я думал, что окно предупреждения пользователя / пароля StoreKit не должно отображаться, пока я не вызову defaultQueue's "метод addPayment, которыйrs ТОЛЬКО в IBAction.

Есть идеи?Спасибо!

1 Ответ

8 голосов
/ 10 марта 2012

После добавления наблюдателя транзакции iOS проверит Очередь по умолчанию, если есть какая-либо незавершенная транзакция (что означает, что вы не завершили ее), поэтому она будет отображать окно с предупреждением каждый раз, когда происходит транзакция, пока вы не завершите ее если вы не сделали никаких действий для добавления нового платежа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...