「保存機能」用の非消費型 IAP があります。アプリに復元機能が含まれていなかったため、最近拒否されました。復元用のコードを追加しましたが、アプリを購入していない新しいテスト ユーザーを作成して復元ボタンを押すと、保存機能のロックが解除されました。
ユーザーが保存機能を購入したかどうかを確認する方法は次のとおりです
if (![userDefaults boolForKey:@"isPurchase"]){
[self purchaseMyProduct:[validProducts objectAtIndex:0]];
}
else { ... }
これらは、IAP を復元するために追加したメソッドです。
- (void)restorePurchases { //called when button pressed
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
[[SKPaymentQueue defaultQueue]restoreCompletedTransactions];
}
- (void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue {
for (SKPaymentTransaction *transaction in queue.transactions) {
NSString *productID = transaction.payment.productIdentifier;
if ([productID isEqualToString:@"facePuppetsSave"]) {
NSLog(@"called");
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setBool:YES forKey:@"isPurchase"];
[userDefaults synchronize];
}
}
}
これが私がすでに持っていた方法です。
-(void)paymentQueue:(SKPaymentQueue *)queue
updatedTransactions:(NSArray *)transactions {
for (SKPaymentTransaction *transaction in transactions) {
switch (transaction.transactionState) {
case SKPaymentTransactionStatePurchasing:
break;
case SKPaymentTransactionStatePurchased:
if ([transaction.payment.productIdentifier
isEqualToString:@"facePuppetsSave"]) {
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setBool:YES forKey:@"isPurchase"];
[userDefaults synchronize];
UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:
@"Purchase completed. Saving now available." message:nil delegate:
self cancelButtonTitle:@"Ok" otherButtonTitles: nil];
[alertView show];
[alertView release];
}
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
break;
case SKPaymentTransactionStateRestored:
NSLog(@"Restored ");
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
break;
case SKPaymentTransactionStateFailed:
break;
default:
break;
}
}
}
-(void)productsRequest:(SKProductsRequest *)request
didReceiveResponse:(SKProductsResponse *)response
{
SKProduct *validProduct = nil;
int count = [response.products count];
if (count>0) {
validProducts = response.products;
[validProducts retain];
validProduct = [response.products objectAtIndex:0];
}
また、新しいテスト ユーザーの例では、メソッドから "呼び出された" NSLogpaymentQueueRestoreCompletedTransactionsFinished
が 2 回呼び出され、メソッドから "復元"paymentQueue:updatedTransactions:
がまったく呼び出されていないことに気付きました。
コードを修正して正しく復元するにはどうすればよいですか?