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

Ios CLPlacemark.locality,如果设备语言不同,则值会更改,ios,clgeocoder,Ios,Clgeocoder,我使用CLGeocoder将CLLocation从经度/纬度解码为地名。它很好用。但还有一件事困扰着我。当我将设备语言设置为英语时,代码的结果如下: - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation{ /* We received the new

我使用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];
}

以英文显示,如:成都

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

placemarker.locality
返回一个汉字值

但我真正想要的是它总是返回一个英文字符值(没有中文字符值)。
我想这是和地点有关的。有人能帮忙吗?谢谢。

我找到了一个很好的解决办法

NSString *country = placemark.ISOcountryCode;

这将返回准确的国家/地区,无论您所在的地区是什么。例如,国家将是“美国”而不是“美国”

通常,搞乱用户区域设置不是一个好的做法。如果设备语言设置为中文是因为用户想要阅读中文字符,那么,当用户已经告诉您他想要中文时,您为什么要用英文向他显示

无论如何,如果出于任何原因您需要强制使用英语,您可以欺骗使用standardUserDefaults第一语言的地理编码器,以便在调用地理编码器方法之前执行类似操作:

[[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"];

正如我所说,您应该认真思考为什么需要这个,但如果您真的需要这个,那就行了。

在ios 11中,您可以将preferredLocale参数传递给geocoder reverseGeocodeLocation方法

迅速:

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

Locale(identifier: "en_US")

尝试了这个解决方案,但它在iOS 9上不起作用,或者是因为模拟器。如果有人知道任何解决方法,请告诉我。这对我也不起作用@MohammadAshrafulKabir您对此有任何更新吗?@MohammadAshrafulKabir设置回初始语言:[[NSUserDefaults standardUserDefaults]setObject:userDefaultLanguages forKey:@“AppleLanguages”]应该放在completionHandler块下,在这种情况下,解决方案工作正常