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

ドキュメントによると:

支払い要求を追加する前に、アプリケーションには常に支払いキューの少なくとも 1 つのオブザーバーが必要です。

IAP uiview と共に SKPaymentTransactionObserver の割り当てが解除されているようです。

于 2013-03-05T14:25:56.967 に答える
1

この問題を解決するために、ビューが変更されたときにオブザーバーを削除するコードに以下を追加しました。

-(void)viewWillDisappear:(BOOL)animated {

[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];

}
于 2013-03-05T15:31:37.660 に答える