Локальный поиск по приложению через 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
