Принудительная локаль для reverseGeocodeLocation в iOS
Я ищу решение, похожее на эти два вопроса
- как локализовать адрес результата из reverseGeocodeLocation?
- Обратное геокодирование для возврата результатов только на английском языке?
Но я хочу иметь возможность получить нелокализованную версию адреса и местонахождения. В моем добавлении, при обратном геокодировании на нелатинском локализованном устройстве служба геокодирования возвращает CLPlacemark
который уже содержит локализованную версию адреса. Например в Женеве, при использовании iPhone на русском я получаю
"Площадь Пленпале" вместо "Place de Plainpalais"
что, вероятно, круто, но, тем не менее, сбивает с толку, поскольку названия улиц не на кириллице. Кроме того, я не могу отправить локализованную версию адреса другому API, чтобы найти маршрут. Так есть ли способ заставить локаль в reverseGeocodeLocation
или кратко обмануть ОС, думая, что язык локали настроен на что-то другое?
Кроме того, выполнение чего-то подобного непосредственно перед тем, как запрос кажется не работает, так как требует перезапуска приложения.
NSUserDefaults.standardUserDefaults().setObject("fr", forKey: "AppleLanguages"
NSUserDefaults.standardUserDefaults().synchronize()
1 ответ
Я знаю, что это старая тема, кто-то может искать обновленное решение, как я.
Протестировано с 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")
}
})
Оказывается, изменение UserDefaults было невозможно (по крайней мере, я не нашел жизнеспособного решения для этого), поэтому мне пришлось использовать внешний обратный геокодер в соответствии с тем, что я хотел (принудительная локаль). Вот один из них, использующий Google API и Alamofire и SwiftyJSON, завернутый в приятный завершение Handler, чтобы получить адрес, когда геокодирование выполнено
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)
}
}