browser icon
You are using an insecure version of your web browser. Please update your browser!
Using an outdated browser makes your computer unsafe. For a safer, faster, more enjoyable user experience, please update your browser today or try a newer browser.

In-app_parchaseで既に購入したアイテムをリストアする – iPhone開発メモ

logo_iPhone
Posted by on 2013年3月1日

2012年6月辺りのタイミングより、In-app purchaseで復元機能をつけていないアプリはAppleからリジェクトされるようになりました。
すでに承認がおりていてAppStoreに並んでいるアプリも、アップデートのタイミングでリジェクトされます。

復元処理とは、ある端末で購入したアプリ内の課金アイテムを別の端末で購入しようとしたときに、既に購入したものを重複して購入しないよう、購入情報を復元するための処理です。
これがないと、ユーザーに優しくないアプリになってしまいますので、実装は必須です。

今回は、非消費型のアイテムの復元処理を紹介します。

まず、In-app purchaseは下記のように問い合わせします。
これにより、アプリベンダーが登録しているアイテム情報を取得することができます。


#pragma -mark In app purchase

// In-app purchase
 - (void)proceedInAppPurchase
 {
 // Show network activity indicator
 [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

// Start getting products information
 [[SKPaymentQueue defaultQueue] addTransactionObserver:self];

// productId is an arbitrary itemID registered in In-app purchase
 NSSet *productIds = [NSSet setWithObject:productId];
 skProductRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:productIds];
 skProductRequest.delegate = self;
 [skProductRequest start];
 }

次に、デリゲートを設定していますので、先ほどの処理で問い合わせたアイテムが見つかった場合に下記の関数が呼ばれます。


- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response

{

//NSLog(@"didReceiveResponse");
 if (response == nil) {
 NSLog(@"Product Response is nil");
 return;
 }

// Record invalid identifiers in Log
 for (NSString *identifier in response.invalidProductIdentifiers) {
 NSLog(@"invalid product identifier: %@", identifier);
 }

for (SKProduct *product in response.products ) {
 NSLog(@"valid product identifier: %@", product.productIdentifier);
 payment = [SKPayment paymentWithProduct:product];

// 購入履歴チェック(リストア対応の場合)
 [[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
 break;

// 購入手続き(リストア非対応の場合)
 //[[SKPaymentQueue defaultQueue] addPayment:payment];
 }
 }

というように、購入アイテムが見つかった時に購入手続きを進めるのではなく、
購入履歴を確認するようにします。

この購入履歴を確認する処理は、
[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
で呼び出します。

デリゲートを設定しているので、購入確認処理が終わった場合に
下記の関数が呼び出されます。


// Case: Success to restore

- (void) paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue
 {
 BOOL restore = NO;

for (SKPaymentTransaction *transaction in queue.transactions) {
 // Case: Match productID
 if (transaction.payment.productIdentifier == productId) {
 restore = YES;
 // Do any additional procedure after successing to restore.
 NSLog(@"[%s:%d] Already get", __FILE__, __LINE__);
 break;
 }
 }

// Case: No match productID
 if (restore == NO) {
 // Do normal procedure after successing to purchase.
 [[SKPaymentQueue defaultQueue] addPayment: payment];
 }
 }

 

// Case: Fail to restore

- (void) paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error
 {
 // キャンセルなどもここに入ります
 [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
 }

One Response to In-app_parchaseで既に購入したアイテムをリストアする – iPhone開発メモ