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開発メモ