Найти текущую страну с устройства iPhone

Мне нужно получить текущую страну в настройках iPhone. Может ли кто-нибудь сказать мне, как получить текущую страну в приложении iPhone.

Я должен использовать текущую страну для анализа RSS-канала, в котором мне нужно передать текущую страну.

Помогите, пожалуйста, найти страну.

Заранее спасибо.


person AppAspect    schedule 15.10.2010    source источник
comment
Это страна из настроек локализации айфона или страна, в которой айфон сейчас физически находится?   -  person JeremyP    schedule 15.10.2010


Ответы (8)


Чтобы найти страну выбранного пользователем языка:

NSLocale *currentLocale = [NSLocale currentLocale];  // get the current locale.
NSString *countryCode = [currentLocale objectForKey:NSLocaleCountryCode];
// get country code, e.g. ES (Spain), FR (France), etc.

В Swift:

let currentLocale = NSLocale.currentLocale()
let countryCode = currentLocale.objectForKey(NSLocaleCountryCode) as? String

Если вы хотите найти код страны текущего часового пояса, см. ответ @chings228.

Если вы хотите найти код страны физического местоположения устройства, вам понадобится CoreLocation с обратным геокодированием. Подробнее см. в этом вопросе: Как я могу получить текущее местоположение от пользователя в iOS

person kennytm    schedule 15.10.2010
comment
+1 хорошо, я узнаю что-то новое, пожалуйста, скажите, могу ли я получить больше информации об этом... - person Ranjeet Sajwan; 15.10.2010
comment
@ranjeet: ссылку на NSLocale можно найти в developer.apple.com/library/ios/#documentation/cocoa/reference/. - person kennytm; 15.10.2010
comment
Большое Вам спасибо. Я получил ответ. - person AppAspect; 16.10.2010
comment
Примечание! Это полезно ТОЛЬКО в том случае, если человек, использующий телефон, на самом деле настроил телефон на использование региональных настроек своей страны. Это НЕ обязательно так, и особенно бесполезно, если человек может быть в отпуске, а вам все еще нужно определить точную страну, в которой он находится. - person Ivan Vučica; 11.07.2012
comment
Я использую xcode 6 и iOS Simulator (iPhone 6/iOS 8.1). Я всегда получаю США в качестве кода страны, независимо от того, какой язык и регион я установил для симулятора iOS. Кроме того, вывод [[NSLocale PreferredLanguage] objectAtIndex:0] всегда имеет значение en. Как я узнаю, что код работает правильно? - person Unplug; 29.12.2014
comment
Спасибо Алекс. Это отличная вещь. - person Abdul Yasin; 13.04.2015
comment
NSLocale получает Country, но, даже если мы переедем в другую страну, он не получит, он читает из региона телефона. - person Vineesh TP; 29.07.2015
comment
@VineeshTP Для этого вам понадобится CoreLocation. - person kennytm; 29.07.2015
comment
Этот ответ дает вам локаль пользователя, но не имеет ничего общего с его текущим местоположением. Например. кто-то из Франции, посещающий Соединенные Штаты, по-прежнему будет иметь французскую локаль. - person ruralcoder; 13.05.2016
comment
@Unplug Я думаю, что в симуляторе используется ваш язык Mac (а не язык симулятора). Попробуйте изменить локаль Mac и посмотрите, получите ли вы правильные значения. - person user1264176; 17.02.2017
comment
Я использую ваш код. это работает хорошо. Но у меня есть проблема: один из моих пользователей использует iPhone, привезенный из США, и он использует это устройство в Индии. При запуске вашего кода страна отображается как США. Я хочу показать это как Индию. Пожалуйста, помогите мне в этом. - person Vinu Jacob; 28.08.2018
comment
@VinuJacob Пожалуйста, проверьте два других сообщения, связанных с ответом. - person kennytm; 28.08.2018

Для устройств с SIM-картой вы можете использовать это:

  CTTelephonyNetworkInfo * network_Info = [CTTelephonyNetworkInfo new];
  CTCarrier * carrier = network_Info.subscriberCellularProvider;
  NSString  * countryCode = [carrier.isoCountryCode uppercaseString];
person user2248258    schedule 06.04.2017

Для Свифт 4.0,

Вы можете просто использовать

let countryCode = Locale.current.regionCode

print(countryCode)

person Mehul Thakkar    schedule 18.08.2018
comment
Если я перееду в другую страну, то что мне вернется? - person Ekta Padaliya; 20.02.2020

NSLocale *countryLocale = [NSLocale currentLocale];  
NSString *countryCode = [countryLocale objectForKey:NSLocaleCountryCode];
NSString *country = [countryLocale displayNameForKey:NSLocaleCountryCode value:countryCode];
NSLog(@"Country Code:%@ Name:%@", countryCode, country);
//Country Code:IN Name:India

Ссылка на источник.

person Teja Kumar Bethina    schedule 17.03.2015
comment
Это должен быть NSLog(@Код страны:%@ Имя:%@, код страны, страна); - person AlexanderZ; 31.08.2015

Если вы тестируете и хотите использовать язык, отличный от языка вашей системы, проще всего изменить параметры вашей схемы Application Language и Application Region вместо того, чтобы менять язык и регион на вашем устройстве или симуляторе.

Перейдите к Product->Scheme->Edit Scheme...->Run->Options и выберите Application Language и Application Region, которые вы хотите протестировать.

«Редактировать

Из документации iOS: Тестирование интернационализированного приложения

person Heath Borders    schedule 11.12.2015
comment
Если вы считаете, что это плохой ответ, пожалуйста, оставьте комментарий о том, почему. Я сам использую эту стратегию, и насколько мне известно, она работает хорошо, но если с ней возникнут проблемы, я хотел бы знать о них! - person Heath Borders; 04.02.2016

Решение Swift 3.0

if let countryCode = (Locale.current as NSLocale).object(forKey: .countryCode) as? String {
            print(countryCode)
        }
person Sourabh Sharma    schedule 19.10.2016
comment
Почему бы не просто Locale.current.regionCode? - person redent84; 28.03.2017

Последний рабочий код Swift 3.0:

if let countryCode = (Locale.current as NSLocale).object(forKey: .countryCode) as? String {
    print(countryCode)
}
person Muhammad Nayab    schedule 07.07.2017

person    schedule
comment
Фрагмент кода работал нормально, но внезапно начал выдавать ошибку Exc_Bad_Access в последней строке.. !! =( NSZombie не может его обнаружить и приложение вылетает. - person tGilani; 03.07.2012