SKPaymentQueue addPayment выдает исключение

Я настроил свои приложения для iOS в покупках приложений на портале Apple, я запрашиваю свои продукты, используя SKProductsRequest и правильно получая, а затем сохраняя их в NSMutableDictionary.

-(void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse*)response
{
    NSLog(@"%@", @"AppStore: Accepted");
    for (SKProduct * s in response.products) {
        NSLog(@"    [%@]", s.productIdentifier);
    }

    [productsById removeAllObjects];

    for (SKProduct * product in response.products) {
        [productsById setObject:product forKey:product.productIdentifier];
    }

    [request release];
}

Однако при попытке совершить покупку строка addPayment выдает 'NSInvalidArgumentException', reason: '*** setObjectForKey: key cannot be nil'

-(void)purchase:(NSString *)productId {
    SKProduct *selectedProduct = [productsById objectForKey:productId];
    SKMutablePayment *payment = [SKMutablePayment paymentWithProduct: selectedProduct];
    payment.quantity = 1;

    [[SKPaymentQueue defaultQueue] addTransactionObserver: self];
    [[SKPaymentQueue defaultQueue] addPayment: payment]; //<- this line throws an exception
}

Я проверил, что productId является действительным продуктом и что payment.quantity> 0, как говорится в документации Apple. Я пробовал и в Симуляторе, и в iPad с теми же результатами. Заранее благодарю за любую помощь.


person RowDaBoat    schedule 05.04.2013    source источник


Ответы (3)


Я почти уверен, что вы не выделяете productsById словарь.

Поместите что-то вроде self.productsById = [@{} mutableCopy]; в свой метод -viewDidLoad:

person Eugene    schedule 05.04.2013
comment
Я дважды проверил это на всякий случай и думаю, что выделяю его. Я делаю это в методе init productsById = [[NSMutableDictionary alloc] init];. На самом деле я пытался полностью удалить словарь productsById, вызвав addPayment с SKPayment, созданным из последнего объекта в response.products внутри метода productsRequest:didReceiveResponse:, с теми же результатами, что и раньше. Спасибо, в любом случае! - person RowDaBoat; 06.04.2013

Я нашел свою проблему, ошибка была не в параметрах сообщения SKPaymentQueue addPayment:, а в реализации SKPaymentQueue paymentQueue: updatedTransactions:. После печати трассировки стека исключения я заметил, что сообщение на самом деле отправляется моему делегату сразу из addPayment:, я так и не пришел к см. это, потому что отладчик просто столкнулся бы с исключением непосредственно при переходе в addPayment: без нарушения моего кода делегата.

person RowDaBoat    schedule 06.04.2013

У меня была аналогичная проблема. В моем случае было выброшено исключение из SKPaymentQueue.defaultQueue().addPayment(payment), потому что я пропустил:

SKPaymentQueue.defaultQueue().removeTransactionObserver(self)

в моем методе deinit.

person zalogatomek    schedule 22.08.2016