1

我正在寻找类似于这两个问题的解决方案

但我希望能够获得地址和位置的非本地化版本。在我的补充中,当对非拉丁本地化设备地理编码服务进行反向地理编码时,CLPlacemark它会返回已经包含本地化版本的地址。例如在日内瓦,当我用俄语使用 iPhone 时,我得到了

“Площадь Пленпале”而不是“Place de Plainpalais”

这可能很酷,但仍然令人困惑,因为街道名称不是西里尔字母。此外,我无法将地址的本地化版本提交给另一个 API 以查找行程。那么有没有办法强制使用语言环境reverseGeocodeLocation或短暂欺骗操作系统认为语言环境设置为其他语言?

另外,在请求之前做这样的事情似乎不起作用,因为它需要重新启动应用程序

NSUserDefaults.standardUserDefaults().setObject("fr", forKey: "AppleLanguages"   
NSUserDefaults.standardUserDefaults().synchronize()
4

2 回答 2

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")
    }
})
于 2019-01-25T23:32:10.720 回答
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)
    }
}
于 2015-08-11T16:30:11.673 回答