iOS应用程序受到本地搜索的限制

时间:2014-05-06 21:46:51

标签: ios mapkit mklocalsearch

我正在搜索地址的应用中实施自动填充功能(每添加一个新字符进行一次搜索),并且我不断获得MKErrorDomain error 3,即MKErrorLoadingThrottled。根据{{​​3}},此错误发生在

  

未加载数据,因为数据限制有效。这个   如果应用程序频繁请求数据,则可能会发生错误   时间很短。

我确切地知道有多少请求正在进行,一个针对搜索查询中的每个新charachter(就像您希望自动完成工作一样)。当然,我是一个快速的人,但只有10或15个请求后能够达到极限似乎是荒谬的。看看以下两个来源参考,我不明白为什么我一直受到限制。

根据Apple dev

  

每个应用或开发者ID都没有请求限制,所以写得很好   正确运行的应用程序应该没有任何问题。然而,   限制可能发生在一个写得不好的应用程序,创建一个极端   大量的请求。

和James Howard Apple dev

  

我要谈的另一件事是关于此的使用限制   API。   所以,我很高兴地宣布没有应用程序或开发人员   标识符广泛的使用限制   所以,如果你的应用程序拥有大量用户并且你想要做很多事情   请求,没关系。

     

它会起作用。

     

我们所拥有的节流实际上只是第一线   防范有缺陷的应用程序。   因此,如果您将路线请求或本地搜索请求放入   无限循环,你有一个bug,最终你会得到   节流。

     

但如果你做了一些合理的事情,你会说哦,我会去做   响应用户输入的方向,你知道你可以做一些   因为我们向他们展示了那个例子。

     

就像我们针对一个用户输入做了两个方向请求,   没关系。   但是,你知道如果你每次用户点击它时你都会做10,000次   屏幕,然后你会受到限制。   但是,只要保持合理,你就可以了。

为什么会发生这种情况的任何想法?

4 个答案:

答案 0 :(得分:11)

自动完成需要特殊的API。 MapKit没有提供这样的界面。只需向普通搜索API发出数十个请求,就会产生巨大的负担。

您基本上有两个选择:

  1. 使用Google商家信息。他们有专门的Places Autocompletion API。在GitHub上甚至还有一个完整的iOS库。

  2. 减少请求数量,例如通过仅在用户暂停键入300ms并且仅在没有先前请求未完成时发送请求。但是,这仍然无法保证Apple不会限制您的请求。

答案 1 :(得分:4)

MKLocalSearch主要用于在地图范围内查找兴趣点(商家等)。 CLGeocoder用于结构化地址和位置查找。

CLGeocoder documentation指定CLGeocoder请求 率限制,文档提供有关如何成为好公民的指导。

特别值得注意的是指南中的第一项:“最多发送一个用户操作请求”。这也应该适用于MKLocalSearch - 如果您同时在飞行中有多个请求,那么您很可能会受到限制。

这实际上很容易实现:在发送新的MKLocalSearchRequest之前,取消所有待处理的请求。这对于实现自动完成非常有意义,如您所描述的:如果用户输入第4个字符,您可能不需要第3个字符的请求或响应。​​

答案 2 :(得分:1)

在Time Profiler工具中运行您的应用程序,查看键入时对该方法的调用次数。

答案 3 :(得分:1)

我刚刚在 Swift 上写了帮助,以帮助建议使用Apple MapKit API。当用户停止输入请求时,它是呼叫搜索请求。 https://github.com/ArniDexian/GeocodeHelper

用法很简单:

func searchBar(searchBar: UISearchBar, textDidChange searchText: String) {
    GeocodeHelper.shared.decode(searchText.trimmed(), completion: { [weak self](places) -> () in
        self?.dataSource.locations = places
        self?.tableView.reloadData()
        return
        })
}