强制iOS

时间:2015-08-07 11:18:46

标签: ios nsuserdefaults reverse-geocoding nslocale clplacemark

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

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

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

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

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

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

2 个答案:

答案 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")
    }
})