Sharing an IAP between apps

So I have a quite specific situation:

I'm doing a rewrite of an existing app, which I want to publish as a new, different app (it changes too many features that would annoy too many users to be a simple update)

Both old and new apps are free, with an IAP to unlock pro features.

I want pro users of the old app to get the pro features in the new app for free.

The old app is iPad only, but the new one is universal.


The solution I settled on is this:

- The old app stores it's receipt in a shared keychain

- The new app finds and validates this receipt

- If it contains a pro upgrade, the user is given the option to buy a free (or maybe discounted) IAP

- Otherwise they have to buy the full-price IAP.



Technically I'm happy with this setup, but I'm worried about getting it through app-review.


In ascending order of worry:

  • There used to be a rule against sharing IAPs (which was removed a while ago)
  • I'm worried about explaining the process to unlock the free IAP to the app-reviewer
  • For the old app's receipt to validate in the new app's environment, both apps have to have the same UIDevice.current.identifierForVendor. But I don't know if that holds true between an in-review app and a production one. So I don't know if this setup can be successfully tested at all in the review environment.
Answered by PBK in 257509022

You have a problem with a new user who loads your app onto their iPhone. How will they get the credit since the old app can't be on the same device. It works if you expose a 'free' IAP - but that can only be done when the IAP downloads content.


Another method of communicating from one app to other apps is through a shared key-value file on the user's iCloud Account. You can also share the an NSUserDefault file.


Regarding verifying any receipt - that may not be necessary. After all, the first app has verified the receipt so you know it's legit. You can simply store two numbers in a shared space - one is the device's identifierForVendor and the other is a hash of that identifierForVendor plus some secret that only your code knows.


If the system works, App Review will be able to exercise it.

Accepted Answer

You have a problem with a new user who loads your app onto their iPhone. How will they get the credit since the old app can't be on the same device. It works if you expose a 'free' IAP - but that can only be done when the IAP downloads content.


Another method of communicating from one app to other apps is through a shared key-value file on the user's iCloud Account. You can also share the an NSUserDefault file.


Regarding verifying any receipt - that may not be necessary. After all, the first app has verified the receipt so you know it's legit. You can simply store two numbers in a shared space - one is the device's identifierForVendor and the other is a hash of that identifierForVendor plus some secret that only your code knows.


If the system works, App Review will be able to exercise it.

Sharing an IAP between apps
 
 
Q