Реализация живого поиска в приложениях под iOS

от автора

image

Основным устройством для доступа к информации становится мобильный коммуниктор. Каждый день выходят новые мобильные приложения в основе которых лежит поиск. Пользователи таких приложений ищут не только информацию с сайтов; приложения транслируют данные многочисленных веб-сервисов.

Команда Suggest.io запускает open-source библиотеку для быстрого внедрения поисковых решений в приложения для iOS. Используя библиотеку Suggest.io (с элементарными доработками) можно быстро и без особых усилий создавать живой поиск (непосредственно из приложений для iOS) по сайтам, на которых установлен поиск Suggest.io.
Проект открытый.Сторонние разработчики могут присоединяться и предлагать свои идеи и решения.

Процесс интеграции

Встроить живой поиск Suggest.io в ваше iOS-приложение достаточно просто:

1. Берём исходники библиотеки поиска из нашего репозитория на GitHub и добавляем их в XCode-проект приложения. Сама библиотека состоит из 2-х основных компонентов — SIOSearchBar и SIOSearchRequest.

2. Создаем экземпляр объекта SIOSearchBar, задаем ему синглтон SIOSearchResult в качестве datasource и объект, который реализует протокол SIOSearchBarDelegate в качестве delegate (это может быть сам UIViewController который будет отображать результаты поиска). Это можно сделать, например, в методе viewDidLoad этого UIViewController’а:

- (void)viewDidLoad { [super viewDidLoad]; self.searchBar = [[SIOSearchBar alloc] initWithStyle:SIOSearchBarFieldStyleOval rect:CGRectMake(0, 0, 320, 44)]; [self.view addSubview:self.searchBar];  self.searchBar.delegate = self; self.searchBar.datasource = [SIOSearchRequest sharedSearchRequest];  /* further initialization for the searchResults viewController (set up UITableView for results or whatever..) */ } 

3. Далее реализуем методы протокола SIOSearchBarDelegate. Их не так много. Основные из них — это searchBarQueryDomain (передает SIOSearchBarController’у имя домена для сайта, на котором установлен поиск Suggest.io и где мы хотим что-то искать) и searchBar:didEndSearching:returningResults — (передает массив объектов класса SIOSearchResult — непосредственно сами результаты поиска, которые можно, например, отобразить списком в UITableView).

Также, SIOSearchBarDelegate обрабатывает такие события, как начало поиска, его отмену (когда пользователь ввел какой-то текст для поиска, а после того, как поиск уже начался — ввел другой поисковый запрос) и нажатие кнопки «Отмена» (т.е. отмену поиска и/или скрытие viewController’а реализующего поиск).

Классы.

Теперь поподробнее о классах, которые предоставляет библиотека.

SIOSearchBar — непосредственно сам toolbar для ввода поискового запроса. Представляет собой обычный UIView, поэтому предоставляет полную свободу, как и где его отображать. Для большего удобства в SIOSearchBar реализованы методы setTintColor: и setBlendMode. Они с минимальными усилиями стилизовать searchBar под дизайн интерфейса вашего приложения. Конструктор по умолчанию (initWithStyle:rect:) позволяет выбрать тип поля ввода.

SIOSearchRequest — реализация dataSource, которая, на наш взгляд, подойдёт для подавляющего большинства приложений. Если по какой-то причине необходимо использовать другую реализацию (например, другой механизм для выполнения HTTP-запросов или другой JSON-parser) — просто предоставьте свою реализацию, соответствующую @protocol SIOSearchBarDataSource, в качестве datasource для SIOSearchBar.

Стандартный SIOSearchRequest выполняет

[NSURLConnection sendSynchronousRequest:returningResponse:error:]

внутри NSBlockOperation, разбирает полученные данные с помощью NSJSONSerialization и упаковывает каждый поисковый результат в экземпляр класса SIOSearchResult. Последний выглядит так:

@interface SIOSearchResult : NSObject @property (readonly) NSAttributedString *content; @property (readonly) NSAttributedString *title; @property codenly) NSURL *url; @property (readonly) NSURL *imageURL; @end 

Свойства content и title уже содержат выделения для поисковой подстроки (если вы собираетесь использовать CoreText для отображения результатов поиска).

Визуальзация результатов поиска может быть выполнена различными методами — хотя в большинстве случаев это, наверное, будет список результатов поиска выполненный как UITableView. А вот с действием над url конкретного результата возможны варианты, ограниченные только фантазией разработчика. Можно просто делать [[UIApplication sharedApplication] openURL:url] — тогда страница соответствующая данному результату откроется в Safari. А если данные, которые вы используете для вашего приложения, кореллируют с данными для сайта, возможны более интересные решения.

Например, для приложения-каталога Феодоровского завода (http://феодоровский.рф/) результаты поиска в 99% случаев имеют URL вида /catalogue/item/$item_id$, где $item_id$ идентичны тем, которые используются в самом приложении. Благодаря этому, результаты поиска в приложении отображаются в тех же UIViewController’ах, что и сами изделия из каталога. Поиск можно оценить вживую, скачав приложение из AppStore.

Что касается выделения поисковой подстроки в результатах поиска — мы не стали добавлять какие-то предустановки для стилей выделения. На наш взгляд, для приложений, в которых будет использоваться такое выделение, удобнее изменить код для формирования самих NSAttributedString в классе SIOMarkupParser (где происходит разбор строк для каждого результата поиска).

На этом пока все. Внимательно следим за идеями. Ждем откликов от разработчиков мобильных приложений под iOS.

ссылка на оригинал статьи http://habrahabr.ru/post/165977/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *