iOS Question B4i Restoring non-consumable purchases


Licensed User
Need help with Restoring non-consumable purchases. I can’t restore purchases or obtain related information. Here is how I am testing it-

1. Purchase an item in Sandbox Environment and get its confirmation. All items associated with this purchase now work fine.

2. Delete the app

3. Reinstall it

4. At some point in the app it tries to restore any prior purchases with –

This raises-

Sub MyStore_TransactionsRestored (Success AsBoolean)
And returns Success as True

Sub MyStore_PurchaseCompleted (Success AsBoolean, Product AsPurchase)

is not raised and thus no information of past purchases is returned

5. If I try to purchase this item again it lets me purchase it again saying-
You’ve Already Purchased This Subscription. Tap Buy to renew or extend it.
In this Sandbox Environment I get the choice to Cancel or Buy.

Cancel takes me out of purchasing and Buy lets me buys it again.
Either way I don’t get any info on the earlier purchase(s).

How do I get the Product. ProductIdentifier and Product. TransactionDate of past purchases?

Note that the non-consumable item in this case is a non-renewing subscription.
Last edited:


Licensed User
Yes. PurchaseCompleted is raised by RestoreTransactions for a regular non-consumable product.

To make sure, I created a new test product that is non-consumable and is not subscription. It worked just as you describe in your In-app purchase write up. Purchase details are obtained as Product.ProductIdentifier when
PurchaseCompleted (Success AsBoolean, Product AsPurchase)
is raised by

I need this to work for non-renewing subscription.


Licensed User
In such a case a viable alternative would be to save the purchase receipt in users iCloud account at the time of purchase (in addition to saving it on the device) and then look there for future validations and restorations? Can you please give a sample code how this can be accomplished with B4i? Or, if there may be another practical way to sell a feature of the app for limited time and be able to restore it on all user's devices.


Licensed User
There is no other server associated with this app, so iCloud is the only thing available to try to work out with. The link

describes (below) a way to save a receipt in User Default or iCloud. Perhaps this receipt can also be verified from user's other devices. How can this be done in B4i?

Persisting a Receipt in User Defaults or iCloud
To store a transaction’s receipt in User Defaults or iCloud, set the value for a key to the data of that receipt.

NSUbiquitousKeyValueStore *storage = [NSUbiquitousKeyValueStore defaultStore];
NSUserDefaults *storage = [NSUserDefaults standardUserDefaults];
NSData *newReceipt = transaction.transactionReceipt;
NSArray *savedReceipts = [storage arrayForKey:mad:"receipts"];
if (!receipts) {
// Storing the first receipt
[storage setObject:mad:[newReceipt] forKey:mad:"receipts"];
} else {
// Adding another receipt
NSArray *updatedReceipts = [savedReceipts arrayByAddingObject:newReceipt];
[storage setObject:updatedReceipts forKey:mad:"receipts"];
[storage synchronize];


Licensed User
How can I programmatically check for and sync or read a DirDocuments file backed up in iCloud from another device of the user?