Принудительная локаль для reverseGeocodeLocation в iOS

Я ищу решение, похожее на эти два вопроса

Но я хочу иметь возможность получить нелокализованную версию адреса и местонахождения. В моем добавлении, при обратном геокодировании на нелатинском локализованном устройстве служба геокодирования возвращает 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)
    }
}
Другие вопросы по тегам