2013-04-05 61 views
3

我已經在Apple門戶中配置了我的iOS應用程序在應用程序中的購買, 我要求我的產品使用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字典。

把東西像self.productsById = [@{} mutableCopy];到您的-viewDidLoad:方法

+0

我再次檢查,以防萬一,我想我分配它。我試着用從上一個對象創建的'SKPayment'調用'addPayment'完全去掉'productsById'字典中的'productsById'字典在方法'productsRequest:didReceiveResponse:'中的'response.products'中,結果與以前相同。不管怎麼說,還是要謝謝你! – user2250746 2013-04-05 22:37:25

0

,我發現我的問題,錯誤是不是在SKPaymentQueue addPayment:消息,但在SKPaymentQueue paymentQueue: updatedTransactions: 執行打印對異常的堆棧跟蹤後的參數我注意到,該消息實際上是從addPayment:立即發送給我的代理,我從來沒有看到,因爲調試器會直接進入addPayment:而不會破壞我的委託代碼時直接遇到異常。

0

我有類似的問題。在我deinit方法

SKPaymentQueue.defaultQueue().removeTransactionObserver(self) 

:在從SKPaymentQueue.defaultQueue().addPayment(payment)我的情況異常被拋出,因爲我已經錯過了。