Desmistificando a pesquisa em destaque do iOS 9 para desenvolvedores

Publicados: 2022-03-11

Existem três pontos de pesquisa integrados ao iOS: Siri, Pesquisa Spotlight e pesquisa no Safari. A Siri, um dos recursos mais icônicos do iOS, é algo que a maioria dos usuários do iPhone já conhece. Mas muitas pessoas não estão cientes da pesquisa do Spotlight - algo que tem sido parte integrante do iOS muito antes da Siri existir. A Pesquisa Spotlight pode ser acessada quando você desliza a tela inicial para baixo ou, no iOS 9, deslize para a direita na tela inicial pessoal. Isso revela uma barra de pesquisa na parte superior da tela.

O foco dessa ferramenta de pesquisa no iOS 8 e anteriores era pesquisar no próprio telefone, portanto, sua página de resultados lista os aplicativos que estão no seu telefone, bem como e-mails, mensagens e outros itens privados nos aplicativos da Apple. Também mostrará uma definição da Wikipedia se parecer relevante. Por fim, oferece a opção de pesquisar na web via Safari como uma etapa adicional.

Em contraste com a Pesquisa Spotlight, o Safari tem tudo a ver com o mundo fora do seu telefone. No iOS 8, o usuário pode escolher qual mecanismo de busca usar para pesquisar no Safari: Google, Yahoo, Bing e DuckDuckGo. Naturalmente, o Google lida com a maioria das solicitações de pesquisa do Safari. Independentemente do mecanismo de pesquisa escolhido, os termos de pesquisa pré-preenchidos são apresentados no Safari, potencialmente com uma correspondência da Wikipedia.

No iOS 9, a Pesquisa Spotlight é muito mais proeminente e com escopo mais amplo do que antes. Na verdade, a primeira coisa que você vê são “Sugestões de Siri” com base em seus padrões de uso. Por exemplo, se você usa o Safari regularmente à tarde, a Siri sugerirá isso para você nesse horário.

E, embora ainda seja um lugar para encontrar “coisas no seu telefone”, está se tornando um portal direto para “coisas que não estão no seu telefone”. Você já vê coisas próximas e manchetes de notícias provenientes da web através do próprio mecanismo de busca da Apple, e outros resultados baseados na web estão apenas começando a aparecer agora.

Sim, a Apple criou um mecanismo de busca na web para iOS 9, o que é um passo muito grande. Diga olá ao Applebot.

De maneira semelhante ao Spotlight, o objetivo declarado da Apple para o Safari também é exibir resultados e sugestões do índice de pesquisa da Apple, antes de oferecer a capacidade de pesquisar na web com o Google (ou outro provedor escolhido). A partir do iOS 9.1, o Safari parece estar ficando para trás da pesquisa Spotlight, continuando a fornecer resultados do provedor de pesquisa escolhido pelo usuário – talvez para dar à Apple uma implementação mais lenta de seus recursos de pesquisa e mais tempo para ajustar seus algoritmos.

O que é particularmente empolgante no lançamento do iOS 9 é que, pela primeira vez, ele oferece aos desenvolvedores do iOS a capacidade de se conectar a essas funções de pesquisa e incluir conteúdo de aplicativos . Além disso, a promessa é que a pesquisa acabará por incluir resultados que não estão no telefone do usuário . Este é um grande passo.

Vamos apenas colocar isso em contexto. O mecanismo de busca do Google gerou toda uma indústria construída em torno de “SEO” – o processo de otimizar seus ativos em torno da busca do Google. Quando totalmente lançado, o mecanismo de busca da Apple deterá cerca de 50% do mercado de busca móvel, que representa 50% (e está crescendo) do tráfego geral de busca. O Applebot é, portanto, grande, o que significa que a “Otimização de pesquisa móvel da Apple” também será grande.

Os esforços de otimização de pesquisa móvel da Apple terão um impacto muito maior na descoberta de aplicativos por usuários móveis do que o SEO regular.

Bem-vindo à recém-nascida indústria AMSO.

A má notícia é que a implementação de todos esses recursos envolve muitas novas tecnologias da Apple, bem como aprimoramentos das antigas, e a combinação desses elementos pode ser confusa. O objetivo desta série é percorrer as várias peças e esclarecer como elas podem ser implementadas. Vamos começar com algo básico e construir sobre isso.

Desmistificando a pesquisa em destaque do iOS 9 para desenvolvedores

Em apoio a esta série, criei um aplicativo simples para referência. O projeto pode ser encontrado aqui: https://github.com/rwforsythe/iOS9-Search. Ele também será atualizado à medida que esta série continuar a abranger outros elementos do kit de ferramentas de pesquisa.

A Fundação: Estrutura CoreSpotlight

Essa estrutura, completamente nova no iOS 9, permite que você contribua com itens para o índice de pesquisa local do iPhone para descoberta pelo usuário. Por exemplo, antes do iOS 9, apenas o conteúdo dos aplicativos oficiais da Apple, como o Calendário, podia ser encontrado por meio da pesquisa do Spotlight. Agora, qualquer aplicativo que publique seus eventos de calendário por meio da estrutura CoreSpotlight pode ser encontrado via Spotlight Search e até mesmo Siri.

Observe que o foco aqui é nas informações pessoais; você não quer que seus eventos de calendário pessoais sejam encontrados por usuários em outro telefone! A Apple é muito clara que o framework CoreSpotlight interage exclusivamente com o índice privado no telefone de cada pessoa. Não é possível usar a API CoreSpotlight para publicar conteúdo fora do índice do próprio telefone.

Isso não significa que o CoreSpotlight não possa ser usado para indexar informações já públicas. Certamente é possível usar o CoreSpotlight para extrair informações da nuvem e colocá-las no índice de pesquisa do telefone. É simplesmente uma garantia da Apple de que, se as informações pessoais e confidenciais forem indexadas no CoreSpotlight, elas permanecerão confidenciais.

A estrutura vem em duas partes: o objeto CSSearchableItemAttributeSet que permite que o aplicativo descreva cada item em detalhes e um objeto CSSearchableItem que é usado para fornecer ao item uma ID exclusiva. Cada entrada do Spotlight é composta por um par desses objetos. A razão para usar dois objetos em vez de um é que os objetos CSSearchableItemAttributeSet são usados ​​para um tipo diferente de interação de pesquisa (descrito posteriormente).

É muito fácil fazer o básico.

Para aqueles que fazem referência ao código de exemplo, a configuração do CoreSpotlight é feita no AppDelegate.

 … @import CoreSpotlight; @import MobileCoreServices; …

Esses dois módulos são necessários para a nova funcionalidade.

Para simplificar no aplicativo de demonstração, o método application:didFinishLaunchingWithOptions: é usado para chamar um método dedicado para configurar o CoreSpotlight:

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

Descendo para o método setUpCoreSpotlight , iniciamos o processo criando um objeto CSSearchableItemAttributeSet :

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

O tipo de conteúdo é importante, pois deve governar a maneira geral pela qual o item é tratado pelos algoritmos de pesquisa. “Suposto” é a palavra operativa, já que esta é uma área que não está bem documentada pela Apple. Há um grande menu de tipos de itens para escolher (tipos de imagem, tipos de vídeo, tipos de áudio, tipo de contato), mas é necessário tentativa e erro para determinar o impacto (se houver) na experiência do usuário. Alguns tipos parecem exibir mais conteúdo de texto do que outros quando exibidos nos resultados da pesquisa. Também pode afetar a exibição de uma imagem em miniatura junto com o resultado. kUTTypeItem é um ótimo lugar para começar.

Agora descreva o objeto com mais detalhes:

 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;

Existem muitas propriedades possíveis, específicas para tipos de mídia, como imagens, vídeos e assim por diante. Mais informações provavelmente são melhores, mas tentativa e erro são necessárias para determinar quais informações são realmente usadas e/ou exibidas nos resultados da pesquisa. No momento da escrita, por exemplo, as classificações por estrelas parecem não ser exibidas para um determinado item de índice, mesmo que o attributeSet contenha dados de classificação por estrelas.

A maioria das propriedades de texto está incluída na consulta de pesquisa, portanto, mesmo que a propriedade de título não seja exibida, o texto pode ser encontrado por meio de pesquisa. Portanto, não está totalmente claro como a propriedade keywords é fundamentalmente diferente da propriedade title.

Consulte o documento da Apple para obter mais informações: developer.apple.com

A etapa final é empacotar o CSSearchableItemAttributeSet com CSSearchableItem e registrá-lo com o índice.

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

Duas novidades aqui. A propriedade domainIdentifier permite agrupar itens para operações em lote. Por exemplo, @“meetingItem” e @”reminderItem” em um aplicativo de calendário permitiriam que você exclua todas as entradas do Spotlight de um tipo enquanto deixa o outro.

A propriedade uniqueIdentifier tem um papel mais importante a desempenhar. Primeiro, ele é passado de volta ao seu aplicativo quando o usuário clica em um item no índice CoreSpotlight (discutido posteriormente). Em segundo lugar, há recomendações da Apple sobre como isso deve ser ao usar outros elementos da infraestrutura de pesquisa. Por enquanto, usaremos uma string que na verdade é uma URL que representa exclusivamente esse item. Tecnicamente, essa propriedade pode ser qualquer string, desde que seja exclusiva do item.

A última etapa: envie os itens que você criou para o índice real.

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

Alguns pontos a fazer aqui:

  1. Esse método usa uma matriz de objetos (e há outros métodos que podem ser usados ​​para agrupar o processo se houver muitos dados para indexar).

  2. É importante perceber que esse método não conclui realmente o processo de indexação. O manipulador de conclusão é chamado apenas quando seus itens de pesquisa foram enfileirados para indexação. Use o CSSearchableIndexDelegate para lidar com cenários em que o próprio processo de indexação falha por algum motivo e seu aplicativo precisa lidar com a situação.

Parabéns, você adicionou itens ao índice de pesquisa CoreSpotlight do telefone!

Como a pesquisa funciona no iOS 9

Naturalmente, a Apple mantém seus algoritmos de pesquisa próximos ao peito, por isso vale a pena instalar o aplicativo de exemplo e brincar com as palavras-chave. Por exemplo, rapidamente fica claro que a Apple está maximizando os resultados apresentados, fornecendo resultados muito diferentes conforme o usuário digita cada letra:

Parece que o princípio é que os resultados considerados mais apropriados serão apresentados após apenas algumas letras serem digitadas. À medida que o usuário digita mais letras, esses resultados iniciais são descartados e outras coisas (originalmente estimadas como menos prováveis) são apresentadas.

De maneira mais geral, a Apple tem apenas algumas coisas a dizer sobre como melhorar a classificação em seus algoritmos. Esta página contém as recomendações da Apple: Melhore seus resultados de pesquisa

Uma das principais conclusões da documentação da Apple é que a classificação é melhorada quando o aplicativo usa várias tecnologias de pesquisa para indexar o conteúdo. Vamos mergulhar em outra dessas tecnologias no próximo artigo. Enquanto isso, ainda precisamos implementar o código para lidar com o cenário quando um usuário clica em um resultado de pesquisa.

Quando o usuário clica

Criamos o código para preencher o índice com possíveis resultados de pesquisa, mas o que acontece quando o usuário clica em um resultado? A resposta é que o CoreSpotlight empresta o método application:continueUserActivity:restorationHandler: do protocolo UIApplicationDelegate. Isso foi originalmente introduzido no iOS 8 para o mecanismo de handoff que permite que as atividades do usuário sejam passadas de dispositivo para dispositivo (por exemplo, um usuário vê um URL da web em um iWatch, usa handoff para pegá-lo no navegador Safari do iPhone e, finalmente, visualizá-lo no Mac quando chegam ao escritório.)

O primeiro desafio é determinar se o método foi chamado devido a uma atividade de Handoff ou da Pesquisa Spotlight. A propriedade activityType do parâmetro activity informará, mas se o código puder ser executado no iOS 8, você precisará evitar uma falha nesse caso.

Veja como alguns códigos simples podem parecer aqui:

 - (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; }

Observe a linha de código:

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

Isso extrai o identificador exclusivo que foi colocado no índice do Spotlight quando o objeto CSSearchableItem foi criado. Naturalmente, seu aplicativo deve usar esse identificador exclusivo para apresentar ao usuário o conteúdo selecionado no índice de pesquisa. Para simplificar aqui, apenas NSLog o identificador exclusivo.

Recapitular

Até agora, examinamos apenas uma parte da funcionalidade de pesquisa do iOS 9. Percorremos a funcionalidade principal necessária para carregar o índice de pesquisa Spotlight do telefone com coisas que o usuário pode achar úteis: documentos, itens de calendário, contatos e assim por diante. Quando o usuário pesquisa algo, vê um resultado do seu aplicativo e clica nele, o aplicativo poderá lidar com a solicitação e exibir o item apropriado para o usuário.

O que ainda não discutimos são as tecnologias relacionadas ao índice público que a Apple está construindo. Esse índice destina-se a permitir que os usuários encontrem conteúdo em seu aplicativo mesmo sem que ele esteja instalado no telefone. Trataremos disso no próximo post.