Method for restoring in app purchases is unlocking features that hadn't
been purchased
I have a nonconsumable IAP for a "Save Feature." It was recently rejected
because I did not include a restore feature in the app. I added code for
restoring, but when I created a new test user that hadn't purchased the
app and pressed the restore button, the save feature was unlocked.
Here is how I check if a user has purchased the save feature
if (![userDefaults boolForKey:@"isPurchase"]){
[self purchaseMyProduct:[validProducts objectAtIndex:0]];
}
else { ... }
These are the methods I added to restore IAP's.
- (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];
}
}
}
Here are the methods I already had.
-(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];
}
Also, for the new test user example, I noticed that the NSLog "called"
from the paymentQueueRestoreCompletedTransactionsFinished method is being
called twice and "restored" from the paymentQueue:updatedTransactions:
method is not being called at all.
How can I modify my code to restore properly?
No comments:
Post a Comment