Demistificare la ricerca Spotlight di iOS 9 per gli sviluppatori

Pubblicato: 2022-03-11

Ci sono tre punti di ricerca integrati in iOS: Siri, Spotlight Search e Safari search. Siri, una delle funzionalità più iconiche di iOS, è qualcosa con cui la maggior parte degli utenti di iPhone ha già familiarità. Ma molte persone non sono a conoscenza della ricerca Spotlight, qualcosa che è stato parte integrante di iOS molto prima che esistesse Siri. È possibile accedere a Spotlight Search quando scorri la schermata iniziale verso il basso o, per i nuovi utenti di iOS 9, scorri verso destra dalla schermata iniziale personale. Questo rivela una barra di ricerca nella parte superiore dello schermo.

L'obiettivo di questo strumento di ricerca in iOS 8 e versioni precedenti era la ricerca nel telefono stesso, quindi la pagina dei risultati elenca le app presenti sul telefono, nonché e-mail, messaggi e altri elementi privati ​​all'interno delle app Apple. Mostrerà anche una definizione di Wikipedia se sembra pertinente. Infine, offre un'opzione per cercare sul Web tramite Safari come passaggio aggiuntivo.

A differenza di Spotlight Search, Safari è tutto incentrato sul mondo al di fuori del tuo telefono. In iOS 8, l'utente può scegliere quale motore di ricerca utilizzare per la ricerca di Safari: Google, Yahoo, Bing e DuckDuckGo. Naturalmente Google gestisce la maggior parte delle richieste di ricerca di Safari. Indipendentemente dal motore di ricerca scelto, i termini di ricerca precompilati vengono presentati in Safari, potenzialmente con una corrispondenza con Wikipedia.

In iOS 9, Spotlight Search è molto più importante e con un ambito più ampio rispetto a prima. In effetti, la prima cosa che vedi sono "Suggerimenti Siri" in base ai tuoi schemi di utilizzo. Ad esempio, se usi Safari regolarmente nel pomeriggio, Siri te lo suggerirà in quel momento.

E, sebbene sia ancora un posto dove trovare "cose ​​sul tuo telefono", sta diventando un portale diretto per "cose ​​non sul tuo telefono". Vedi già cose nelle vicinanze e titoli di notizie provenienti dal Web tramite il motore di ricerca di Apple e altri risultati basati sul Web stanno appena iniziando ad apparire ora.

Sì, Apple ha creato un motore di ricerca web per iOS 9, che è un grande passo avanti. Saluta Applebot.

In modo simile a Spotlight, l'obiettivo dichiarato di Apple per Safari è anche quello di far emergere risultati e suggerimenti dall'indice di ricerca di Apple, prima di offrire la possibilità di eseguire ricerche sul Web con Google (o altro provider scelto). A partire da iOS 9.1, Safari sembra essere in ritardo rispetto alla ricerca Spotlight continuando a fornire risultati dal provider di ricerca scelto dall'utente, forse per dare ad Apple un'implementazione più lenta delle sue funzionalità di ricerca e più tempo per mettere a punto i suoi algoritmi.

Ciò che è particolarmente eccitante del lancio di iOS 9 è che per la prima volta offre agli sviluppatori iOS la possibilità di agganciarsi a queste funzioni di ricerca e includere contenuti dalle app . Inoltre, la promessa è che la ricerca alla fine includerà risultati non sul telefono dell'utente . Questo è un passo enorme.

Mettiamolo nel contesto. Il motore di ricerca di Google ha generato un intero settore costruito attorno alla "SEO", il processo di ottimizzazione delle tue risorse attorno alla ricerca di Google. Quando sarà completamente lanciato, il motore di ricerca di Apple deterrà circa il 50% del mercato della ricerca mobile, ovvero il 50% (e in crescita) del traffico di ricerca complessivo. Applebot è quindi grande, il che significa che anche "Apple Mobile Search Optimization" sarà grande.

Gli sforzi di Apple Mobile Search Optimization avranno un impatto molto maggiore sulla scoperta di app da parte degli utenti mobili rispetto alla normale SEO.

Benvenuti nel neonato settore AMSO.

La cattiva notizia è che l'implementazione di tutte queste funzionalità coinvolge molte nuove tecnologie di Apple e il miglioramento di quelle vecchie e la combinazione di questi elementi può creare confusione. L'obiettivo di questa serie è di esaminare i vari pezzi e chiarire come potrebbero essere implementati. Iniziamo con qualcosa di base e costruiamoci sopra.

Demistificare la ricerca Spotlight di iOS 9 per gli sviluppatori

A sostegno di questa serie, ho creato una semplice app di riferimento. Il progetto può essere trovato qui: https://github.com/rwforsythe/iOS9-Search. Verrà inoltre aggiornato man mano che questa serie continua a coprire altri elementi del toolkit di ricerca.

Il fondamento: CoreSpotlight Framework

Questo framework, completamente nuovo in iOS 9, consente di aggiungere elementi all'indice di ricerca locale dell'iPhone affinché l'utente li scopra. Ad esempio, prima di iOS 9, solo i contenuti all'interno delle app Apple ufficiali, come Calendar, potevano essere trovati tramite la ricerca Spotlight. Ora, qualsiasi app che pubblica i propri eventi del calendario tramite il framework CoreSpotlight può essere trovata tramite Spotlight Search e persino Siri.

Si noti che l'attenzione qui è sulle informazioni personali; non vuoi che gli eventi del tuo calendario personale vengano trovati dagli utenti su un altro telefono! Apple è molto chiara sul fatto che il framework CoreSpotlight interagisce esclusivamente con l'indice privato sul telefono di ogni persona. Non è possibile utilizzare l'API CoreSpotlight per pubblicare contenuti al di fuori dell'indice del telefono.

Ciò non significa che CoreSpotlight non possa essere utilizzato per indicizzare informazioni già pubbliche. È certamente possibile utilizzare CoreSpotlight per estrarre informazioni dal cloud e inserirle nell'indice di ricerca del telefono. È semplicemente una garanzia di Apple che se le informazioni personali e riservate vengono indicizzate con CoreSpotlight, rimarranno riservate.

Il framework è costituito da due parti: l'oggetto CSSearchableItemAttributeSet che consente all'app di descrivere ogni elemento in dettaglio e un oggetto CSSearchableItem che viene utilizzato per assegnare all'elemento un ID univoco. Ogni voce Spotlight è composta da una coppia di questi oggetti. Il motivo per l'utilizzo di due oggetti invece di uno è che gli oggetti CSSearchableItemAttributeSet vengono utilizzati per un diverso tipo di interazione di ricerca (descritta più avanti).

È abbastanza facile fare le basi.

Per coloro che fanno riferimento al codice di esempio, la configurazione di CoreSpotlight viene eseguita in AppDelegate.

 … @import CoreSpotlight; @import MobileCoreServices; …

Questi due moduli sono necessari per la nuova funzionalità.

Per semplicità nell'app demo, il metodo application:didFinishLaunchingWithOptions: viene utilizzato per chiamare un metodo dedicato per la configurazione di CoreSpotlight:

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

Passando al metodo setUpCoreSpotlight , iniziamo il processo creando un oggetto CSSearchableItemAttributeSet :

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

Il tipo di contenuto è importante in quanto dovrebbe governare il modo generale in cui l'elemento viene trattato dagli algoritmi di ricerca. “Supposto” è la parola chiave, poiché si tratta di un'area non ben documentata da Apple. C'è un ampio menu di tipi di elementi tra cui scegliere (tipi di immagine, tipi di video, tipi di audio, un tipo di contatto), ma sono necessari tentativi ed errori per determinare quale impatto (se presente) ha sull'esperienza dell'utente. Alcuni tipi sembrano visualizzare più contenuto di testo rispetto ad altri quando vengono visualizzati nei risultati di ricerca. Può anche influire sulla visualizzazione di un'immagine in miniatura insieme al risultato. kUTTypeItem è un ottimo punto di partenza.

Ora descrivi l'oggetto in modo più dettagliato:

 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;

Ci sono molte proprietà possibili, specifiche per tipi di media come immagini, video e così via. Maggiori informazioni sono probabilmente migliori, ma sono necessari tentativi ed errori per determinare quali informazioni vengono effettivamente utilizzate e/o visualizzate nei risultati di ricerca. Al momento della scrittura, ad esempio, le valutazioni in stelle sembrano non essere visualizzate per un determinato elemento dell'indice, anche se l'attributoSet contiene dati sulla valutazione in stelle.

La maggior parte delle proprietà del testo sono incluse nella query di ricerca, quindi anche se la proprietà title non viene visualizzata, il testo può essere trovato tramite la ricerca. Non è quindi del tutto chiaro come la proprietà delle parole chiave sia fondamentalmente diversa dalla proprietà del titolo.

Per ulteriori informazioni, consulta il documento Apple: developer.apple.com

Il passaggio finale consiste nell'impacchettare CSSearchableItemAttributeSet con CSSearchableItem e registrarlo con l'indice.

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

Due cose nuove qui. La proprietà domainIdentifier consente di raggruppare elementi per operazioni batch. Ad esempio, @"meetingItem" e @"reminderItem" in un'app di calendario ti permetterebbero di eliminare tutte le voci Spotlight di un tipo lasciando l'altro.

La proprietà uniqueIdentifier ha un ruolo più importante da svolgere. Innanzitutto, viene restituito all'app quando l'utente fa clic su un elemento nell'indice CoreSpotlight (discusso più avanti). In secondo luogo, ci sono consigli di Apple su come dovrebbe apparire quando si utilizzano altri elementi dell'infrastruttura di ricerca. Per ora, useremo una stringa che è in realtà un URL che rappresenta in modo univoco questo elemento. Tecnicamente questa proprietà potrebbe essere qualsiasi stringa, purché sia ​​univoca per l'elemento.

L'ultimo passaggio: inserisci gli elementi che hai creato nell'indice effettivo.

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

Un paio di punti da fare qui:

  1. Questo metodo accetta una matrice di oggetti (e ci sono altri metodi che possono essere utilizzati per eseguire in batch il processo se sono presenti molti dati da indicizzare).

  2. È importante rendersi conto che questo metodo non completa effettivamente il processo di indicizzazione. Il gestore di completamento viene chiamato solo quando gli elementi di ricerca sono stati messi in coda per l'indicizzazione. Usa CSSearchableIndexDelegate per gestire scenari in cui il processo di indicizzazione stesso non riesce per qualche motivo e la tua app deve gestire la situazione.

Congratulazioni, hai aggiunto elementi all'indice di ricerca CoreSpotlight del telefono!

Come funziona la ricerca in iOS 9

Naturalmente, Apple mantiene i suoi algoritmi di ricerca vicini al petto, quindi vale la pena installare l'app di esempio e giocare con le parole chiave. Ad esempio, diventa subito evidente che Apple sta massimizzando i risultati presentati fornendo risultati molto diversi man mano che l'utente digita ogni lettera:

Sembra che il principio sia che i risultati ritenuti più appropriati verranno presentati dopo che sono state digitate solo un paio di lettere. Man mano che l'utente digita più lettere, quei primi risultati vengono eliminati e vengono invece presentate altre cose (originariamente stimate come meno probabili).

Più in generale, Apple ha solo poche cose da dire su come migliorare il ranking in base ai propri algoritmi. Questa pagina contiene i consigli di Apple: Migliora i tuoi risultati di ricerca

Uno dei punti chiave della documentazione di Apple è che la classifica migliora quando l'app utilizza più tecnologie di ricerca per indicizzare i contenuti. Ci tufferemo in un'altra di queste tecnologie nel prossimo articolo. Nel frattempo, dobbiamo ancora implementare il codice per gestire lo scenario quando un utente fa clic su un risultato di ricerca.

Quando l'utente fa clic

Abbiamo creato il codice per popolare l'indice con potenziali risultati di ricerca, ma cosa succede quando l'utente fa clic su un risultato? La risposta è che CoreSpotlight prende in prestito il metodo application:continueUserActivity:restorationHandler: dal protocollo UIApplicationDelegate. Questo è stato originariamente introdotto in iOS 8 per il meccanismo di trasferimento che consente alle attività dell'utente di essere passate da un dispositivo all'altro (ad es. un utente vede un URL web su un iWatch, usa il trasferimento per prelevarlo sul browser Safari di iPhone e infine visualizzarlo sul loro Mac quando arrivano in ufficio.)

La prima sfida è determinare se il metodo è stato chiamato a causa di un'attività Handoff o da Spotlight Search. La proprietà ActivityType del parametro Activity te lo dirà, ma se il codice potrebbe essere eseguito su iOS 8, in tal caso dovrai evitare un arresto anomalo.

Ecco come potrebbe apparire un semplice codice qui:

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

Nota la riga di codice:

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

Questo estrae l'identificatore univoco che è stato inserito nell'indice Spotlight quando è stato creato l'oggetto CSSearchableItem . Naturalmente la tua app dovrebbe utilizzare questo identificatore univoco per presentare all'utente il contenuto che ha selezionato dall'indice di ricerca. Per semplicità qui, abbiamo solo NSLog l'identificatore univoco.

Ricapitolare

Finora, abbiamo esaminato solo una parte della funzionalità di ricerca di iOS 9. Abbiamo esaminato le funzionalità principali necessarie per caricare l'indice di ricerca Spotlight del telefono con elementi che l'utente potrebbe trovare utili: documenti, elementi del calendario, contatti e così via. Quando l'utente cerca qualcosa, vede un risultato dalla tua app e fa clic su di esso, l'app sarà in grado di gestire la richiesta e visualizzare l'elemento appropriato per l'utente.

Quello che non abbiamo ancora discusso sono le tecnologie che riguardano l'indice pubblico che Apple sta costruendo. Questo indice ha lo scopo di consentire agli utenti di trovare contenuto nella tua app anche senza che sia installata sul proprio telefono. Lo affronteremo nel prossimo post.