如何实现本地搜索自动完成,就像苹果原生地图应用程序一样?

13

我采用了Apple的MKLocalSearch示例代码中的大部分概念进行实现,代码示例来源于这里

目前,对于自动补全功能,每当用户在搜索栏内输入时,我都会发送一个新的请求,在其中指定了:

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

我用自己的应用与苹果的默认地图应用做了对比,发现从服务器返回的响应结果完全不同,如下图所示:

My app Apple Maps app

我抓取了流量并发现我的请求发送到了 https://gsp-ssl.ls.apple.com/search.arpc,而苹果的则发送到了 https://gsp-ssl.ls.apple.com/auto_complete.arpc

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


用户位置区域设置为什么?也许这限制了你的查询。 - Morkrom
3个回答

8
MkLocalSearchRequest不会对您的搜索字符串执行自动完成,可能是因为Apple希望限制第三方应用程序的请求次数。
理论上,您可以反向工程请求和响应https://gsp-ssl.ls.apple.com/auto_complete.arpc,然后完全不使用MkLocalSearchRequest执行这些请求。但是,这可能会导致您的应用程序被App Store拒绝。

这正是我所思考的。也许我们无论如何都得切换到谷歌地图。 - TypingPanda
1
我最终使用了一个名为SPGooglePlacesAutocomplete的Objective-C封装器来调用Google Places API,效果非常好。 - Daniel Larsson
这实际上是我们要做的事情。但是他们每天请求的次数有限制。一旦流量增加,它将不再免费。 - TypingPanda
@TypingPanda,你能告诉我在哪里找到免费服务限制的信息吗? - Sam Heather

5

@TypingPanda - 我没有足够的积分直接评论,但是请注意使用Google地点API!虽然可能不是立即显而易见的,但Google的条款和条件规定,任何Google地点数据的视觉呈现都需要在Google地图上发生。希望一切顺利!


谢谢@trdavidson,我会注意条款和条件的。感谢您的提醒。 - TypingPanda

2
自 iOS 9.3 起,苹果提供了 MKLocalSearchCompleter

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

这个类使用 https://gsp-ssl.ls.apple.com/auto_complete.arpc

它与 MkLocalSearchRequest 具有相似的语法:

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

但是,要得到结果,您需要听取委托方法:
- (void)completerDidUpdateResults:(MKLocalSearchCompleter *)completer;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接