如何像 Apple 的本地地图应用程序那样进行本地搜索自动完成?

Posted

技术标签:

【中文标题】如何像 Apple 的本地地图应用程序那样进行本地搜索自动完成?【英文标题】:How to do a local search autocomplete as Apple's native map app does? 【发布时间】:2014-02-06 01:27:41 【问题描述】:

我已经通过采用来自here 的 Apple 的 MKlocalSearch 示例代码中的大部分概念完成了一个实现

目前对于自动完成,每次用户在搜索栏中输入时,我都会在我指定的位置发送一个新请求:

MkLocalSearchRequest.naturalLanguageQuery = searchBar.text
MkLocalSearchRequest.region = userlocation.region

但与 Apple 的默认地图应用相比,我从服务器得到的响应完全不同,如下图所示

然后我捕获了流量,发现我的请求发往https://gsp-ssl.ls.apple.com/search.arpc,而苹果的发往 https://gsp-ssl.ls.apple.com/auto_complete.arpc

有没有办法调整MkLocalSearchRequest 以获得相同的响应对象集?

【问题讨论】:

userlocation.region 设置为什么?也许这限制了您的查询。 【参考方案1】:

MkLocalSearchRequest 不会对您的搜索字符串执行自动完成,可能是因为 Apple 希望限制来自 3rd 方应用程序的请求数量。

理论上,您可以对https://gsp-ssl.ls.apple.com/auto_complete.arpc 的请求和响应进行逆向工程,然后自己执行这些请求,根本不使用 MkLocalSearchRequest。但这可能会导致您的应用在 App Store 上被拒绝。

【讨论】:

这正是我的想法。可能我们无论如何都必须切换到谷歌地图。 我最终对 Google Places 使用了一个 Objective-C 包装器,称为 SPGooglePlacesAutocomplete。效果很好。 这实际上就是我们要做的。但是他们对每天的请求数量有限制。一旦流量增加,它就不再免费了。 @TypingPanda 你能告诉我你在哪里找到关于免费服务限制的信息吗?【参考方案2】:

@TypingPanda - 我没有足够的分数直接发表评论,但是:小心使用 Google 地方 API!尽管可能不是立即显而易见,但 Google 的条款和条件规定,Google 的任何视觉表示形式的数据都需要出现在 Google 地图上。希望一切顺利!

【讨论】:

谢谢@trdavidson,我会小心条款和条件。谢谢提醒。【参考方案3】:

ios 9.3 开始,Apple 提供了MKLocalSearchCompleter。

MKLocalSearchCompleter 对象采用部分搜索字符串并生成潜在完成列表。您使用搜索完成器对象来检索您自己的基于地图的搜索控件的自动完成建议。

那是使用https://gsp-ssl.ls.apple.com/auto_complete.arpc的类

它的语法与MkLocalSearchRequest非常相似:

MKLocalSearchCompleter.queryFragment = searchBar.text
MKLocalSearchCompleter.region = userlocation.region

但是对于结果,您需要监听委托方法:

- (void)completerDidUpdateResults:(MKLocalSearchCompleter *)completer;

【讨论】:

以上是关于如何像 Apple 的本地地图应用程序那样进行本地搜索自动完成?的主要内容,如果未能解决你的问题,请参考以下文章

为啥移动 HTML 地理定位应用程序比本地应用程序获得更少的位置更新?

如何在 Apple Watch 模拟器中测试本地通知?

为啥代客共享不像本地代客那样在请求中添加斜线

如何创建一个像 Apple Music 艺术家页面上那样的融合导航栏

location.reload 不像本地那样更新远程服务器上的页面

Ionic - 在 Apple 地图应用中打开导航方向