Andrey Chernukha
Andrey Chernukha

Reputation: 21808

In-App-Purchase takes too long time to show confirmation alert view

I have encountered the following issue: when my app runs on a device and I tap BUY button, which triggers In-App-Purchase mechanism it takes up to ten seconds to show the standard confirmation UIAlertView, the one which says: "Do you want to buy...". I have never seen such a behaviour before. Usually it happens immediately. So first I thought it might be due to poor internet connection or something like this, but the simulator uses the same WiFi network and it works perfectly, the alert view is presented instantly as it should be. So the problem probably lies somewhere else. Did anyone solve this issue already?

This is button click:

- (void)buyItemTapped:(id)sender
{
[[InAppPurchaseManager sharedInstance] buy:[NSString stringWithFormat:@"com.mycompany.myapp.unit%d", [sender tag] + 1]];

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(transactionFailed)
                                             name:TRANSACTION_FAILED_NOTIFICATION
                                           object:nil];

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(productPurchased:)
                                             name:PRODUCT_PURCHASED_NOTIFICATION
                                           object:nil];

}

buy method:

- (void)buy:(NSString *)identifier
{
SKProduct *product = [self.products objectForKey:identifier];

if (product)
   [self purchaseProduct:product];
else
{
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error"
                                                     message:@"Invalid Product Identifier"
                                                    delegate:nil
                                           cancelButtonTitle:@"OK"
                                           otherButtonTitles:nil];

    [alert show];

}
}

purchaseProduct method:

- (void)purchaseProduct:(SKProduct *)product
{
    if ([SKPaymentQueue canMakePayments])
{
    SKPayment *payment = [SKPayment paymentWithProduct:product];
    [[SKPaymentQueue defaultQueue] addPayment:payment];
 }
  else
      NSLog(@"Cannot make purchase");
}

Upvotes: 12

Views: 9474

Answers (3)

Jojodmo
Jojodmo

Reputation: 23616

This should have nothing to do with what an actual user experiences when they try to make the purchase. This is happening because you're running the app in the sandbox environment. In fact, using the simulator makes it even slower.

However, even when an actual user does make the purchase, the phone has to connect to Apple's servers, find the IAP, and then send the IAP data to the device securely. So, as you could imagine, it is normal that there is a little time before a confirmation message is sent back.

I recommend adding a loading screen in the SKPaymentTransactionStatePurchasing method, telling the user that you are in fact fetching the information. This could be as simple as changing the "Purchase" button to say "Purchasing...".

Again, this is 100% normal what you are seeing, but is mostly because you're using the sandbox and/or simulator. Apple has to do a lot of checks, and verify a lot of things before it can send back a confirmation message, so you should expect at least some minor delay (as if you were fetching information from a website).

Upvotes: 20

mengxiangjian
mengxiangjian

Reputation: 562

Are you in the sandbox environment? If so,that is a normal situation.I am in china,it always takes more than 10 second when I test IAP on device.I think it is not your technical issue.Believe yourself.:)

Upvotes: 5

Hendrik Demmer
Hendrik Demmer

Reputation: 201

A reason might be, that you are in the sandbox environment, which has occasional hiccups. Or your app could be doing some heavy lifting while performing the purchase, which slows down the device (but runs fast on the more powerful simulator).

Upvotes: 3

Related Questions