Demistificarea iOS 9 Spotlight Search pentru dezvoltatori

Publicat: 2022-03-11

Există trei puncte de căutare încorporate în iOS: Siri, Căutare Spotlight și căutare Safari. Siri, una dintre cele mai emblematice caracteristici ale iOS, este ceva cu care majoritatea utilizatorilor de iPhone sunt deja familiarizați. Dar mulți oameni nu sunt conștienți de căutarea Spotlight - ceva care a fost o parte integrantă a iOS cu mult înainte ca Siri să existe. Căutarea Spotlight poate fi accesată atunci când glisați ecranul de pornire în jos sau, nou la iOS 9, glisați la dreapta de pe ecranul de pornire personal. Aceasta dezvăluie o bară de căutare în partea de sus a ecranului.

Accentul acestui instrument de căutare în iOS 8 și anterioare a fost căutarea telefonului în sine, astfel încât pagina sa de rezultate listează aplicațiile care se află pe telefonul dvs., precum și e-mailurile, mesajele și alte elemente private din aplicațiile Apple. De asemenea, va afișa o definiție Wikipedia dacă pare relevantă. În cele din urmă, oferă o opțiune de căutare pe web prin Safari ca pas suplimentar.

Spre deosebire de Spotlight Search, Safari se referă la lumea din afara telefonului tău. În iOS 8, utilizatorul poate alege ce motor de căutare să folosească pentru căutarea Safari: Google, Yahoo, Bing și DuckDuckGo. Desigur, Google se ocupă de majoritatea solicitărilor de căutare Safari. Indiferent de motorul de căutare ales, termenii de căutare precompletati sunt prezentați în Safari, eventual cu o potrivire Wikipedia.

În iOS 9, Spotlight Search este mult mai proeminentă și mai extinsă decât înainte. De fapt, primul lucru pe care îl vedeți sunt „Sugestiile Siri” bazate pe modelele dvs. de utilizare. De exemplu, dacă utilizați Safari în mod regulat după-amiaza, Siri vă va sugera acest lucru în acea oră.

Și, deși este încă un loc pentru a găsi „lucruri pe telefonul tău”, acesta devine un portal direct pentru „lucruri care nu sunt pe telefonul tău”. Vedeți deja lucruri în apropiere și titluri de știri provenite de pe web prin intermediul propriului motor de căutare Apple, iar alte rezultate bazate pe web abia încep să apară acum.

Da, Apple a creat un motor de căutare web pentru iOS 9, ceea ce este un pas foarte mare. Salutați-l pe Applebot.

În mod similar cu Spotlight, scopul declarat al Apple pentru Safari este, de asemenea, de a arăta rezultate și sugestii din indexul de căutare Apple, înainte de a oferi posibilitatea de a căuta pe web cu Google (sau alt furnizor ales). Începând cu iOS 9.1, Safari pare să fie în urmă în urma căutării Spotlight, continuând să difuzeze rezultate de la furnizorul de căutare ales de utilizator - poate pentru a oferi Apple o lansare mai lentă a funcțiilor sale de căutare și mai mult timp pentru a-și ajusta algoritmii.

Ceea ce este deosebit de interesant la lansarea iOS 9 este că, pentru prima dată, oferă dezvoltatorilor iOS posibilitatea de a se conecta la aceste funcții de căutare și de a include conținut din aplicații . În plus, promisiunea este că căutarea va include în cele din urmă rezultate care nu se află pe telefonul utilizatorului . Acesta este un pas uriaș.

Să punem asta în context. Motorul de căutare Google a dat naștere unei întregi industrii construite în jurul „SEO” – procesul de optimizare a activelor în jurul căutării Google. Când va fi lansat complet, motorul de căutare Apple va deține aproximativ 50% din piața de căutare mobilă, ceea ce reprezintă 50% (și în creștere) din traficul total de căutare. Prin urmare, Applebot este mare, ceea ce înseamnă că „Apple Mobile Search Optimization” va fi de asemenea mare.

Eforturile Apple Mobile Search Optimization vor avea un impact mult mai mare asupra descoperirii aplicațiilor de către utilizatorii de dispozitive mobile decât SEO obișnuit.

Bun venit în industria nou-născutului AMSO.

Vestea proastă este că implementarea tuturor acestor caracteristici implică multe tehnologii noi de la Apple, precum și îmbunătățirea celor vechi, iar combinația acestor elemente poate fi confuză. Scopul acestei serii este de a parcurge diferitele piese și de a clarifica modul în care ar putea fi implementate. Să începem cu ceva de bază și să continuăm pe el.

Demistificarea iOS 9 Spotlight Search pentru dezvoltatori

În sprijinul acestei serii, am creat o aplicație simplă pentru referință pe tot parcursul. Proiectul poate fi găsit aici: https://github.com/rwforsythe/iOS9-Search. De asemenea, va fi actualizat, deoarece această serie continuă să acopere alte elemente ale setului de instrumente de căutare.

Fundația: Cadrul CoreSpotlight

Acest cadru, complet nou în iOS 9, vă permite să contribuiți cu articole la indexul de căutare locală al iPhone-ului pentru descoperire de către utilizator. De exemplu, înainte de iOS 9, numai conținutul din aplicațiile oficiale Apple, cum ar fi Calendar, putea fi găsit prin căutarea Spotlight. Acum, orice aplicație care își publică evenimentele din calendar prin cadrul CoreSpotlight poate fi găsită prin Spotlight Search și chiar prin Siri.

Rețineți că aici se pune accentul pe informațiile personale; nu vrei ca evenimentele tale personale din calendar să fie găsite de utilizatori pe alt telefon! Apple este foarte clar că framework-ul CoreSpotlight interacționează exclusiv cu indexul privat de pe telefonul fiecărei persoane. Nu este posibil să utilizați CoreSpotlight API pentru a publica conținut în afara indexului propriu al telefonului.

Asta nu înseamnă că CoreSpotlight nu poate fi utilizat pentru a indexa informațiile deja publice. Este cu siguranță posibil să utilizați CoreSpotlight pentru a extrage informații din cloud și a le plasa în indexul de căutare al telefonului. Este pur și simplu o garanție de la Apple că, dacă informațiile personale și confidențiale sunt indexate cu CoreSpotlight, acestea vor rămâne confidențiale.

Cadrul este format în două părți: obiectul CSSearchableItemAttributeSet care permite aplicației să descrie fiecare articol în detaliu și un obiect CSSearchableItem care este utilizat pentru a da articolului un ID unic. Fiecare intrare Spotlight este alcătuită dintr-o pereche de aceste obiecte. Motivul pentru utilizarea a două obiecte în loc de unul este că obiectele CSSearchableItemAttributeSet sunt folosite pentru un alt tip de interacțiune de căutare (descris mai târziu).

Este destul de ușor să faci elementele de bază.

Pentru cei care fac referire la exemplul de cod, configurarea CoreSpotlight se face în AppDelegate.

 … @import CoreSpotlight; @import MobileCoreServices; …

Aceste două module sunt necesare pentru noua funcționalitate.

Pentru simplitate în aplicația demo, metoda application:didFinishLaunchingWithOptions: este utilizată pentru a apela o metodă dedicată pentru configurarea CoreSpotlight:

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

Trecând la metoda setUpCoreSpotlight , începem procesul prin crearea unui obiect CSSearchableItemAttributeSet :

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

Tipul de conținut este important, deoarece se presupune că guvernează modul general în care articolul este tratat de algoritmii de căutare. „Presumat” este cuvântul operativ, deoarece aceasta este o zonă care nu este bine documentată de Apple. Există un meniu mare de tipuri de articole din care să alegeți (tipuri de imagini, tipuri video, tipuri audio, un tip de contact), dar este necesară încercare și eroare pentru a determina impactul (dacă există) asupra experienței utilizatorului. Unele tipuri par să afișeze mai mult conținut text decât altele atunci când sunt afișate în rezultatele căutării. De asemenea, poate afecta dacă o imagine în miniatură este afișată împreună cu rezultatul. kUTTypeItem este un loc minunat pentru a începe.

Acum descrieți obiectul mai detaliat:

 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;

Există o mulțime de proprietăți posibile, specifice tipurilor media, cum ar fi imagini, videoclipuri și așa mai departe. Mai multe informații sunt probabil mai bune, dar este nevoie de încercări și erori pentru a determina ce informații sunt de fapt utilizate și/sau afișate în rezultatele căutării. La momentul scrierii, de exemplu, evaluările cu stele par să nu fie afișate pentru un anumit element de index, chiar dacă attributeSet conține date de rating cu stele.

Majoritatea proprietăților textului sunt incluse în interogarea de căutare, așa că, chiar dacă proprietatea titlului nu este afișată, textul poate fi găsit prin căutare. Prin urmare, nu este complet clar modul în care proprietatea cuvintelor cheie este fundamental diferită de proprietatea titlului.

Consultați documentul Apple pentru mai multe informații: developer.apple.com

Pasul final este să împachetați CSSearchableItemAttributeSet cu CSSearchableItem și să îl înregistrați cu indexul.

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

Două lucruri noi aici. Proprietatea domainIdentifier vă permite să grupați articole împreună pentru operațiuni în lot. De exemplu, @„meetingItem” și @”reminderItem” într-o aplicație de calendar vă vor permite să ștergeți toate intrările Spotlight de un fel, în timp ce părăsiți celălalt.

Proprietatea uniqueIdentifier are un rol mai important de jucat. În primul rând, este transmis înapoi în aplicația dvs. atunci când utilizatorul face clic pe un element din indexul CoreSpotlight (discutat mai târziu). În al doilea rând, există recomandări de la Apple despre cum ar trebui să arate atunci când utilizați alte elemente ale infrastructurii de căutare. Pentru moment, vom folosi un șir care este de fapt o adresă URL care reprezintă în mod unic acest articol. Din punct de vedere tehnic, această proprietate poate fi orice șir, atâta timp cât este unică pentru articol.

Ultimul pas: introduceți elementele pe care le-ați creat în indexul real.

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

Câteva puncte de făcut aici:

  1. Această metodă preia o serie de obiecte (și există alte metode care pot fi utilizate pentru a procesa în loturi dacă există multe date de indexat).

  2. Este important de realizat că această metodă nu completează de fapt procesul de indexare. Managerul de completare este apelat numai atunci când elementele dvs. de căutare au fost puse în coadă pentru indexare. Utilizați CSSearchableIndexDelegate pentru a gestiona scenarii în care procesul de indexare în sine eșuează dintr-un anumit motiv și aplicația dvs. trebuie să gestioneze situația.

Felicitări, ați adăugat elemente la indexul de căutare CoreSpotlight al telefonului!

Cum funcționează căutarea în iOS 9

Desigur, Apple își păstrează algoritmii de căutare aproape de piept, așa că merită să instalezi aplicația eșantion și să te joci cu cuvintele cheie. De exemplu, devine rapid evident că Apple maximizează rezultatele prezentate oferind rezultate foarte diferite pe măsură ce utilizatorul a tastat fiecare literă:

Se pare că principiul este că rezultatele considerate mai potrivite vor fi prezentate după ce au fost tastate doar câteva litere. Pe măsură ce utilizatorul scrie mai multe litere, acele rezultate timpurii sunt eliminate și sunt prezentate în schimb alte lucruri (estimate inițial a fi mai puțin probabile).

În general, Apple are doar câteva lucruri de spus despre cum să îmbunătățească clasarea în baza algoritmilor lor. Această pagină conține recomandările Apple: Îmbunătățiți-vă rezultatele căutării

Una dintre concluziile cheie din documentația Apple este că clasarea este îmbunătățită atunci când aplicația folosește mai multe tehnologii de căutare pentru a indexa conținutul. Ne vom scufunda în altă dintre aceste tehnologii în următorul articol. Între timp, mai trebuie să implementăm cod pentru a gestiona scenariul când un utilizator face clic pe un rezultat al căutării.

Când utilizatorul face clic

Am creat codul pentru a popula indexul cu potențiale rezultate ale căutării, dar ce se întâmplă când utilizatorul face clic pe un rezultat? Răspunsul este că CoreSpotlight împrumută metoda application:continueUserActivity:restorationHandler: din protocolul UIApplicationDelegate. Acest lucru a fost introdus inițial în iOS 8 pentru mecanismul de transfer care permite ca activitățile utilizatorului să fie transmise de la dispozitiv la dispozitiv (de exemplu, un utilizator vede o adresă URL web pe un iWatch, folosește transferul pentru a o prelua din browserul iPhone Safari și, în cele din urmă, o vede pe Mac-ul lor când ajung la birou.)

Prima provocare este de a determina dacă metoda a fost apelată din cauza unei activități Handoff sau din Spotlight Search. Proprietatea activityType a parametrului de activitate vă va spune, dar dacă codul poate rula pe iOS 8, va trebui să evitați o blocare în acest caz.

Iată cum ar putea arăta un cod simplu aici:

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

Rețineți linia de cod:

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

Aceasta extrage identificatorul unic care a fost plasat în indexul reflectoarelor când a fost creat obiectul CSSearchableItem . Desigur, aplicația dvs. ar trebui să folosească acest identificator unic pentru a prezenta utilizatorului conținutul pe care l-a selectat din indexul de căutare. Pentru simplitate aici, doar NSLog identificatorul unic.

Recapitulare

Până acum, am examinat doar o parte din funcționalitatea de căutare a iOS 9. Am parcurs funcționalitatea de bază necesară pentru a încărca indexul de căutare Spotlight al telefonului cu lucruri pe care utilizatorul le-ar putea găsi utile: documente, elemente din calendar, contacte și așa mai departe. Când utilizatorul caută ceva, vede un rezultat din aplicația dvs. și face clic pe acesta, aplicația va putea gestiona cererea și va afișa elementul potrivit pentru utilizator.

Ceea ce nu am discutat încă sunt tehnologiile care se referă la indexul public pe care Apple îl construiește. Acest index este destinat să permită utilizatorilor să găsească conținut în aplicația dvs. chiar și fără ca acesta să fie instalat pe telefonul lor. Vom aborda asta în următoarea postare.