Spotlight Index

Erick Borges
Apple Developer Academy | Mackenzie
5 min readFeb 16, 2018

O que é?

O Spotlight Index é uma ferramenta que permite que sejam criados items buscáveis com o conteúdo que existe dentro de uma aplicação. Estes itens são buscáveis através do Spotlight.

Os items criados aparecem quando uma das palavras chaves, que podem ser definidas pelo desenvolvedor, é buscada no Spotlight. Além disso, qualquer palavra que constitui o item é buscável.

Quando um item do Spotlight é selecionado, ele automaticamente abre o aplicativo o qual ele pertence. O AppDelegate possui uma função que permite identificar que o app foi aberto por este item, fazendo com que seja possível gerar alguma ação a partir disso, com conteúdo do item.

Exemplos

Keynote

A imagem a seguir é uma demonstração de busca no spotlight. Como você pode observar, ao buscar “spotlight”, podemos identificar que o keynote nos mostra duas apresentações que tem o nome spotlight em seu título. Isso significa que o aplicativo do keynote adiciona um item para cada nova apresentação, tornando todas elas buscáveis.

Keynote Spotlight Itens

WhatsApp

O aplicativo do WhatsApp usa o spotlight de maneira muito interessante, semelhante a busca que existe dentro do aplicativo. Se você pesquisar por qualquer palavra que exista em qualquer conversa do seu WhatsApp, a mensagem com esta palavra aparecerá no Spotlight. Assim como nomes de contatos e grupos.

WhatsApp Spotlight

Nas imagens anteriores foi possível observar que os Spotlight Items têm um padrão de exibição. Isso se dá por que existem diversos atributos padrões que podem ser definidos ao criar um item, e que oferecem este layout automaticamente. Por Exemplo:

Elementos de um Spotlight Item

Mais para frente no tutorial você irá entender melhor do que se trata o attributeSet. Por agora, é importante entender o que significam seus atributos. O title, que é o texto que aparece em mais destaque identificando o item, o contentDescription que oferece mais informações sobre aquele item e por último o thumbnailData que representa uma imagem normalmente associada ao conteúdo do item.

Além disso existem outros tipos de atributos que podem ser definidos, além de atributos personalizados, que pode conferir na documentação:

Como usar o Spotlight Index?

Todos os recursos do SpotlightIndex são gerenciados pela biblioteca CoreSpotlight. A seguir vamos fazer um tutorial de como implementá-lo em um aplicativo exemplo.

Primeiro acesse este repositório, e baixe o projeto exemplo na branch master: https://github.com/ericklborges/Groceries

Groceries é um aplicativo muito simples de lista de compras. Você pode adicionar itens a lista e eles serão salvos localmente usando uma implementação simples de CoreData. Cada item possui uma imagem que identifica seu estado como comprado, ou não comprado.

A primeira coisa que deve ser feita é a criação de uma nova classe. Para isso, crie um novo Swift File e dê a ele o nome de “SLManager”.

Salve este arquivo dentro do projeto principal, importe as bibliotecas UIKit, CoreSpotlight e MobileCoreServices, e por último crie a classe, como no código a seguir:

Esta classe funcionará somente com uma função estática, que busca todos os items que estão salvos no banco de dados, cria Spotlight Searchable Items com eles, e os adiciona ao Spotlight Index.

Primeiro, adicione o seguinte código à classe:

  1. Faz um fetch em todos os items no banco de dados, e guarda em uma array. Cada objeto do tipo Item possuí um nome, e um boolean chamado de “isDone”.
  2. Cria uma array que irá guardar os CSSearchableItem que serão adicionados ao Spotlight Index

A seguir vamos criar uma iteração para percorrer todos os itens que foram buscados no CoreData, e dentro desta iteração, vamos criar os CSSearchableItems. Adicione o código a seguir ao método setSpotLightIndexes():

  1. Esta linha de código cria um CSSearchableItemAttributeSet, que é o objeto encarregado de conter as informações do CSSearchableItem. Note que no inicializador desta classe nós passamos uma variável global que pertence à biblioteca MobileCoreServices. Ela identifica que este CSSearchableItemAttributeSet conterá informações de tipos genéricos e diversos, como Int, Data, String e Bool.
  2. Aqui nós estamos setando keywords para o attributeSet, que são palavras chaves que retornaram estes itens quando buscadas. A seguir vamos definir o title e o contentDescription do Item, que foi mostrado na imagem acima.
  3. O atributo attributeSet.thumbnailData vai ser definido como a imagem do item, identificando se o item já foi comprado ou não, de acordo com o seu valor de isDone.
  4. Por último, nós vamos criar um novo CSSearchableItem usando o attributeSet que acabamos de criar, e na mesma linha de código vamos adicioná-lo à array de searchableItems. O parâmetro “uniqueIdentifier” serve com o identificador único do item, enquanto o “domainIdentifier” serve como um identificador que pode ser definido para diversos itens, a fim de permitir que eles possam ser agrupados com mais facilidade, como se fosse uma classificação para o item.

Uma vez que criamos todos os itens, de forma muito simples agora vamos adicioná-los ao Spotlight Index com o seguinte método:

  1. Esta função adiciona aquela coleção de itens, searchableItems, ao Spotlight Index. Caso esta operação falhe, ela retorna um erro que é tratado logo em seguida

Pronto, esta simples função é capaz de adicionar todos os items da lista de compras ao spotlight. Só há um problema. Toda vez que ela for chamada, ela vai buscar todos os items no CoreData, e adicioná-los ao Spotlight Index, permitindo que itens repetidos sejam adicionados. A fim de evitar que isso aconteça, nós vamos adicionar um método antes da criação dos items, que deleta todos os Spotlight itens

Volte para o começo do método e adicione:

Agora sim, esta função captura todos os itens do CoreData, deleta todos os CSSearchableItems antigos, e adiciona os novos atualizados.

A função completa fica assim:

A última coisa que temos a fazer é adicionar o método em algum lugar do código. Eu acho interessante chamá-lo logo após ao método do DataManager saveContext(), que é chamado toda vez que o banco de dados do CoreData é atualizado. Isso irá garantir que todas as informações contidas nos itens do Spotlight sempre estejam atualizadas.

Então abra o arquivo DataManager, e procure o método DataManager, então adicione a linha de código a seguir embaixo de “try context.save()”:

Para ver o funcionamento do Spotlight Index, basta adicionar alguns itens à lista, e depois acessar o spotlight deslizando para a baixo quando estiver na tela principal do iPhone. Faça uma busca como nome de algum item, ou com alguma palavra chave que nós definimos. ex: “Groceries”, “Grocery”, “List”.

Obrigado pela leitura, caso queira o projeto completo ele está na branch feature/FinalProject do GitHub: https://github.com/ericklborges/Groceries/tree/feature/FinalProject

Autores

Erick Borges

Matheus de Vasconcelos

Ricardo Daniel Nogueira de Sousa

--

--