当我打电话时
geocoder reverseGeocodeLocation:currentLoc completionHandler:
我根据 iPhone 上设置的语言环境获取所有数据(城市、县、...)。
我如何强制始终以英语获取这些数据?
当我打电话时
geocoder reverseGeocodeLocation:currentLoc completionHandler:
我根据 iPhone 上设置的语言环境获取所有数据(城市、县、...)。
我如何强制始终以英语获取这些数据?
对于未来的读者来说,接受的答案是不正确的(至少不再是)。
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“设置”应用程序中的全局语言首选项同步。
您不能强制使用从CLGeocoder
或检索的地理数据的语言MKReverseGeocoder
。它始终是设备的系统语言。如果您想获取英文数据,您需要构建自己的地理编码器,这相对容易使用Google Maps API实现。
这是 Google Maps API 中支持的语言的电子表格: https ://spreadsheets.google.com/pub?key=p9pdwsai2hDMsLkXsoM05KQ&gid=1
更新斯威夫特 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 是当前用户位置。
iOS 11 有一个新-reverseGeocode...
方法可以接受要使用的语言环境:
- (void)reverseGeocodeLocation:(CLLocation *)location preferredLocale:(NSLocale *)locale
completionHandler:(CLGeocodeCompletionHandler)completionHandler
快速签名:
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
}];
只需将语言环境设置为特定您的语言
let locale = Locale(identifier: "en_US")
CLGeocoder().reverseGeocodeLocation(location, preferredLocale: locale, completionHandler: {(placemarks, error) in
})