- PVSM.RU - https://www.pvsm.ru -

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

image

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

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

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

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

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

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://феодоровский.рф/ [5]) результаты поиска в 99% случаев имеют URL вида /catalogue/item/$item_id$, где $item_id$ идентичны тем, которые используются в самом приложении. Благодаря этому, результаты поиска в приложении отображаются в тех же UIViewController'ах, что и сами изделия из каталога. Поиск можно оценить вживую, скачав приложение [6] из AppStore.

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

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

Автор: ilyashuma

Источник [8]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/open-source/24928

Ссылки в тексте:

[1] Suggest.io: http://suggest.io/

[2] нашего репозитория на GitHub: https://github.com/suggestio/suggest_ios

[3] SIOSearchBar: https://github.com/suggestio/suggest_ios/blob/master/suggest_ios/SIOSearchBar.h

[4] SIOSearchRequest: https://github.com/suggestio/suggest_ios/blob/master/suggest_ios/SIOSearchRequest.h

[5] http://феодоровский.рф/: http://xn--b1adcofezbatn2a.xn--p1ai/

[6] приложение: https://itunes.apple.com/us/app/feodorovskij-zavod/id590352304?ls=1&mt=8

[7] SIOMarkupParser: https://github.com/suggestio/suggest_ios/blob/master/suggest_ios/SIOMarkupParser.h

[8] Источник: http://habrahabr.ru/post/165977/