Swift 为什么MKLocalSearch要搜索不同城市的“附近餐馆”返回地点?
我正在构建一个简单的应用程序,允许用户保存他们的位置以备将来使用 目标是:当用户在一家企业工作时,将他们的地址固定,然后我们保存该企业的名称 我的方法是:我向locationManager请求位置。然后我将CLLocation反向编码为CLPlacemark。因为placemark无法识别企业名称,所以我开始在附近的餐厅进行MKLocalSearch。response.mapItems返回的位置完全不同 我已经指定了区域并验证了placemark是否正确返回了用户的地址。因此,我认为问题在于MKLocalSearch 为什么它会返回不同城市的结果 更新:视图控制器中的所有代码Swift 为什么MKLocalSearch要搜索不同城市的“附近餐馆”返回地点?,swift,mapkit,core-location,mklocalsearch,mkmapitem,Swift,Mapkit,Core Location,Mklocalsearch,Mkmapitem,我正在构建一个简单的应用程序,允许用户保存他们的位置以备将来使用 目标是:当用户在一家企业工作时,将他们的地址固定,然后我们保存该企业的名称 我的方法是:我向locationManager请求位置。然后我将CLLocation反向编码为CLPlacemark。因为placemark无法识别企业名称,所以我开始在附近的餐厅进行MKLocalSearch。response.mapItems返回的位置完全不同 我已经指定了区域并验证了placemark是否正确返回了用户的地址。因此,我认为问题在于MK
给定您的代码,看起来您的逻辑是正确的,但是根据位置的不同,您可能无法得到想要的。苹果公司的MKCoordinateRegion文档指出,指定一个区域并不能保证结果都在该区域内。这只是对搜索引擎的一个提示 这是在模拟器上还是在实际设备上发生的?两者都发生了。然而,测试飞行beta的问题比模拟器更严重。@johnayers这两个平台都发生了!你知道为什么吗?你能发布其余的viewController代码吗?不幸的是,这可能是最好的解决方案。我认为苹果地图在其新的地图功能真正发挥作用之前还有一年左右的时间。
class ViewController: UIViewController {
let locationManager = CLLocationManager()
var places = [MKMapItem]()
let naturalLanguageQuery = "closest places to eat"
let queries = ["restaurants", "places to eat", "breakfast", "lunch", "dinner"]
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading here
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBest
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
if CLLocationManager.authorizationStatus() == .notDetermined {
locationManager.requestWhenInUseAuthorization()
}
}
@IBAction func getLocation() {
if CLLocationManager.authorizationStatus() == .authorizedWhenInUse {
locationManager.requestLocation()
}
}
func add(placemark: CLPlacemark) {
search(placemark: placemark, index: self.queries.count - 1)
}
func searchCompleted(placemark: CLPlacemark) {
guard let foo = Scraper.shared.sortByDistance(userPlacemark: placemark, items: places) else { return }
for item in Scraper.shared.filterForUnique(items: foo) {
print(item)
if item.placemark.addressString == placemark.addressString {
}
}
}
func search(placemark: CLPlacemark, index: Int) {
let request = MKLocalSearchRequest()
guard let coordinate = placemark.location?.coordinate else { return }
request.region = MKCoordinateRegionMakeWithDistance(coordinate, 1600, 1600)
request.naturalLanguageQuery = queries[index]
MKLocalSearch(request: request).start { (response, error) in
guard error == nil else { return }
guard let response = response else { return }
guard response.mapItems.count > 0 else { return }
for item in response.mapItems {
self.places.append(item)
}
if index != 0 {
self.search(placemark: placemark, index: index - 1)
} else {
self.searchCompleted(placemark: placemark)
}
}
}
}
extension ViewController: CLLocationManagerDelegate {
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
let geocoder = CLGeocoder()
if let loc = locations.last {
geocoder.reverseGeocodeLocation(loc) { (placemarks, error) in
if let error = error {
print("error")
} else {
if let placemark = placemarks?.first {
print(placemark.debugDescription)
self.add(placemark: placemark)
}
}
}
}
}
func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
print(error.localizedDescription)
}
}