我在应用购买代码中有以下内容。
- (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,所以我不确定如何解决这个问题。
由于
UPDATE如果我也点击“恢复”按钮
,也会发生同样的事情- (IBAction)restorePurchases:(id)sender
{
[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
}
答案 0 :(得分: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];
}
}
答案 1 :(得分:1)
根据文件:
应用程序应始终至少有一名付款观察员 在添加付款请求之前排队。
听起来您的SKPaymentTransactionObserver可能会与您的IAP uiview一起被解除分配。
答案 2 :(得分:1)
要解决此问题,我已在代码中添加以下内容,以便在更改视图时删除观察者。
-(void)viewWillDisappear:(BOOL)animated {
[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
}