Senthilkumar
Senthilkumar

Reputation: 2481

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

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..

Upvotes: 30

Views: 33500

Answers (9)

Amos
Amos

Reputation: 2670

Use https://github.com/bizz84/SwiftyStoreKit, there is

localizedPrice in SKProduct

Directly use this member variable is OK, NO ANY CODE CONVERSION IS NEEDED!!

App Store will response the correct local price to your app, based on the current user's App Store Country/Region. How to change:

https://apple.stackexchange.com/a/89186/283550

I've tested the behaviour, it's correct after I changed the country from Hong Kong to Taiwan, I can see the price Tier 1 changed from HK$8 to $30. (Hong Kong Dollar to Taiwan Dollar)

Upvotes: -1

brnunes
brnunes

Reputation: 1953

In Swift 3:

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

Upvotes: 10

mskw
mskw

Reputation: 10358

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

Upvotes: 10

Kirtikumar A.
Kirtikumar A.

Reputation: 4204

You can go to know more on locale objects,also I think you also can use the currency locale by NSLocale ,as shown below

 NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setNumberStyle:NSNumberFormatterCurrencyStyle];
[formatter setLocale:[NSLocale currentLocale];
NSString *localizedMoneyString = [formatter stringFromNumber:myCurrencyNSNumberObject];

and You would get the correct formatted currency string like this,

SKProduct *product = [self.products objectAtIndex:indexPath.row];
NSNumberFormatter *formatter = [[[NSNumberFormatter alloc] init] autorelease];
[formatter setNumberStyle:NSNumberFormatterCurrencyStyle];
[formatter setLocale:product.priceLocale];
currencyString = [formatter stringFromNumber:product.price];

and i also tried this one in my app

NSDecimalNumber *amount = [NSDecimalNumber decimalNumberWithString:@"50.00"];
NSNumberFormatter *currencyFormat = [[NSNumberFormatter alloc] init];
NSLocale *locale = [NSLocale currentLocale];
[currencyFormat setNumberStyle:NSNumberFormatterCurrencyStyle];
[currencyFormat setLocale:locale];
NSLog(@"Amount with symbol: %@", [currencyFormat stringFromNumber:amount]);//Eg: $50.00
NSLog(@"Current Locale : %@", [locale localeIdentifier]);//Eg: en_US

Hope It will help you

Upvotes: 5

Hardik Darji
Hardik Darji

Reputation: 3684

create macro first then use it
#define CURRENCY_SYMBOL [[NSLocale currentLocale] objectForKey:NSLocaleCurrencySymbol]

NSLog(@"%@ %.2f",CURRENCY_SYMBOL,25.50);

Upvotes: -4

Andro Selva
Andro Selva

Reputation: 54332

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.

Upvotes: 33

Nikita P
Nikita P

Reputation: 4246

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..

Upvotes: 6

Asif Mujteba
Asif Mujteba

Reputation: 4656

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,

Upvotes: 28

pcholberg
pcholberg

Reputation: 520

On device in productsResponse you receive correct product.price and product.priceLocale for AppStore account, you are currently logged in. So if you use this locale for formatting received price, you will get strings like "0.99$", "33,0 руб." and so on.

Upvotes: 3

Related Questions