まず、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];