通过邮政编码获取经纬度时出现kCLErrorDomain Code=8错误求助
问题
尝试根据输入的邮编/城市+国家代码获取经纬度,输入城市(如Shanghai, CN)时代码可正常运行,但输入邮政编码(如200040, CN)时会报错(已确认位置服务及应用权限均已开启)。
代码如下:
func getLocationFrom(postalCityCode: String, countryCode: String) -> CLLocation? { let geocoder = CLGeocoder() var location: CLLocation? let address = CNMutablePostalAddress() address.postalCode = postalCityCode address.country = countryCode geocoder.geocodePostalAddress(address, preferredLocale: Locale.current) { (placemarks, error) in guard error == nil else { print("Error: \(error!)") return } guard let placemark = placemarks?.first else { print("Error: placemark is nil") return } guard let coordinate = placemark.location?.coordinate else { print("Error: coordinate is nil") return } location = CLLocation(latitude: coordinate.latitude, longitude: coordinate.longitude) print("Found location = \(location)") } return location }
编辑:已按照建议更新代码,但问题依旧。
解决方案
1. 修复异步调用的返回逻辑
CLGeocoder.geocodePostalAddress是异步方法,原代码直接return location时,闭包内的地理编码操作尚未完成,因此返回的location始终为nil。必须改用闭包回调的方式返回结果,而非同步返回值。
2. 修正地址属性赋值错误
CNMutablePostalAddress的country字段用于存储本地化的国家名称(如"中国"或"China"),ISO国家代码(如"CN")应赋值给isoCountryCode属性,否则地理编码服务无法正确识别国家信息。
3. 指定匹配国家的Locale
使用对应国家的Locale(如中国用Locale(identifier: "zh_CN"))能提升邮编解析的成功率,避免因系统默认Locale不匹配导致的解析失败。
修改后的代码
func getLocationFrom(postalCityCode: String, countryCode: String, completion: @escaping (CLLocation?, Error?) -> Void) { let geocoder = CLGeocoder() let address = CNMutablePostalAddress() address.postalCode = postalCityCode // 正确设置ISO国家代码 address.isoCountryCode = countryCode // 指定对应国家的Locale,提升解析准确率 let locale = Locale(identifier: "\(Locale.current.languageCode ?? "zh")_\(countryCode)") geocoder.geocodePostalAddress(address, preferredLocale: locale) { (placemarks, error) in guard let error = error else { guard let placemark = placemarks?.first, let coordinate = placemark.location?.coordinate else { completion(nil, NSError(domain: "LocationError", code: -1, userInfo: [NSLocalizedDescriptionKey: "无法获取坐标"])) return } let location = CLLocation(latitude: coordinate.latitude, longitude: coordinate.longitude) completion(location, nil) return } completion(nil, error) } }
调用示例
// 调用邮编解析 getLocationFrom(postalCityCode: "200040", countryCode: "CN") { location, error in if let error = error { print("解析错误:\(error.localizedDescription)") } else if let location = location { print("获取到坐标:\(location.coordinate.latitude), \(location.coordinate.longitude)") } }
内容的提问来源于stack exchange,提问作者iOSDev2013
相关产品推荐
相关产品推荐

