How to test IAP (in-app purchase) in iOS Simulator OR on the Device?

I've implemented a simple non-consumable in-app purchase mechanism by following the Ray Wenderlich tutorial book.

When my app starts, I initiate a product info request:

self.productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:productIdentifiers];
_productsRequest.delegate = self;
[_productsRequest start];

The SKProductRequest gets created. It has a memory address but nothing else happens. None of the delegate methods gets called:

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {
    NSLog(@"Product info received...");
    NSArray *products = response.products;
    for (SKProduct *product in products) {
        NSLog(@"ID: %@, title:%@, (%f)", product.productIdentifier, product.localizedTitle, product.price.floatValue);

    self.productsRequest = nil;

- (void)request:(SKRequest *)request didFailWithError:(NSError *)error {
    NSLog(@"Failed to load list of products");
    self.productsRequest = nil;

I checked twice:

  • App fully set-up in iTunes Connect.
  • Status of app in ITC is "Prepare for Upload"
  • One non-consumable IAP added.
  • Status of IAP product in ITC is "Ready to Submit"
  • App ID is com.mycompany.myapp both for the app and in the plist. Checked twice.
  • IAP uses com.mycompany.myapp.productname (using exact same ID for the request).
  • Created a test user account in ITC.
  • Nothing submitted to Apple yet.
  • My Mac has internet access.
  • There are no other messages in the console or on screen.

The Ray Wenderlich book doesn't mention I must do anything else besides this.

Only once I saw a -didFailWithError: call to my delegate on the Device, but it never again appeared. My delegate doesn't get called both on device or simulator. I let it run for minutes with no response at all.

iTunes Connect gives this confusing warning:

Your first In-App Purchase(s) must be submitted with a new app version. Select them from the In-App Purchases section of the Version Details page and then click Ready to Upload Binary.

Is this required prior to being able to test In-App Purchases?


In the current version of Xcode 5.0 (5A1413), In-App purchases will not work in the iOS simulator.

StoreKit (In-App purchases) will not work in the Simulator. 13962338

Source: Xcode 5.0 Release Notes > Known issues > iOS Simulator

In iOS simulator documentation it is written :

API Limitations

Within iOS Simulator, there are some limitations to the APIs and features, including:

Apple Push Services
Privacy alerts for access to Photos, Contacts, Calendar, and Reminders
The UIBackgroundModes key
iCloud document syncing and key-value storage support

Unsupported frameworks include:

External Accessory
Media Player
Message UI 
Event Kit
In UIKit, the UIVideoEditorController class
Store Kit

As in-app purchase needs Store Kit to work and the Store Kit framework is unsupported for Simulator, you can't test IAP in iOS Simulator.

More information : iOS Simulator documentation

Unfortunately there are several things you can not test on the simulator. In App Purchases belongs in that list.

So you can not test In App Purchases in simulator, you need an iOS device for that.

Edit: As far as I can see, that is what happens when you try to test IAP on the simulator, purchase delegates won't get called.

I figured out something:

I initiated the SKProductRequest immediately at the end of AppDelegate's -didFinishLaunching... and it never worked.

Then I made a delayed call and waited 3 seconds. From then on it started working. So you can't make StoreKit requests immediately after app launch.

Where is your skProductRequest object is declared? Try a global declaration of skProductRequest.

Need Your Help

Sending intent with bundle using console

android android-intent console bundle adb

I'm developing an Android app listening for specific intent containing a bundle with some data. I would like to send an intent to my app using adb. I have tried with:

JOOQ API getPrimaryKey() returns null to each table?

java sql jooq

I have noticed that in JOOQ API the "tableByName("table_name").getPrimaryKey()" returns null. I guess this is because there is no real query happens in the background. Is it possible to force JOOQ ...