Как сделать автозаполнение локального поиска, как это делает приложение для карты Apple?

Я сделал реализацию, приняв большую часть концепции из примера кода Apple из MKlocalSearch из здесь

В настоящий момент для автоматического завершения каждый раз, когда пользователь вводит текст в строке поиска, я отправляю новый запрос, где я указал:

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

Но я получаю совершенно другой набор ответов от sever по сравнению с приложением Apple по умолчанию, как показано на рисунке ниже

My appApple Maps app

Затем я фиксирую трафик и обнаруживаю, что мой запрос отправляется https://gsp-ssl.ls.apple.com/search.arpc, в то время как Apple переходит к https://gsp-ssl.ls.apple.com/auto_complete.arpc

Есть ли способ настроить MkLocalSearchRequest, чтобы получить тот же набор объектов ответа?

Ответ 1

MkLocalSearchRequest не будет выполнять автоматическое завершение в вашей строке поиска, возможно, потому, что Apple хочет ограничить количество запросов от сторонних приложений.

В теории вы можете перепроектировать запросы и ответы на https://gsp-ssl.ls.apple.com/auto_complete.arpc, а затем выполнить эти запросы самостоятельно, не используя MkLocalSearchRequest. Но это, вероятно, приведет к тому, что ваше приложение будет отклонено в App Store.

Ответ 2

@TypingPanda - у меня недостаточно очков для комментариев, но: остерегайтесь использования API-интерфейсов Google! Хотя, возможно, и не сразу очевидно, что в условиях Google условия визуального представления данных Google должны происходить на карте Google. Надеюсь, что все получится!

Ответ 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;