SKPaymentQueue addPayment正在抛出异常

时间:2013-04-05 21:39:56

标签: ios objective-c in-app-purchase storekit

我在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中尝试了相同的结果。 提前感谢您的帮助。

3 个答案:

答案 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方法中。