CLPlacemark.locality,如果设备语言不同,则值会更改

时间:2012-11-13 10:33:23

标签: ios clgeocoder

我使用CLGeocoder将CLLocation从经度/纬度解码为地名。它工作正常。但是仍然有一件事困扰着我。当我将设备语言设置为英语时,代码的结果如下:

- (void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
       fromLocation:(CLLocation *)oldLocation{
       /* We received the new location */
       NSLog(@"Latitude = %f", newLocation.coordinate.latitude);
       NSLog(@"Longitude = %f", newLocation.coordinate.longitude);
       [self.geoCoder reverseGeocodeLocation:newLocation completionHandler:^(NSArray* placemarks, NSError* error){
           MKPlacemark *placemarker = [placemarks objectAtIndex:0];
           NSLog(@"%@",placemarker.locality);
       }];
      [self.locationManager stopUpdatingLocation];

}

以英文显示,例如:chengdu。

当我将设备语言更改为中文时,

placemarker.locality

返回中文字符值。

但我真正想要的是它总会返回一个英文字符值(没有中文字符值)。 我猜这是与语言环境有关的东西。任何人都可以帮忙吗?感谢。

3 个答案:

答案 0 :(得分:14)

通常,混淆用户区域设置不是一个好习惯。如果将设备语言设置为中文是因为用户想要阅读中文字符,那么当他告诉你他想要中文时,你为什么要用英语给他看?

无论如何,如果由于任何原因你需要强制使用英语,你可以欺骗使用standardUserDefaults第一语言的geoCoder,这样你就可以在调用geoCoder方法之前做这样的事情:

[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"en", nil] forKey:@"AppleLanguages"];

这样,geoCoder会以英文为您提供所有信息。

但是,这会改变用户偏好,因此这是将它们带回原处的最佳方法:

NSMutableArray *userDefaultLanguages = [[NSUserDefaults standardUserDefaults] objectForKey:@"AppleLanguages"];
[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"en", nil] forKey:@"AppleLanguages"];

[self.geoCoder reverseGeocodeLocation:newLocation completionHandler:^(NSArray* placemarks, NSError* error){
       MKPlacemark *placemarker = [placemarks objectAtIndex:0];
       NSLog(@"%@",placemarker.locality);
   }];

[[NSUserDefaults standardUserDefaults] setObject:userDefaultLanguages forKey:@"AppleLanguages"];

正如我所说,你应该真的想到为什么你需要这个,但如果你真的需要这个,那就行了。

答案 1 :(得分:5)

我找到了一个很好的解决方案

NSString *country = placemark.ISOcountryCode;

无论您的语言环境如何,都会返回确切的国家/地区。例如,国家将是@“US”而不是@“United States”

答案 2 :(得分:0)

在ios 11中,您可以将preferredLocale参数传递给地址解析器reverseGeocodeLocation方法。

在Swift中:

geocoder.reverseGeocodeLocation(
  location: CLLocation,
  preferredLocale: Locale?,
  completionHandler: {}
)

preferredLocale值示例:

Locale(identifier: "en_US")