我在Apple的门户网站中配置了我的iOS应用程序购买应用程序,
我正在使用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为&gt; 0,正如苹果的文档所说。 我已经在模拟器和iPad中尝试了相同的结果。 提前感谢您的帮助。
答案 0 :(得分:0)
我很确定你没有分配productsById
词典。
将self.productsById = [@{} mutableCopy];
之类的内容添加到-viewDidLoad:
方法
答案 1 :(得分:0)
我发现了我的问题,错误不在SKPaymentQueue addPayment:
消息的参数中,而是在SKPaymentQueue paymentQueue: updatedTransactions:
的实现中
打印出异常的堆栈跟踪后,我注意到消息实际上是从addPayment:
立即发送给我的委托,我从来没有看到过,因为调试器只是在进入{{1时直接遇到异常不破坏我的委托代码。
答案 2 :(得分:0)
我有类似的问题。在我的情况下,SKPaymentQueue.defaultQueue().addPayment(payment)
的例外被抛出,因为我错过了:
SKPaymentQueue.defaultQueue().removeTransactionObserver(self)
在我的deinit
方法中。