2013-04-05 3 views
3

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

-(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, в качестве документации яблока говорит. Я пробовал как в симуляторе, так и в iPad с такими же результатами. Заранее благодарим за любую помощь.

ответ

0

Я уверен, что вы не размещаете словарь productsById.

Put что-то вроде self.productsById = [@{} mutableCopy]; в ваш метод -viewDidLoad:

+0

Я дважды проверил это, на всякий случай, и я думаю, что я его выделяю. Я делаю это в 'init' method' productsById = [[NSMutableDictionary alloc] init]; ' Я действительно попытался полностью удалить словарь' productsById', вызвав 'addPayment' с помощью' SKPayment', созданного из последнего объекта в 'response.products' внутри метода' productsRequest: didReceiveResponse: 'с теми же результатами, что и раньше. Спасибо, в любом случае! – user2250746

0

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

0

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

SKPaymentQueue.defaultQueue().removeTransactionObserver(self) 

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

Смежные вопросы