3

私のアプリの場合、確認を求めてアプリ内購入を説明するのに十分ですが、購入が完了した後にアイテムを有効にする方法がわかりません。

SKPayment *payment = [SKPayment paymentWithProductIdentifier:@"com.silver.tapp.page2"];

[[SKPaymentQueue defaultQueue] addPayment:payment];

それは私が今まで持っているものです

[[p2Controller tabBarItem] setEnabled:TRUE];

これは私が実行したいコードです

4

1 に答える 1

20

まず、Appleが提供するアプリ内購入ドキュメントに戻って確認する必要があります。これらのドキュメントはこれを詳細に概説しており、彼らの側で何が行われているのかを理解するのに役立ちます。

不足しているのはSKPaymentTransactionObserverです。SKPaymentTransactionQueueのオブザーバーとして追加するこのオブザーバーを実装するのはユーザーの責任です。アプリの起動時にオブザーバーをデフォルトのキューに追加して、アプリの実行中に発生するすべてのトランザクションを監視できるようにすることをお勧めします。

基本的に、SKPaymentTransactionObserverプロトコルを実装する独自のクラスを作成する必要があります。このクラスが行うことは、iTunesストアが支払いを処理するときに支払いキューからのコールバックをキャッチすることを観察し、成功イベントと失敗イベントをキャッチできるようにすることです。

ペイメントオブザーバーのスケルトンは次のとおりです。

PaymentObserver.h

#import <StoreKit/StoreKit.h>

@interface PaymentObserver : NSObject <SKPaymentTransactionObserver> {  
}

- (void) completeTransaction: (SKPaymentTransaction *)transaction;
- (void) restoreTransaction: (SKPaymentTransaction *)transaction;
- (void) failedTransaction: (SKPaymentTransaction *)transaction;

@end

PaymentObserver.m

#import "PaymentObserver.h"
@implementation PaymentObserver

- (void)paymentQueue:(SKPaymentQueue *)queue removedTransactions:(NSArray *)transactions
{
  // handle payment cancellation
}

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{
  // handle the payment transaction actions for each state
  for (SKPaymentTransaction *transaction in transactions)
  {
    switch (transaction.transactionState)
    {
      case SKPaymentTransactionStatePurchased:
        [self completeTransaction:transaction];        
        break;
      case SKPaymentTransactionStateFailed:
        [self failedTransaction:transaction];        
        break;
      case SKPaymentTransactionStateRestored:
        [self restoreTransaction:transaction];        
      default:
        break;
    }
  }
}



- (void) completeTransaction: (SKPaymentTransaction *)transaction;
{
  // Record the transaction
  //...

  // Do whatever you need to do to provide the service/subscription purchased
  //...

  // Remove the transaction from the payment queue.
  [[SKPaymentQueue defaultQueue] finishTransaction: transaction];

}

- (void) restoreTransaction: (SKPaymentTransaction *)transaction
{
  // Record the transaction
  //...

  // Do whatever you need to do to provide the service/subscription purchased
  //...

  [[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}

- (void) failedTransaction: (SKPaymentTransaction *)transaction
{  
  if (transaction.error.code != SKErrorPaymentCancelled)
  {
    // Optionally, display an error here.    
  }
  [[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}

@end

PaymentObserverを実装したら、トランザクションオブザーバーとしてデフォルトの支払いキューにインスタンスを追加する必要があります。

// Done at app launch...
PaymentObserver *paymentObserver = [[PaymentObserver alloc] init];
[[SKPaymentQueue defaultQueue] addTransactionObserver:paymentObserver];
于 2009-10-26T00:10:10.913 に答える