In-App Purchase is one of those great feature of the iOS ecosystem that I wish were easier to understand and implement in my apps. In the end it is just a machinery that will not really add value to my apps, and it would be great if the Apple motto “it just works” could be applied to StoreKit as well.
A very good read to start is this tutorial on Ray Wenderlish’s blog, which explains all the steps required, from setting up your in-app purchases items in itunesconnect to implementing MKStoreKit in your app.
Actually, so far I have found that the most convenient way to add In-App Purchase support to my apps is through Mugunth Kumar’s MKStoreKit. It makes things much easier and almost straightforward. On the other hand, MKStoreKit is presented by its author on a series of posts on his blog that are a bit sparse and fail somehow to give a quick view of the way you are supposed to make things work.
In this post, I am going to summarise the steps required to integrate MKStoreKit into your app for non-consumable non-renewable items. I will assume that all the App Store paraphernalia has been already dealt with; but if you are starting right now to use In-App Purchases, maybe you could read the first part of the aforementioned tutorial.
So, going to the meat of the thing, what you need to do to set up and use MKStoreKit in your app is:
- 1. in MKStoreConfigs.h define macros for all of your items: e.g.,
#define kKlimtPictureSetId @"org.freescapes.jigsaw.klimt.pictureset"
#define kKlimtAltPictureSetId @"org.freescapes.jigsaw.klimt.altpictureset"
- 2. create a MKStoreKitConfigs.plist file where you list all of your items; this could look like shown in the picture below.
- 3. in your app delegate call:
in order to initialize MKStoreKit and give it time to retrieve info from the App Store while the app is initialising;
- 4. whenever you want to check if a feature has been bought, call:
- 5. when the user buys some feature, call:
[[MKStoreManager sharedManager] buyFeature:kKlimtPictureSetId
- 6. to implement the required “restore purchases”, call:
[[MKStoreManager sharedManager] restorePreviousTransactionsOnComplete:^()
This is all that there is to it! Really straightforward and nice.