Démystifier iOS 9 Spotlight Search pour les développeurs

Publié: 2022-03-11

Il existe trois points de recherche intégrés à iOS : Siri, Spotlight Search et Safari Search. Siri, l'une des fonctionnalités les plus emblématiques d'iOS, est quelque chose que la plupart des utilisateurs d'iPhone connaissent déjà. Mais beaucoup de gens ne connaissent pas la recherche Spotlight - quelque chose qui faisait partie intégrante d'iOS bien avant que Siri n'existe. La recherche Spotlight est accessible lorsque vous faites glisser l'écran d'accueil vers le bas, ou si vous êtes nouveau sur iOS 9, balayez directement depuis votre écran d'accueil personnel. Cela révèle une barre de recherche en haut de l'écran.

L'objectif de cet outil de recherche dans iOS 8 et versions antérieures était de rechercher le téléphone lui-même, de sorte que sa page de résultats répertorie les applications qui se trouvent sur votre téléphone, ainsi que les e-mails, les messages et d'autres éléments privés dans les applications Apple. Il affichera également une définition Wikipedia si cela semble pertinent. Enfin, il offre une option pour rechercher sur le Web via Safari comme étape supplémentaire.

Contrairement à Spotlight Search, Safari concerne le monde en dehors de votre téléphone. Dans iOS 8, l'utilisateur peut choisir le moteur de recherche à utiliser pour la recherche Safari : Google, Yahoo, Bing et DuckDuckGo. Naturellement, Google gère la majorité des requêtes de recherche Safari. Quel que soit le moteur de recherche choisi, les termes de recherche pré-remplis sont présentés dans Safari, potentiellement avec une correspondance Wikipédia.

Dans iOS 9, Spotlight Search est beaucoup plus important et plus étendu qu'auparavant. En fait, la première chose que vous voyez, ce sont les "Suggestions Siri" basées sur vos habitudes d'utilisation. Par exemple, si vous utilisez Safari régulièrement l'après-midi, Siri vous le proposera à cette heure-là.

Et, bien qu'il soit toujours un endroit pour trouver "des choses sur votre téléphone", il devient un portail direct pour "des choses qui ne sont pas sur votre téléphone". Vous voyez déjà des choses à proximité et des titres d'actualités provenant du Web via le moteur de recherche d'Apple, et d'autres résultats Web commencent tout juste à apparaître maintenant.

Oui, Apple a créé un moteur de recherche Web pour iOS 9, ce qui est un très grand pas en avant. Dites bonjour à Applebot.

Dans la même veine que Spotlight, l'objectif déclaré d'Apple pour Safari est également de faire apparaître les résultats et les suggestions de l'index de recherche d'Apple, avant d'offrir la possibilité de rechercher sur le Web avec Google (ou un autre fournisseur choisi). Depuis iOS 9.1, Safari semble être à la traîne par rapport à la recherche Spotlight en continuant à fournir les résultats du fournisseur de recherche choisi par l'utilisateur - peut-être pour donner à Apple un déploiement plus lent de ses fonctionnalités de recherche et plus de temps pour affiner ses algorithmes.

Ce qui est particulièrement excitant avec le lancement d'iOS 9, c'est que pour la première fois, il donne aux développeurs iOS la possibilité de se connecter à ces fonctions de recherche et d'inclure du contenu à partir d'applications . De plus, la promesse est que la recherche inclura finalement des résultats qui ne se trouvent pas sur le téléphone de l'utilisateur . C'est un pas énorme.

Mettons cela dans son contexte. Le moteur de recherche de Google a engendré toute une industrie construite autour du "SEO" - le processus d'optimisation de vos actifs autour de la recherche de Google. Lorsqu'il sera entièrement lancé, le moteur de recherche d'Apple détiendra environ 50 % du marché de la recherche mobile, soit 50 % (et en croissance) du trafic de recherche global. Applebot est donc gros, ce qui signifie que "Apple Mobile Search Optimization" sera également gros.

Les efforts d'optimisation de la recherche mobile d'Apple auront un impact beaucoup plus important sur la découverte d'applications par les utilisateurs mobiles que le référencement normal.

Bienvenue dans l'industrie AMSO naissante.

La mauvaise nouvelle est que la mise en œuvre de toutes ces fonctionnalités implique de nombreuses nouvelles technologies d'Apple ainsi que l'amélioration des anciennes, et la combinaison de ces éléments peut être déroutante. Le but de cette série est de parcourir les différentes pièces et de clarifier comment elles pourraient être mises en œuvre. Commençons par quelque chose de basique et construisons dessus.

Démystifier iOS 9 Spotlight Search pour les développeurs

À l'appui de cette série, j'ai créé une application simple pour référence tout au long. Le projet peut être trouvé ici : https://github.com/rwforsythe/iOS9-Search. Il sera également mis à jour au fur et à mesure que cette série couvrira d'autres éléments de la boîte à outils de recherche.

La Fondation : Cadre CoreSpotlight

Ce cadre, entièrement nouveau dans iOS 9, vous permet de contribuer des éléments à l'index de recherche locale de l'iPhone pour la découverte par l'utilisateur. Par exemple, avant iOS 9, seul le contenu des applications Apple officielles, telles que Calendrier, pouvait être trouvé via la recherche Spotlight. Désormais, toute application qui publie ses événements de calendrier via le framework CoreSpotlight peut être trouvée via Spotlight Search et même Siri.

Notez que l'accent est mis ici sur les informations personnelles ; vous ne voulez pas que les événements de votre calendrier personnel soient trouvés par les utilisateurs d'un autre téléphone ! Apple est très clair sur le fait que le framework CoreSpotlight interagit exclusivement avec l'index privé sur le téléphone de chaque personne. Il n'est pas possible d'utiliser l'API CoreSpotlight pour publier du contenu en dehors du propre index du téléphone.

Cela ne signifie pas que CoreSpotlight ne peut pas être utilisé pour indexer des informations déjà publiques. Il est certainement possible d'utiliser CoreSpotlight pour extraire des informations du cloud et les placer dans l'index de recherche du téléphone. C'est simplement une garantie d'Apple que si des informations personnelles et confidentielles sont indexées avec CoreSpotlight, elles resteront confidentielles.

Le cadre se compose de deux parties : l'objet CSSearchableItemAttributeSet qui permet à l'application de décrire chaque élément en détail, et un objet CSSearchableItem qui est utilisé pour donner à l'élément un ID unique. Chaque entrée Spotlight est composée d'une paire de ces objets. La raison de l'utilisation de deux objets au lieu d'un est que les objets CSSearchableItemAttributeSet sont utilisés pour un type différent d'interaction de recherche (décrit plus loin).

C'est assez facile de faire les bases.

Pour ceux qui font référence à l'exemple de code, la configuration de CoreSpotlight est effectuée dans AppDelegate.

 … @import CoreSpotlight; @import MobileCoreServices; …

Ces deux modules sont nécessaires pour la nouvelle fonctionnalité.

Pour plus de simplicité dans l'application de démonstration, la méthode application:didFinishLaunchingWithOptions : est utilisée pour appeler une méthode dédiée à la configuration de CoreSpotlight :

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

En descendant vers la méthode setUpCoreSpotlight , nous commençons le processus en créant un objet CSSearchableItemAttributeSet :

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

Le type de contenu est important car il est censé régir la manière générale dont l'élément est traité par les algorithmes de recherche. "Supposé" est le mot clé, car il s'agit d'un domaine qui n'est pas bien documenté par Apple. Il existe un large menu de types d'éléments parmi lesquels choisir (types d'images, types de vidéos, types audio, un type de contact), mais des essais et des erreurs sont nécessaires pour déterminer quel impact (le cas échéant) cela a sur l'expérience de l'utilisateur. Certains types semblent afficher plus de contenu textuel que d'autres lorsqu'ils sont affichés dans les résultats de recherche. Cela peut également avoir un impact sur l'affichage ou non d'une image miniature avec le résultat. kUTTypeItem est un excellent point de départ.

Décrivez maintenant l'objet plus en détail :

 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;

Il existe de nombreuses propriétés possibles, spécifiques aux types de médias tels que les images, les vidéos, etc. Plus d'informations sont probablement préférables, mais des essais et des erreurs sont nécessaires pour déterminer quelles informations sont réellement utilisées et/ou affichées dans les résultats de recherche. Au moment de la rédaction, par exemple, les classements par étoiles ne semblent pas être affichés pour un élément d'index donné, même si l'attributAttributSet contient des données de classement par étoiles.

La plupart des propriétés de texte sont incluses dans la requête de recherche, donc même si la propriété de titre n'est pas affichée, le texte peut être trouvé via la recherche. Il n'est donc pas tout à fait clair en quoi la propriété des mots-clés est fondamentalement différente de la propriété du titre.

Voir la doc d'Apple pour plus d'informations : developer.apple.com

La dernière étape consiste à empaqueter le CSSearchableItemAttributeSet avec CSSearchableItem et à l'enregistrer avec l'index.

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

Deux nouveautés ici. La propriété domainIdentifier vous permet de regrouper des éléments pour des opérations par lots. Par exemple, @ "meetingItem" et @ "reminderItem" dans une application de calendrier vous permettraient de supprimer toutes les entrées Spotlight d'un type tout en laissant l'autre.

La propriété uniqueIdentifier a un rôle plus important à jouer. Tout d'abord, il est retransmis à votre application lorsque l'utilisateur clique sur un élément de l'index CoreSpotlight (voir plus loin). Deuxièmement, il existe des recommandations d'Apple sur ce à quoi cela devrait ressembler lors de l'utilisation d'autres éléments de l'infrastructure de recherche. Pour l'instant, nous allons utiliser une chaîne qui est en fait une URL qui représente de manière unique cet élément. Techniquement, cette propriété peut être n'importe quelle chaîne, tant qu'elle est unique à l'élément.

La dernière étape : poussez les éléments que vous avez créés dans l'index réel.

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

Quelques points à souligner ici :

  1. Cette méthode prend un tableau d'objets (et il existe d'autres méthodes qui peuvent être utilisées pour traiter le processus par lots s'il y a beaucoup de données à indexer).

  2. Il est important de réaliser que cette méthode ne complète pas réellement le processus d'indexation. Le gestionnaire d'achèvement est appelé uniquement lorsque vos éléments de recherche ont été mis en file d'attente pour l'indexation. Utilisez CSSearchableIndexDelegate pour gérer les scénarios dans lesquels le processus d'indexation lui-même échoue pour une raison quelconque et votre application doit gérer la situation.

Félicitations, vous avez ajouté des éléments à l'index de recherche CoreSpotlight du téléphone !

Comment fonctionne la recherche dans iOS 9

Naturellement, Apple garde ses algorithmes de recherche à portée de main, il vaut donc la peine d'installer l'exemple d'application et de jouer avec les mots-clés. Par exemple, il devient rapidement évident qu'Apple maximise les résultats présentés en donnant des résultats très différents au fur et à mesure que l'utilisateur tape chaque lettre :

Il semble que le principe soit que les résultats jugés les plus appropriés seront présentés après seulement quelques lettres tapées. Au fur et à mesure que l'utilisateur tape plus de lettres, ces premiers résultats sont abandonnés et d'autres éléments (initialement estimés moins probables) sont présentés à la place.

Plus généralement, Apple n'a que peu de choses à dire sur la façon d'améliorer le classement sous ses algorithmes. Cette page contient les recommandations d'Apple : Améliorez vos résultats de recherche

L'un des principaux enseignements de la documentation d'Apple est que le classement est amélioré lorsque l'application utilise plusieurs technologies de recherche pour indexer le contenu. Nous allons plonger dans une autre de ces technologies dans le prochain article. En attendant, nous devons encore implémenter du code pour gérer le scénario lorsqu'un utilisateur clique sur un résultat de recherche.

Lorsque l'utilisateur clique

Nous avons créé le code pour remplir l'index avec des résultats de recherche potentiels, mais que se passe-t-il lorsque l'utilisateur clique sur un résultat ? La réponse est que CoreSpotlight emprunte la méthode application:continueUserActivity:restorationHandler: du protocole UIApplicationDelegate. Cela a été introduit à l'origine dans iOS 8 pour le mécanisme de transfert qui permet aux activités de l'utilisateur d'être transmises d'un appareil à l'autre (par exemple, un utilisateur voit une URL Web sur une iWatch, utilise le transfert pour le récupérer sur le navigateur Safari de l'iPhone et, finalement, le visualiser. sur leur Mac lorsqu'ils arrivent au bureau.)

Le premier défi consiste à déterminer si la méthode a été appelée en raison d'une activité de transfert ou de la recherche Spotlight. La propriété activityType du paramètre d'activité vous le dira, mais si le code peut s'exécuter sur iOS 8, vous devrez éviter un plantage dans ce cas.

Voici à quoi pourrait ressembler un code simple ici :

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

Notez la ligne de code :

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

Cela extrait l'identifiant unique qui a été placé dans l'index Spotlight lorsque l'objet CSSearchableItem a été créé. Naturellement, votre application doit utiliser cet identifiant unique pour présenter à l'utilisateur le contenu qu'il a sélectionné dans l'index de recherche. Pour plus de simplicité ici, nous venons de NSLog l'identifiant unique.

résumer

Jusqu'à présent, nous n'avons examiné qu'une partie de la fonctionnalité de recherche d'iOS 9. Nous avons parcouru les fonctionnalités de base nécessaires pour charger l'index de recherche Spotlight du téléphone avec des éléments que l'utilisateur pourrait trouver utiles : documents, éléments de calendrier, contacts, etc. Lorsque l'utilisateur recherche quelque chose, voit un résultat de votre application et clique dessus, l'application sera en mesure de gérer la demande et d'afficher l'élément approprié pour l'utilisateur.

Ce dont nous n'avons pas encore discuté, ce sont les technologies liées à l'index public qu'Apple est en train de construire. Cet index est destiné à permettre aux utilisateurs de trouver du contenu dans votre application même sans qu'elle soit installée sur leur téléphone. Nous aborderons cela dans le prochain post.