在 iOS 中强制使用 reverseGeocodeLocation 的语言环境

Posted

技术标签:

【中文标题】在 iOS 中强制使用 reverseGeocodeLocation 的语言环境【英文标题】:Force locale for reverseGeocodeLocation in iOS 【发布时间】:2015-08-07 11:18:46 【问题描述】:

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

how to localize address result from reverseGeocodeLocation? Reverse geocoding to return results only in English?

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

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

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

此外,在请求似乎不起作用之前执行类似的操作,因为它需要重新启动应用程序

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

【问题讨论】:

【参考方案1】:

事实证明,修改 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)
    

【讨论】:

【参考方案2】:

我知道这是旧线程,可能有人像我一样正在寻找更新的解决方案。

使用 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")
    
)

【讨论】:

以上是关于在 iOS 中强制使用 reverseGeocodeLocation 的语言环境的主要内容,如果未能解决你的问题,请参考以下文章

强制应用在 iOS 8 中使用 Apple 键盘

在 iOS 中强制使用 reverseGeocodeLocation 的语言环境

iOS 7 使用 UINavigationController 在 UIViewController 上强制景观

如何在 iOS 8 中强制视图控制器方向?

在 iOS9 中强制缩放应用

在 iOS 中强制音频采样率