我正在寻找类似于这两个问题的解决方案
但我希望能够获得非本地化版本的地址和位置。
在我的补充中,当在非拉丁语本地化设备上执行反向地理编码时,地理编码服务返回已包含本地化版本地址的CLPlacemark
。例如在日内瓦,当使用俄语的iPhone时,我正在
“ПлощадьПленпале”而不是“Place de Plainpalais”
这可能很酷,但令人困惑,因为街道名称不是西里尔字母。此外,我无法将地址的本地化版本提交给另一个API以查找行程。那么有没有办法在reverseGeocodeLocation
中强制使用语言环境,或者简单地欺骗操作系统,以便将语言环境语言设置为其他语言?
此外,在请求之前做这样的事情似乎不起作用,因为它需要重新启动应用程序
NSUserDefaults.standardUserDefaults().setObject("fr", forKey: "AppleLanguages"
NSUserDefaults.standardUserDefaults().synchronize()
答案 0 :(得分:0)
事实证明修改UserDefaults是不可能的(至少我发现没有可行的解决办法),所以我不得不使用外部反向地理编码器到我想要的(强制语言环境)。这是一个使用Google API和Alamofire以及SwiftyJSON的人,包含一个很好的completionHandler来在地理编码完成时获取地址
func getReversePositionFromGoogle(latitude:Double, longitude:Double, completionHandler: (JSON?, NSError?) -> ()) {
var parameters = ["latlng":"\(latitude), \(longitude)", "sensor": true, "language": "fr"]
Alamofire.request(.GET, "http://maps.google.com/maps/api/geocode/json", parameters: parameters as? [String : AnyObject])
.responseJSON(options: NSJSONReadingOptions.AllowFragments) { (request, response, responseObject, error) -> Void in
let json = JSON(responseObject!)
completionHandler(json, error)
}
}
答案 1 :(得分:0)
我知道这是旧线程,有人可能正在寻找像我这样的更新解决方案。
通过 Swift 4,iOS 11
进行了测试您可以通过设置额外的参数preferredLocale: Locale.init(identifier: "en_US")
来强制在选定的语言环境中获得地理编码结果。
CLGeocoder().reverseGeocodeLocation(location, preferredLocale: Locale.init(identifier: "en_US"), completionHandler: {(placemarks, error) -> Void in
print(location)
if error != nil {
print("Reverse geocoder failed with error" + error!.localizedDescription)
return
}
if placemarks!.count > 0 {
let pm = placemarks![0]
print(pm.administrativeArea!, pm.locality!)
}
else {
print("Problem with the data received from geocoder")
}
})