Демистификация iOS 9 Spotlight Search для разработчиков

Опубликовано: 2022-03-11

В iOS встроено три точки поиска: Siri, поиск Spotlight и поиск Safari. Siri, одна из самых знаковых функций iOS, уже знакома большинству пользователей iPhone. Но многие люди не знают о поиске Spotlight, который был неотъемлемой частью iOS задолго до появления Siri. Доступ к поиску Spotlight можно получить, сдвинув главный экран вниз, или, впервые в iOS 9, проведите пальцем вправо от вашего личного домашнего экрана. Это показывает панель поиска в верхней части экрана.

В центре внимания этого инструмента поиска в iOS 8 и более ранних версиях был поиск самого телефона, поэтому на его странице результатов перечислены приложения, которые находятся на вашем телефоне, а также электронные письма, сообщения и другие личные элементы в приложениях Apple. Он также покажет определение из Википедии, если оно покажется уместным. Наконец, он предлагает возможность поиска в Интернете через Safari в качестве дополнительного шага.

В отличие от Spotlight Search, Safari — это мир за пределами вашего телефона. В iOS 8 пользователь может выбрать, какую поисковую систему использовать для поиска в Safari: Google, Yahoo, Bing и DuckDuckGo. Естественно, Google обрабатывает большинство поисковых запросов Safari. Независимо от выбранной поисковой системы в Safari представлены предварительно заполненные поисковые запросы, потенциально совпадающие с Википедией.

В iOS 9 поиск Spotlight гораздо более заметен и шире, чем раньше. Фактически, первое, что вы видите, — это «Предложения Siri», основанные на ваших моделях использования. Например, если вы регулярно используете Safari во второй половине дня, Siri предложит вам его примерно в это время.

И хотя это все еще место, где можно найти «вещи на вашем телефоне», он становится прямым порталом для «вещей, которых нет на вашем телефоне». Вы уже видите вещи поблизости и заголовки новостей, полученные из Интернета через собственную поисковую систему Apple, а другие веб-результаты только начинают появляться.

Да, Apple создала поисковую систему для iOS 9, что является очень большим шагом. Поздоровайся с Applebot.

Подобно Spotlight, заявленная Apple цель Safari также заключается в том, чтобы отображать результаты и предложения из поискового индекса Apple, прежде чем предлагать возможность поиска в Интернете с помощью Google (или другого выбранного провайдера). Начиная с iOS 9.1, Safari, похоже, отстает от поиска Spotlight, продолжая предоставлять результаты от выбранного пользователем поискового провайдера — возможно, чтобы дать Apple более медленное развертывание своих функций поиска и больше времени для тонкой настройки своих алгоритмов.

Что особенно интересно в выпуске iOS 9, так это то, что она впервые дает разработчикам iOS возможность подключаться к этим функциям поиска и включать контент из приложений . Кроме того, обещают, что поиск в конечном итоге будет включать результаты не на телефоне пользователя . Это огромный шаг.

Давайте просто поместим это в контекст. Поисковая система Google породила целую индустрию, построенную вокруг «SEO» — процесса оптимизации ваших активов для поиска Google. После полного запуска поисковая система Apple будет владеть примерно 50% рынка мобильного поиска, что составляет 50% (и рост) общего поискового трафика. Таким образом, Applebot большой, а значит, и «Apple Mobile Search Optimization» тоже будет большим.

Усилия Apple по оптимизации поиска для мобильных устройств окажут гораздо большее влияние на обнаружение приложений мобильными пользователями, чем обычная поисковая оптимизация.

Добро пожаловать в новую индустрию AMSO.

Плохая новость заключается в том, что реализация всех этих функций включает в себя множество новых технологий Apple, а также усовершенствование старых, и сочетание этих элементов может сбивать с толку. Цель этой серии — пройтись по различным частям и прояснить, как они могут быть реализованы. Давайте начнем с чего-то базового и будем опираться на него.

Демистификация iOS 9 Spotlight Search для разработчиков

В поддержку этой серии я создал простое приложение для справки. Проект можно найти здесь: https://github.com/rwforsythe/iOS9-Search. Он также будет обновляться по мере того, как эта серия продолжает охватывать другие элементы инструментария поиска.

Основа: платформа CoreSpotlight

Эта структура, совершенно новая в iOS 9, позволяет добавлять элементы в локальный поисковый индекс iPhone для обнаружения пользователем. Например, до iOS 9 с помощью поиска Spotlight можно было найти только контент в официальных приложениях Apple, таких как Календарь. Теперь любое приложение, которое публикует свои события календаря через платформу CoreSpotlight, можно найти с помощью поиска Spotlight и даже Siri.

Обратите внимание, что основное внимание здесь уделяется личной информации; вы не хотите, чтобы пользователи на другом телефоне находили события вашего личного календаря! Apple ясно дает понять, что платформа CoreSpotlight взаимодействует исключительно с личным индексом на телефоне каждого человека. Невозможно использовать API CoreSpotlight для публикации контента за пределами собственного индекса телефона.

Это не означает, что CoreSpotlight нельзя использовать для индексации уже общедоступной информации. Конечно, можно использовать CoreSpotlight для извлечения информации из облака и помещения ее в поисковый индекс телефона. Это просто гарантия от Apple, что если личная и конфиденциальная информация будет проиндексирована с помощью CoreSpotlight, она останется конфиденциальной.

Платформа состоит из двух частей: объекта CSSearchableItemAttributeSet , который позволяет приложению подробно описывать каждый элемент, и объекта CSSearchableItem , который используется для присвоения элементу уникального идентификатора. Каждая запись Spotlight состоит из пары этих объектов. Причина использования двух объектов вместо одного заключается в том, что объекты CSSearchableItemAttributeSet используются для другого типа взаимодействия при поиске (описанного ниже).

Это довольно легко сделать основы.

Для тех, кто ссылается на пример кода, настройка CoreSpotlight выполняется в AppDelegate.

 … @import CoreSpotlight; @import MobileCoreServices; …

Эти два модуля необходимы для новой функциональности.

Для простоты в демонстрационном приложении метод application:didFinishLaunchingWithOptions: используется для вызова специального метода для настройки CoreSpotlight:

 if ([CSSearchableItemAttributeSet class]) [self setUpCoreSpotlight]; //Check for iOS version that supports CoreSpotlight API

Переходя к методу setUpCoreSpotlight , мы начинаем процесс с создания объекта CSSearchableItemAttributeSet :

 CSSearchableItemAttributeSet * attributeSet = [[CSSearchableItemAttributeSet alloc] initWithItemContentType:(NSString *)kUTTypeItem];

Тип содержимого важен, поскольку предполагается, что он определяет общий способ обработки элемента алгоритмами поиска. «Предполагается» — рабочее слово, так как это область, которая не очень хорошо задокументирована Apple. Существует большое меню типов элементов на выбор (типы изображений, типы видео, типы аудио, тип контакта), но требуется метод проб и ошибок, чтобы определить, какое влияние (если таковое имеется) оно оказывает на взаимодействие с пользователем. Некоторые типы отображают больше текста, чем другие, при отображении в результатах поиска. Это также может повлиять на то, будет ли миниатюра отображаться вместе с результатом. kUTTypeItem — отличное место для начала.

Теперь опишите объект более подробно:

 attributeSet.displayName = @"A Christmas Carol"; attributeSet.title = @"A Christmas Carol By Charles Dickens"; //Sounds similar to displayName but is not displayed to user attributeSet.contentDescription = @"Who would dare to say “Bah! Humbug” after reading A Christmas Carol? Charles Dickens wrote the novella in just six weeks before it was first published on December 19 1843 but his morality tale about a bitter old miser named Ebenezer Scrooge lives on to this day as a reminder of the importance of the Christmas spirit."; attributeSet.keywords = @[@"A Christmas Carol", @"Charles Dickens", @"Victorian Literature"]; UIImage *image = [UIImage imageNamed:@"CC-Cover"]; NSData *imageData = [NSData dataWithData:UIImagePNGRepresentation(image)]; attributeSet.thumbnailData = imageData;

Существует множество возможных свойств, специфичных для типов мультимедиа, таких как изображения, видео и т. д. Возможно, лучше получить больше информации, но для определения того, какая информация на самом деле используется и/или отображается в результатах поиска, необходимы пробы и ошибки. Например, на момент написания статьи звездные рейтинги не отображались для данного элемента индекса, даже если в наборе атрибутов содержатся данные звездного рейтинга.

Большинство текстовых свойств включены в поисковый запрос, поэтому даже если свойство title не отображается, текст можно найти с помощью поиска. Поэтому не совсем понятно, чем свойство keywords принципиально отличается от свойства title.

Дополнительную информацию см. в документе Apple: developer.apple.com

Последний шаг — упаковать CSSearchableItemAttributeSet с помощью CSSearchableItem и зарегистрировать его в индексе.

 CSSearchableItem *item1 = [[CSSearchableItem alloc] initWithUniqueIdentifier:@”https://www.notestream.com/streams/564159e4e5c24” domainIdentifier:@"notestream.com" attributeSet:attributeSet];

Здесь две новинки. Свойство domainIdentifier позволяет группировать элементы для пакетных операций. Например, @"meetingItem" и @"reminderItem" в приложении календаря позволят вам удалить все записи Spotlight одного типа, оставив другой.

Свойство uniqueIdentifier играет более важную роль. Во-первых, он передается обратно в ваше приложение, когда пользователь щелкает элемент в индексе CoreSpotlight (обсуждается позже). Во-вторых, есть рекомендации Apple о том, как это должно выглядеть при использовании других элементов поисковой инфраструктуры. Сейчас мы будем использовать строку, которая на самом деле является URL-адресом, уникальным образом представляющим этот элемент. Технически это свойство может быть любой строкой, если оно уникально для элемента.

Последний шаг: поместите созданные вами элементы в фактический файл index.

 [[CSSearchableIndex defaultSearchableIndex] indexSearchableItems:@[item1, item2, item3] completionHandler: ^(NSError * __nullable error) { if (!error) NSLog(@"Search item(s) journaled for indexing."); }];

Здесь нужно сделать пару замечаний:

  1. Этот метод принимает массив объектов (есть и другие методы, которые можно использовать для пакетной обработки процесса, если для индексации требуется много данных).

  2. Важно понимать, что этот метод фактически не завершает процесс индексации. Обработчик завершения вызывается только тогда, когда элементы поиска поставлены в очередь на индексацию. Используйте CSSearchableIndexDelegate для обработки сценариев, когда сам процесс индексирования по какой-то причине дает сбой, и ваше приложение должно обрабатывать ситуацию.

Поздравляем, вы добавили элементы в поисковый индекс CoreSpotlight телефона!

Как работает поиск в iOS 9

Естественно, Apple держит свои поисковые алгоритмы при себе, поэтому стоит установить пример приложения и поэкспериментировать с ключевыми словами. Например, быстро становится очевидным, что Apple максимизирует представленные результаты, выдавая очень разные результаты по мере того, как пользователь набирает каждую букву:

Похоже, что принцип заключается в том, что результаты, которые считаются более подходящими, будут представлены после того, как будет напечатана всего пара букв. По мере того, как пользователь набирает больше букв, эти ранние результаты отбрасываются, и вместо них представляются другие вещи (первоначально оценивавшиеся как менее вероятные).

В целом Apple может сказать лишь несколько вещей о том, как улучшить ранжирование по своим алгоритмам. На этой странице содержатся рекомендации Apple: улучшайте результаты поиска.

Одним из ключевых выводов из документации Apple является то, что ранжирование улучшается, когда приложение использует несколько технологий поиска для индексации контента. В следующей статье мы рассмотрим еще одну из этих технологий. Между тем, нам все еще нужно реализовать код для обработки сценария, когда пользователь нажимает на результат поиска.

Когда пользователь нажимает

Мы создали код для заполнения индекса потенциальными результатами поиска, но что происходит, когда пользователь нажимает на результат? Ответ заключается в том, что CoreSpotlight заимствует метод application:continueUserActivity:restorationHandler: из протокола UIApplicationDelegate. Первоначально это было введено в iOS 8 для механизма передачи обслуживания, который позволяет передавать действия пользователя с устройства на устройство (например, пользователь видит веб-URL-адрес на iWatch, использует передачу обслуживания, чтобы подобрать его в браузере iPhone Safari и, в конечном итоге, просмотреть его). на их Mac, когда они приходят в офис.)

Первая задача состоит в том, чтобы определить, был ли метод вызван из-за действия Handoff или из поиска Spotlight. Свойство activityType параметра активности сообщит вам об этом, но если код может работать на iOS 8, вам нужно будет избежать сбоя в этом случае.

Вот как здесь может выглядеть простой код:

 - (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)activity restorationHandler:(void (^)(NSArray *))restorationHandler { NSString * valueCSSearchableItemActionType; BOOL wasHandled = NO; if ([CSSearchableItemAttributeSet class]) //iOS 9 { valueCSSearchableItemActionType = CSSearchableItemActionType; } else { // iOS 8 – This method was introduced in iOS 8, so iOS 7 is not a possible scenario valueCSSearchableItemActionType = @"not supported"; } if ([activity.activityType isEqual: valueCSSearchableItemActionType]) { // Invoked via CoreSpotlight, we can assume iOS 9 from now on… NSString * activityIdentifier = [activity.userInfo valueForKey:CSSearchableItemActivityIdentifier]; wasHandled = YES; NSLog(@"Continuing user activity %@", activityIdentifier); } else { //the app was launched via Handoff protocol //or with a Universal Link } return wasHandled; }

Обратите внимание на строку кода:

 NSString * activityIdentifier = [activity.userInfo valueForKey:CSSearchableItemActivityIdentifier];

При этом извлекается уникальный идентификатор, который был помещен в индекс Spotlight при создании объекта CSSearchableItem . Естественно, ваше приложение должно использовать этот уникальный идентификатор, чтобы предоставить пользователю фрагмент контента, который он выбрал из поискового индекса. Для простоты здесь мы просто NSLog уникальный идентификатор.

Резюме

Пока что мы рассмотрели только одну часть функции поиска в iOS 9. Мы рассмотрели основные функции, необходимые для загрузки поискового индекса Spotlight телефона с тем, что может оказаться полезным для пользователя: документы, элементы календаря, контакты и так далее. Когда пользователь что-то ищет, видит результат вашего приложения и нажимает на него, приложение сможет обработать запрос и отобразить соответствующий элемент для пользователя.

Что мы еще не обсудили, так это технологии, связанные с общедоступным индексом, который создает Apple. Этот индекс предназначен для того, чтобы пользователи могли находить контент в вашем приложении, даже если оно не установлено на их телефоне. Мы займемся этим в следующем посте.