Локальный поиск по приложению через Spotlight (iOS 9)
С выходом ios 9 появилась замечательная возможность локального поиск по приложениям, основанного на CoreSpotlight. При помощи этого алгоритма iOS индексирует содержимое приложения, его функции и даже определяет наиболее востребованные из них для отображения максимально релевантных результатов по запросу пользователя. Выполненная в виде базы данных, CoreSpotlight уже используется стандартными компонентами iOS вроде почтового клиента или напоминаний, предоставляя низкоуровневый доступ к индексу памяти устройства. Это значительно упрощает упорядочение и поиск нужного контента, к которому владелец гаджета уже обращался ранее.
Более того, компания дала разработчикам полный контроль над индексируемым содержимым и результатами поиска, а также действиями, выполняемыми приложениями с каждым из них. Сами приложения смогут легко обновлять доступное для индексирования содержимое в фоне при помощи базы данных. Например, если после синхронизации с другим устройством или облачным хранилищем изменятся пункты в списке дел, то результаты поиска будут автоматически соответствовать текущему состоянию программы. Разумеется, всё это произойдёт совершенно незаметно для пользователя. В то время как последний, как и раньше, сможет запускать из Spotlight приложения или искать документы, как это обычно делается на компьютерах с OS X, Apple хочет полностью преобразить поиск на мобильных устройствах, где приложения неумолимо вытесняют основанные на веб-сайтах сервисы.
Простой пример как проиндексировать приложение.
1) Добавляем библиотеку CoreSpotlight
2) Например в контроллере создаем необходимый индекс:
-(void)setupCoreSpotlightSearch { CSSearchableItemAttributeSet *attributeSetMain = [[CSSearchableItemAttributeSet alloc] initWithItemContentType:(NSString *)kUTTypeImage]; attributeSetMain.title = @"Заголовок"; //появится как заголовок при поиске attributeSetMain.contentDescription = @"описание"; //появится как описание при поиске attributeSetMain.keywords = [NSArray arrayWithObjects:@"ключевое_слово_1", @"ключевое_слово_2", @"ключевое_слово_3", nil]; CSSearchableItem *itemMain = [[CSSearchableItem alloc] initWithUniqueIdentifier:@"ru.app.maininfo" domainIdentifier:@"ru.app" attributeSet:attributeSetMain]; [[CSSearchableIndex defaultSearchableIndex] indexSearchableItems:@[itemMain] completionHandler:^(NSError * _Nullable error) { if(!error) { NSLog(@"Search"); } }]; }
и вызываем в методе viewDidLoad
3) когда пользователь находит проиндексированный элемент через spotlight и нажимает на него, вызывается метод делегата:
-(BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler { if ([userActivity.activityType isEqualToString:CSSearchableItemActionType]) { NSString *uniqueIdentifier = userActivity.userInfo[CSSearchableItemActivityIdentifier]; if([uniqueIdentifier isEqualToString:@"ru.app.maininfo"]) { // do stuff to show detail for product with uniqueIdentifier } return YES; // because you did handle the activity } return NO; // because you did NOT handle the activity }
Описание библиотеки: developer.apple.com