为什么Locale.current.regionCode为零?

时间:2017-03-06 21:07:13

标签: ios swift ios9

我正在尝试使用以下方法在swift 3中获取用户的区域代码:

Locale.current.regionCode

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

非常感谢。

4 个答案:

答案 0 :(得分:5)

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

enter image description here

答案 1 :(得分:2)

对于在 SIMULATOR 中寻找解决方案的用户,请转到“设置>常规>语言和地区”并更改地区。

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

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

答案 2 :(得分:1)

Many of the properties on Locale can return nil for various reasons on iOS (and Android).

You may also use objectForKey:NSLocaleCountryCode to query the country code.

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

It's a good idea to have a fallback logic to find countryCode with CoreTelephony.

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

Or/And with reverse geocode:

// 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;
        }
    }
}

For instance, on Android version of corresponding region query for Locale, it's nil for many of the rooted devices.

答案 3 :(得分:0)

documentation for regionCode状态

  

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

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