追加に加えてrestoreCompletedTransactions
、iapsが実際にユーザーに復元される方法と、コンテンツがユーザーに提供される方法を処理する必要があります。
基本的に、ユーザーが最初に購入したときにアイテムをユーザーに提供した方法を思い出す必要があります。
たとえば、これは私のアプリの1つで製品を復元する方法です。
トランザクションの復元
- (void)restoreTransaction:(SKPaymentTransaction *)transaction
{
isRestoring = YES;
[self recordTransaction: transaction];
/* This is where I provide the content to the user: */
[self provideContent: transaction.originalTransaction.payment.productIdentifier];
[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}
トランザクションが完了しました
- (void)completeTransaction:(SKPaymentTransaction *)transaction
{
[self recordTransaction: transaction];
[self provideContent: transaction.payment.productIdentifier];
[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}
支払いキュー
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{
for (SKPaymentTransaction *transaction in transactions)
{
switch (transaction.transactionState)
{
case SKPaymentTransactionStatePurchased:
[self completeTransaction:transaction];
break;
case SKPaymentTransactionStateFailed:
if (transaction.error.code == SKErrorPaymentCancelled) {
/// user has cancelled
[[NSNotificationCenter defaultCenter] postNotificationName:@"hideRestoring" object:nil];
}
[self failedTransaction:transaction];
break;
case SKPaymentTransactionStateRestored:
[self restoreTransaction:transaction];
default:
break;
}
}
}
コンテンツを提供する
- (void)provideContent:(NSString *)productIdentifier
{
int index;
NSMutableDictionary * purchased = [NSMutableDictionary dictionaryWithContentsOfFile:EXTRAS_PATH];
NSArray * availableProducts = [NSArray arrayWithContentsOfURL:[NSURL URLWithString:SCANNER_IN_APP_PURCHASES]];
if ( isRestoring )
{
for ( index = 0; index < [availableProducts count]; index++ )
{
//NSLog(@"productIdentifier: %@",productIdentifier);
//NSLog(@"Product: %@",[availableProducts objectAtIndex:index]);
if ( [productIdentifier isEqualToString:[[availableProducts objectAtIndex:index] objectForKey:@"BundleID"]] )
{
[purchased setObject:[availableProducts objectAtIndex:index] forKey:productIdentifier];
[purchased writeToFile:EXTRAS_PATH atomically:YES];
[_purchasedProducts addObject:productIdentifier];
}
}
}
else
{
index = [[[NSUserDefaults standardUserDefaults] objectForKey:@"kTempProductPurchasingIndex"] intValue];
if ( [productIdentifier isEqualToString:[[availableProducts objectAtIndex:index] objectForKey:@"BundleID"]] )
{
[purchased setObject:[availableProducts objectAtIndex:index] forKey:productIdentifier];
[purchased writeToFile:EXTRAS_PATH atomically:YES];
[_purchasedProducts addObject:productIdentifier];
}
}
[[NSNotificationCenter defaultCenter] postNotificationName:kProductPurchasedNotification object:productIdentifier];
}