How to get locale currency price for in-app purchases in iOS?

31,212

Solution 1

productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:prodcutIdentifier];
    productsRequest.delegate = self;
    
    // This will trigger the SKProductsRequestDelegate callbacks
    [productsRequest start];

This will call your delegate function. Once the above is done, it will automatically call the below mentioned function finally. This is where the app store request sent will be finalized.

(void)requestDidFinish:(SKRequest *)request
{
   
    
    SKProduct *book = [Books objectAtIndex:0];
        
    NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
    [numberFormatter setFormatterBehavior:NSNumberFormatterBehavior10_4];
    [numberFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
    [numberFormatter setLocale:book.priceLocale];
    
    NSLocale* storeLocale = book.priceLocale;
    NSString *storeCountry = (NSString*)CFLocaleGetValue((CFLocaleRef)storeLocale, kCFLocaleCountryCode);
    
}

provide the Locale and country details as per your interest.

Solution 2

Here book is the SKProduct:

NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setFormatterBehavior:NSNumberFormatterBehavior10_4];
[numberFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
[numberFormatter setLocale:book.priceLocale];
NSString *formattedPrice = [numberFormatter stringFromNumber:book.price];

NSLog(@"%@", formattedPrice);

simply ask if anything unclear!

Regards,

Solution 3

One line of code:

product is the SKProduct object instance:

NSString *price = [NSString stringWithFormat:@"%@%@ %@", [product.priceLocale objectForKey:NSLocaleCurrencySymbol], product.price, [product.priceLocale objectForKey:NSLocaleCurrencyCode]];

Results:

$1.39 USD

Solution 4

In Swift 3:

    let numberFormatter = NumberFormatter()
    numberFormatter.formatterBehavior = .behavior10_4
    numberFormatter.numberStyle = .currency
    numberFormatter.locale = product.priceLocale
    let formattedPrice = numberFormatter.string(from: product.price)

Solution 5

i use this:

  NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
    [numberFormatter setFormatterBehavior:NSNumberFormatterBehavior10_4];
    [numberFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
    [numberFormatter setLocale:basicProduct.priceLocale];
    NSString *formattedString = [numberFormatter stringFromNumber:basicProduct.price];
    NSLog(@"product with currency:%@", formattedString);
    [retDict setObject:formattedString forKey:@"basic_price"];
    NSLog(@"Product title: %@" , basicProduct.localizedTitle);
    NSLog(@"Product description: %@" , basicProduct.localizedDescription);
    NSLog(@"Product price: %@" , basicProduct.price);
    NSLog(@"Product id: %@" , basicProduct.productIdentifier);

in delegate method:

 - (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response

this can be done before the user clicks to start buying stuff..

Share:
31,212
Senthilkumar
Author by

Senthilkumar

Updated on December 07, 2020

Comments

  • Senthilkumar
    Senthilkumar over 3 years

    I want to find out user's App Store location. It means they are in US, Australia(AUD) store. Following code used.

    - (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
    {
        Books = response.products;
        if ([SKPaymentQueue canMakePayments] && [response.products count]>0) {
    
        }
    
        for (SKProduct *book in Books) {
            NSLocale *locat=[NSLocale currentLocale];
            NSString *strlocate=[locat objectForKey:NSLocaleCountryCode];
    
            NSLog(@"\n\n\n Device country== %@ \n\n\n",strlocate);
    
            NSLocale* storeLocale = book.priceLocale;
            NSString *storeCountry = (NSString*)CFLocaleGetValue((CFLocaleRef)storeLocale, kCFLocaleCountryCode);
            NSLog(@"\n\n\n store country== %@ \n\n\n",storeCountry);
        }
    }
    

    I want like wise if book tier is one means US $ 0.99 AUD 0.99 JPY 85 based on the app store price matrix table.

    I tested in the simulator. I changed country name in iTunes, appstore and safari application in the system. but I get only US country code.

    Edit: Settings-> General-> International->Region Format-> country

    I tested in the device: Device country only changed. store country show US country code and price. I want to store country code before start inapp purchase time.

    how many days once change the price for based on currency fluctuation? is it provide any api/ query for fluctuated price to known/update?

    my inapp operation made one class. Before inapp operation made i want to display the local price to user same price effect reflect in the inapp operation.

    i display the list of book free and paid books thats is list get from my server. in that i display the price for each item. those item price while processing the appstore it will show the dollar price. if appstore shown the price as also i want to shown. so that i want to send country code to my server from that my server respond that country related price list and currency symbol..

  • Senthilkumar
    Senthilkumar over 11 years
    i want before start inapp purchase.. to display the local price
  • Asif Mujteba
    Asif Mujteba over 11 years
    please elaborate what do you mean by "before inapp", this code requires you to only request products and you can get product's prices and locales from response, no need to start inapp purchase process!
  • Senthilkumar
    Senthilkumar over 11 years
    my inapp operation made one class. Before inapp operation made i want to display the local price to user same price effect reflect in the inapp operation.
  • Senthilkumar
    Senthilkumar over 11 years
    i display the list of book free and paid books thats is list get from my server. in that i display the price for each item. those item price while processing the appstore it will show the dollar price. if appstore shown the price as also i want to shown. so that i want to send country code to my server from that my server respond that country related price list and currency symbol..
  • Asif Mujteba
    Asif Mujteba over 11 years
    You shouldn't save product price on your server, thats extremely discouraged, just save product identifiers on your server, then get those product identifiers from server and request their details from apple server, this approach is much better and would save you much hassle! but if you still want to access user's app store country code than here is very good answer
  • Senthilkumar
    Senthilkumar over 11 years
    this operation am doing in the another viewcontroller. so how can i do in the current view controller?
  • Andro Selva
    Andro Selva over 11 years
    Check for the internet connection and fetch the values at the beginning and store it locally. So each time check for internet connection and do the process. Only then you will be able to show the latest itunes price.
  • locoboy
    locoboy over 9 years
    can you get this without accessing the product?
  • gnasher729
    gnasher729 over 8 years
    Obfuscating (that's the macro), and badly wrong - if a Japanese person is connected to a US store and sees a $20 in app purchase displayed as 20 Yen, they will be very angry with you and accuse you of fraud.
  • mskw
    mskw over 7 years
    If Japanese wants to connect to us store, they will always see dollar sign.
  • mskw
    mskw over 7 years
    I meant to agree with gnasher in that the locale of the system is different than the App Store you are connected to
  • Tulleb
    Tulleb over 7 years
    When are you using numberFormatter in this example...?
  • Vyachaslav Gerchicov
    Vyachaslav Gerchicov about 7 years
    downvoted. This label is correct for USD and some other currencies but incorrect for example for RUB: 1.39 р.. You should always use NumberFormatter
  • Artem Shmatkov
    Artem Shmatkov over 5 years
    Looks like you have some extension for SKProduct named localizedPrice, because there is no default method with such title. If so you could provide here the code from this extension.
  • Amos
    Amos over 5 years
    thanks @zakhej, just checked it comes from SwiftyStoreKit, updated the answer, see if it helps?
  • Rob Slater
    Rob Slater over 2 years
    I am trying to use this solution in Xcode, but reference to Books (above) results in an error - ...undeclared identifier.... Been trying to resolve this for days, driving me mad. Any help much appreciated.