为什么Locale.current.regionCode为nil?

问题描述 投票:12回答:4

我正在尝试通过使用以下命令快速获得用户的区域代码3:

Locale.current.regionCode

不幸的是regionCode为nil,你知道为什么吗?我应该怎么做才能获得它?

非常感谢。

ios swift ios9
4个回答
7
投票

我遇到了同样的问题,事实证明是因为我将我的Scheme设置为特定的语言。如果同时将“应用程序语言和应用程序区域”设置为“系统语言/区域”,则它应该可以工作。

enter image description here


4
投票

对于那些在模拟器中寻求解决方案的人,请转到“设置>常规>语言和地区”并更改地区。

它为我和其他人工作。由于一个奇怪的未知原因,某些模拟器直到该区域至少更改一次才返回该区域。

我不知道它是否也可以在真实设备上运行,因为我在真实设备上没有这个问题。


1
投票

由于各种原因,Locale的许多属性在iOS(和Android)上可能返回nil。

您也可以使用objectForKey:NSLocaleCountryCode查询国家代码。

// code may be nil
NSString *code = [[NSLocale currentLocale] objectForKey:NSLocaleCountryCode]; 

具有备用逻辑以通过CoreTelephony查找countryCode是一个好主意。

CTCarrier *carrier = [[CTTelephonyNetworkInfo new] subscriberCellularProvider];
NSString *countryCode = carrier.isoCountryCode;

或/并且使用反向地理编码:

// CLLocationManagerDelegate
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations {
    __block CLLocation *location = [locations firstObject];

    [[[CLGeocoder alloc] init] reverseGeocodeLocation:location completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
        if (!error && placemarks.count > 0) {
            CLPlacemark *placemark = [placemarks firstObject];
            // Use placemark.country;
            // Use placemark.ISOCountryCode;
        }
    }
}

例如,在对应区域查询的Android版本上,对于Locale而言,对于许多有根设备而言,它为零。


1
投票

documentation for regionCode状态

语言环境的区域代码;如果没有,则为nil。

某些语言环境根本没有地区(也称为国家/地区)代码。但是我不知道哪些不是。

© www.soinside.com 2019 - 2024. All rights reserved.