0

我在应用程序购买代码中有以下内容。

- (IBAction)purchaseProduct:(id)sender
{
    SKProduct *thisProduct = [productDetailsList objectAtIndex:[sender tag]];

    if ([thisProduct.productIdentifier isEqualToString:@"demo"]) {
        SKPayment *payment = [SKPayment paymentWithProductIdentifier:@"demo"];
        [[SKPaymentQueue defaultQueue] addPayment:payment];
    }
}

购买屏幕是由导航控制器控制的单独 uiview。我第一次加载屏幕并进行购买一切都很好。但是,如果我加载屏幕,离开然后返回并进行购买,我会收到以下错误:

*** -[FilterPurchase respondsToSelector:]: message sent to deallocated instance 0x1fd92ca0

在进行断点检查后,错误似乎发生在这一行周围:

[[SKPaymentQueue defaultQueue] addPayment:payment];

任何人都可以在这里看到这个问题吗?我正在使用 ARC,所以我有点不确定如何解决这个问题。

谢谢

更新

如果我还单击“恢复”按钮,也会发生同样的事情

- (IBAction)restorePurchases:(id)sender
{
[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
}
4

3 回答 3

1

[SKPayment paymentWithProductIdentifier:@"demo"];是一个退化的函数

尝试使用SKPayment *payment = [SKPayment paymentWithProduct:thisProduct];

编辑:

您缺少的另一件事是transactionOberver。

添加:

[[SKPaymentQueue defaultQueue] addTransactionObeserver:self];

您的代码将如下所示:

- (IBAction)purchaseProduct:(id)sender
{
    SKProduct *thisProduct = [productDetailsList objectAtIndex:[sender tag]];

    if ([thisProduct.productIdentifier isEqualToString:@"demo"]) 
    {
        SKPayment *payment = [SKPayment paymentWithProduct:thisProduct];
        [[SKPaymentQueue defaultQueue] addTransactionObeserver:self];
        [[SKPaymentQueue defaultQueue] addPayment:payment];
    }
}
于 2013-03-05T14:21:20.760 回答
1

根据文档:

在添加支付请求之前,应用程序应该始终至少有一个支付队列的观察者。

听起来您的 SKPaymentTransactionObserver 可能与您的 IAP uiview 一起被释放。

于 2013-03-05T14:25:56.967 回答
1

为了解决这个问题,我在代码中添加了以下内容,以便在视图更改时移除观察者。

-(void)viewWillDisappear:(BOOL)animated {

[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];

}
于 2013-03-05T15:31:37.660 回答