3

我已经在 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 是 > 0。我在模拟器和 iPad 中都尝试过,结果相同。提前感谢您的帮助。

4

3 回答 3

0

我很确定你没有分配productsById字典。

self.productsById = [@{} mutableCopy];在你的-viewDidLoad:方法中加入类似的东西

于 2013-04-05T22:24:50.843 回答
0

我发现了我的问题,错误不在SKPaymentQueue addPayment:消息的参数中,而是在执行SKPaymentQueue paymentQueue: updatedTransactions: 打印异常的堆栈跟踪之后,我注意到消息实际上是从 立即发送给我的委托的addPayment:,我从来没有看到,因为调试器在进入时会直接遇到异常,addPayment:而不会破坏我的委托代码。

于 2013-04-06T13:04:03.463 回答
0

我有类似的问题。在我的情况下,SKPaymentQueue.defaultQueue().addPayment(payment)抛出异常,因为我错过了:

SKPaymentQueue.defaultQueue().removeTransactionObserver(self)

在我的deinit方法中。

于 2016-08-22T08:30:37.963 回答