我打电话的时候
geocoder reverseGeocodeLocation:currentLoc completionHandler:
我根据iphone上设置的语言设置获取所有语言的数据(城市,县,...)。
我如何强制总是用英语获取这些数据?
您无法强制从CLGeocoder
或MKReverseGeocoder
检索的地理数据的语言。它始终是设备的系统语言。如果你想用英语获取数据,你需要建立自己的地理编码器,使用Google Maps API相对容易实现。
以下是Google Maps API中支持的语言的电子表格:https://spreadsheets.google.com/pub?key=p9pdwsai2hDMsLkXsoM05KQ&gid=1
对于未来的读者来说,接受的答案是不正确的(至少不再是这样)。
UserDefaults.standard.set(["en"], forKey: "AppleLanguages")
gc.reverseGeocodeLocation(loc) {
print($0 ?? $1!)
UserDefaults.standard.removeObject(forKey: "AppleLanguages")
print(UserDefaults.standard.object(forKey: "AppleLanguages") as! [String])
}
调用removeObject(forKey:)
非常重要,因为您要将UserDefaults
中的返回值重置为系统设置。一些答案使您保持调用UserDefaults.standard.object(forKey: "AppleLanguages")
的原始值并在获取地址后设置它,但这将阻止您的UserDefaults
与iOS“设置”应用程序中的全局语言首选项同步。
iOS 11有一个新的-reverseGeocode...
方法,它接受使用的语言环境:
- (void)reverseGeocodeLocation:(CLLocation *)location preferredLocale:(NSLocale *)locale
completionHandler:(CLGeocodeCompletionHandler)completionHandler
Swift签名:
func reverseGeocodeLocation(_ location: CLLocation, preferredLocale locale: Locale?, completionHandler: @escaping CLGeocodeCompletionHandler)
把你喜欢的任何地方。此示例仅使用当前区域设置
NSLocale *currentLocale = [NSLocale currentLocale];
[self.geocoder reverseGeocodeLocation:self.location preferredLocale:currentLocale
completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
// Handle the result or error
}];
更新Swift 4:
只需使用此代码强制以英语返回的数据:
func fetchCityAndCountry(from location: CLLocation, completion: @escaping (_ locality: String?, _ country: String?, _ error: Error?) -> ()) {
CLGeocoder().reverseGeocodeLocation(location, preferredLocale: Locale.init(identifier: "en")) { placemarks, error in
completion(placemarks?.first?.locality,
placemarks?.first?.country,
error)
}
}
您可以更改区域设置标识符以将数据转换为任何其他语言(“ca”,“es”,“fr”,“de”...)。
例如,可以调用此函数,如下所示:
fetchCityAndCountry (from: userLocationCL) { locality, country, error in
guard let locality = locality, let country = country, error == nil else { return }
// your code
}
其中userLocationCL是当前用户位置。