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