为啥 MKLocalSearch 搜索“附近的餐馆”会返回不同城市的位置?

Posted

技术标签:

【中文标题】为啥 MKLocalSearch 搜索“附近的餐馆”会返回不同城市的位置?【英文标题】:Why is MKLocalSearch for "nearby restaurants" returning locations in different cities?为什么 MKLocalSearch 搜索“附近的餐馆”会返回不同城市的位置? 【发布时间】:2018-09-06 17:33:43 【问题描述】:

我正在构建一个简单的应用程序,允许用户保存他们的位置以供以后使用。

目标:用户在商家时固定住他们的地址,我们会保存商家的名称

我的方法:我从 locationManager 请求位置。然后我将 CLLocation 反向地理编码为 CLPlacemark。由于地标无法识别公司名称,因此我为“附近的餐馆”启动了 MKLocalSearch。 response.mapItems 返回完全不同城市的位置。

我已指定区域并验证地标是否正确返回了用户的地址。所以,我相信问题在于 MKLocalSearch。

为什么返回不同城市的结果?

更新:视图控制器中的所有代码

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)
    

【问题讨论】:

这是发生在模拟器上还是实际设备上? 两者都发生了。但是,TestFlight 测试版的问题比模拟器更严重。 @johnayers 两者都发生了!任何想法为什么? 你能把剩下的viewController代码贴出来吗? 不幸的是,这可能是最好的解决方案。我认为 Apple Maps 的新地图功能真正发挥作用还有一年左右的时间。 【参考方案1】:

根据您的代码,您的逻辑似乎是正确的,但根据位置的不同,您可能无法得到想要的结果。 Apple 的MKCoordinateRegion 文档指出,“指定一个区域并不能保证结果都在该区域内。这只是对搜索引擎的提示。” MKLocalSearch Documentation

【讨论】:

以上是关于为啥 MKLocalSearch 搜索“附近的餐馆”会返回不同城市的位置?的主要内容,如果未能解决你的问题,请参考以下文章

替代谷歌本地搜索以获取附近的餐馆[关闭]

我想在我的 React Native 应用程序中的谷歌地图中显示附近的餐馆。当我调用 Google API 附近搜索时,它会抛出状态:'ZERO_RESULTS'

GeoHash算法附近寻址

生成与附近餐馆的谷歌地图链接

为啥使用 MKLocalSearch 会返回错误并且无法加载预期结果?

在 MySQL 中调用一个函数来过滤掉用户当前位置附近的餐馆