43
votes

I have implemented in app purchases into my app update for the first time, only too wait 3 weeks and have it rejected for the following reason:

We found that your app offers In-App Purchase/s that can be restored but it does not include a "Restore" feature to allow users to restore the previously purchased In-App Purchase/s. To restore previously purchased In-App Purchase products, it would be appropriate to provide a "Restore" button and initiate the restore process when the "Restore" button is tapped.

Now I was thinking of adding a navbar button to the right (top) of my table where the app purchases can be seen/tapped and adding the following code that will be linked to the button:

 [[SKPaymentQueue defaultQueue]   restoreCompletedTransactions];

Can someone verify that this is correct and most likely all that is needed? Would like this to pass successfully this time. Thanks in advance!

4
I got the same damn rejection notice. Do you always provide a "restore" button?!?! I want to automatically check to see if there where restorable in-app purchases but when I call the restoreCompletedTransactions the user is prompted for a password. That sucks! This there another API for this? Can I just change my "BUY" button to "BUY/RESTORE"??? Which still sucks. I do not have room for a full time "RESTORE" button. - whatchamacallit
@whatchamacallit All I did was put the following code from above to a method connected to a button in the navbar and it got approved. If you do not have room for the button in the navbar then you probably need to put it in the view itself... perhaps in the table or above the table. Goodluck! - Alex G
I don't see any Restore button on Angry Birds for Mighty Eagle? Why isn't it rejected? - erkanyildiz
And there is another: Forever Drive. This one too has no Restore button and not rejected. - erkanyildiz
@erkanyildiz Have a look at the details of Restoring Previous Completed Purchases here : (link requires apple developer account) developer.apple.com/appstore/in-app-purchase/… Consumable products don't require a restore. - Geoff Evason

4 Answers

43
votes

I use a variation of this:

//inside of an IBaction
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
[[SKPaymentQueue defaultQueue]restoreCompletedTransactions];


// Then this is called
- (void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue {
    NSLog(@"%@",queue );
    NSLog(@"Restored Transactions are once again in Queue for purchasing %@",[queue transactions]);  

    NSMutableArray *purchasedItemIDs = [[NSMutableArray alloc] init];
    NSLog(@"received restored transactions: %i", queue.transactions.count);

    for (SKPaymentTransaction *transaction in queue.transactions) {
        NSString *productID = transaction.payment.productIdentifier;
        [purchasedItemIDs addObject:productID];
        NSLog (@"product id is %@" , productID);
        // here put an if/then statement to write files based on previously purchased items
        // example if ([productID isEqualToString: @"youruniqueproductidentifier]){write files} else { nslog sorry}
    }  
}

Sorry, I'm on my iPad if this makes no sense.

28
votes

Alex, i've been rejected for the same reason last week, and this is right what Apple wanted - after adding such a Restore button they didn't ask any other question on this subject.

Of course, you need not only to call [[SKPaymentQueue defaultQueue] restoreCompletedTransactions];, but implement the restoring itself too (i mean, providing the content to user).

4
votes

This is because you can be signed in with the same Apple ID on different iOS devices.

For example, let's say I'm logged into [email protected] on an iPad. When I download your application, I realize that I would like to remove the ads, so I pay 99¢ to remove them.

A year later, I decide to buy an iPhone, and sign into [email protected] on that account, and I download your app again. However, the ads are still there, even though I already paid to remove them on my iPad. That's where the restore feature comes in. Using that, I can restore the purchases that I made on my iPad, and make them work on my iPhone.

To restore the purchase, you could use:

[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];

This causes the

(void) paymentQueueRestoreCompletedTransactionsFinished: (SKPaymentQueue *)queue

method to be called. Inside of that, you need to provide the user with the content that they bought.

3
votes

Alternative to restore button could be a restore switch in app settings bundle. It does not overwhelm UI and seems like Apple welcomes it (but be sure to mention that you have implemented mechanics this way).

BOOL shouldRestorePurchases = [[NSUserDefaults standardUserDefaults] boolForKey:@"restorePurchasesKey"];