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

Posted

技术标签:

【中文标题】CLPlacemark.locality,如果设备语言不同,值会改变【英文标题】:CLPlacemark.locality, value changes if the device language is different 【发布时间】:2012-11-13 10:33:23 【问题描述】:

我使用 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

返回一个汉字值。

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

【问题讨论】:

【参考方案1】:

通常,混淆用户区域设置不是一个好习惯。如果设备语言设置为中文是因为用户想看汉字,那么为什么他已经告诉你他要中文,为什么还要给他看英文呢?

无论如何,如果出于任何原因您需要强制使用英语,您可以欺骗使用 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"];

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

【讨论】:

试过这个解决方案,但它在 ios 9 上不起作用,或者是因为模拟器。如果有人知道任何解决方法,请告诉我。 它对我也不起作用.. @MohammadAshrafulKabir 你对此有什么更新吗? @MohammadAshrafulKabir 设置初始语言:[[NSUserDefaults standardUserDefaults] setObject:userDefaultLanguages forKey:@"AppleLanguages"] 应该放在 completionHandler 块下,在这种情况下解决方案可以正常工作【参考方案2】:

我找到了一个不错的解决方案

NSString *country = placemark.ISOcountryCode;

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

【讨论】:

【参考方案3】:

从 ios 11 开始,您可以将 preferredLocale 参数传递给地理编码器的 reverseGeocodeLocation 方法。

在斯威夫特中:

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

preferredLocale 值示例:

Locale(identifier: "en_US")

【讨论】:

以上是关于CLPlacemark.locality,如果设备语言不同,值会改变的主要内容,如果未能解决你的问题,请参考以下文章

如果蓝牙设备不在 MFi 程序中,iPhone 至少可以发现该设备吗?

检测移动设备,如果移动设备使用替代 CSS 样式表? [复制]

如果设备被锁定,CADislayLink 不会触发

如果 Android 设备长时间处于空闲状态,则不会收到推送通知

用Shell编程,判断文件是否字符设备文件,如果是将其拷贝到/dev目录下

如果主设备的 GTID 与从设备的 GTID 不同,我怎么能惊慌失措?