iOS 9 Introducerea API-urilor de căutare

Introducere

La WWDC 2015, Apple a anunțat oficial iOS 9. În plus față de numeroasele caracteristici și îmbunătățiri noi, această actualizare oferă, de asemenea, dezvoltatorilor posibilitatea de a face conținutul aplicațiilor lor mai ușor de descoperit și accesibil prin căutarea Spotlight. Noile API-uri disponibile în iOS 9 vă permit să indexați orice conținut sau starea interfeței în aplicația dvs., făcându-l accesibil utilizatorilor dvs. prin Spotlight. Cele trei componente ale acestor noi API-uri de căutare sunt:

  • NSUserActivity clasa, care este proiectat pentru vizualizarea conținutului aplicației
  • Aspectul principal cadru, care este proiectat pentru orice conținut al aplicației
  • marcaj web, conceput pentru aplicații care conțin conținut care este oglindit pe un site Web

În acest tutorial, vă voi arăta cum puteți folosi NSUserActivity clasa și Aspectul principal cadru în propriile aplicații.

Cerințe preliminare

Acest tutorial necesită să executați Xcode 7 pe OS X 10.10 sau o versiune ulterioară. Pentru a urma împreună cu mine, trebuie să descărcați și proiectul Starter de la GitHub.

1. Utilizarea NSUserActivity

În prima parte a acestui tutorial, vă voi arăta cum puteți indexa conținutul unei aplicații prin intermediul NSUserActivity clasă. Acest API este același cu cel utilizat pentru Handoff, o funcție introdusă anul trecut în iOS 8 și se ocupă de salvarea și restaurarea stării curente a aplicației.

Dacă nu ați lucrat NSUserActivity înainte, atunci vă sugerez să citiți mai întâi tutorialul meu care acoperă elementele de bază ale Handoff și NSUserActivity înainte de a continua cu aceasta.

Înainte de a scrie orice cod, deschideți proiectul de pornire și rulați aplicația în Simulatorul iOS sau pe un dispozitiv de testare. În această etapă, veți vedea că aplicația afișează pur și simplu o listă de patru emisiuni TV și o pagină detaliată pentru fiecare.

Pentru a începe, deschideți proiectul inițial și navigați la DetailViewController.swift. Inlocuieste configureView metodă a DetailViewController clasa cu următoarea implementare:

func configureView () // Actualizați interfața cu utilizatorul pentru elementul de detaliu. dacă auto.nameLabel! = nil && self.detailItem! = nil auto.nameLabel.text = detaliuItem.name self.genreLabel.text = detailItem.genre let dateFormatter = NSDateFormatter () dateFormatter.timeStyle = .ShortStyle self.timeLabel.text = dateFormatter.stringFromDate (detailItem.time) permite activitatea = NSUserActivity (activitateType: "com.tutsplus.iOS-9-Search.displayShow") activity.userInfo = ["nume": detailItem.name, "genre": detailItem.genre , "time": detailItem.time] activity.title = detaliuItem.name var keywords = detaliuItem.name.componentsSeparatedByString ("") keywords.append (detailItem.genre) activity.keywords = Set (keywords) activity.eligibleForHandoff = .eligibleForSearch = true //activity.eligibleForPublicIndexing = true //activity.expirationDate = NSDate () activity.becomeCurrent ()

Codul care configurează etichetele în controlerul de vizualizare este neschimbat, dar să trecem prin codul de activitate al utilizatorului pas cu pas:

  1. Crezi un nou NSUserActivity obiect cu identificatorul unic com.tutsplus.iOS-9-Search.displayShow. Proiectul starter a fost deja configurat pentru a utiliza acest identificator, astfel încât să nu lăsați acest identificator neschimbat.
  2. Apoi, atribuiți a userinfo dicționar la activitatea utilizatorului. Acesta va fi folosit mai târziu pentru a restabili starea aplicației.
  3. Dă-i activitatea titlu deține o valoare de șir. Aceasta este ceea ce se va afișa în rezultatele de căutare Spotlight.
  4. Pentru a vă asigura că conținutul este căutat mai mult decât titlul acestuia, furnizați și un set de cuvinte cheie. În fragmentul de cod de mai sus, setul de cuvinte cheie include fiecare cuvânt al numelui emisiunii, precum și genul său.
  5. Apoi, setați o serie de proprietăți ale NSUserActivity obiect pentru a spune sistemului de operare ce doriți să utilizați această activitate a utilizatorului. În acest tutorial, ne uităm doar la componenta de căutare a API, așa că dezactivați Ia mâna și permite căutare.
  6. În cele din urmă, apelați becomeCurrent Metoda privind activitatea utilizatorului în care punct este adăugată automat în indexul de rezultate al căutării dispozitivului.

În implementarea de mai sus, ați observat probabil cele două linii în comentarii. Deși nu vom folosi aceste proprietăți în acest tutorial, este important să știm pentru ce se utilizează fiecare proprietate.

  • Cu implementarea de mai sus, o activitate de utilizator și rezultatul căutării sunt create pentru fiecare emisiune individuală numai după ce aplicația a fost deschisă. Când faceți activitatea dvs. de utilizator eligibleForPublicIndexing, Apple începe să monitorizeze utilizarea și interacțiunea acestei activități specifice din rezultatele căutării utilizatorului. În cazul în care rezultatul căutării este angajat de mulți utilizatori, Apple promovează activitatea utilizatorului ca atare indexul cloud. Odată ce activitatea utilizatorului se află în acest index al cloudului, acesta poate fi căutat de oricine care a instalat aplicația dvs., indiferent dacă a deschis sau nu acest anumit conținut. Această proprietate ar trebui setată numai la Adevărat pentru activitățile accesibile tuturor utilizatorilor aplicației dvs..
  • O activitate de utilizator poate avea și opțional data expirării. Când această proprietate este setată, activitatea dvs. de utilizator va apărea numai în rezultatele căutării până la data specificată.

Acum că știi cum să creezi un NSUserActivity capabil să afișeze rezultatele căutării în Spotlight, sunteți gata să-l testați. Creați și rulați aplicația dvs. și deschideți câteva dintre emisiunile din aplicație. După ce ați făcut acest lucru, reveniți la ecranul de pornire (apăsați Command-Shift-H în Simulatorul iOS) și glisați în jos sau derulați până la ecranul din stânga din afară pentru a afișa vizualizarea de căutare.

Începeți să tastați titlul uneia dintre emisiunile pe care le-ați deschis și veți vedea că acestea apar în rezultatele căutării așa cum se arată mai jos.

Alternativ, introduceți genul uneia dintre emisiunile pe care le-ați deschis. Din cauza cuvintelor cheie pe care le-ați alocat activității utilizatorilor, aceasta va determina ca evenimentul să fie afișat în rezultatele căutării.

Conținutul aplicației dvs. este indexat corect de sistemul de operare și rezultatele apar în Spotlight. Cu toate acestea, când atingeți un rezultat al căutării, aplicația dvs. nu duce utilizatorul la rezultatul căutării respectiv. Ea doar lansează cererea.

Din fericire, la fel ca la Handoff, puteți folosi NSUserActivity pentru a restabili starea corectă în aplicația dvs. Pentru a face această lucrare, trebuie să implementăm două metode.

Implementați cerere (_: continueUserActivity: restorationHandler :) metodă în AppDelegate clasa, după cum se arată mai jos.

func (aplicație: UIApplication, continuUserActivity useractivitate: NSUserActivity, restorationHandler: ([AnyObject]?) -> Void) -> Bool lăsați splitController = self.window? .rootViewController as! UISplitViewController permite navigationController = splitController.viewControllers.first ca! UINavigațieController navigațieController.topViewController? .RestoreUserActivityState (userActivity) return true

Apoi, implementați restoreUserActivityState (_ :) metodă în MasterViewController clasă.

suprascrie func restoreUserActivityState (activitate: NSUserActivity) if let name = activity.userInfo? ["name"] ca? String, permiteți genului = activity.userInfo? ["Genre"] ca? String, permiteți time = activity.userInfo? ["Time"] ca? NSDate let show = Arată (numele: numele, genul: genul, timpul: timpul) self.showToRestore = arată self.performSegueWithIdentifier ("showDetail" mesaj: "Eroare la preluarea informațiilor de la userInfo: \ n \ (activity.userInfo)", preferatStyle :.Alert) alert.addAction (UIAlertAction (autocorrent: alertă, animată: adevărată, completare: nil)

La momentul redactării, ultima versiune a Xcode 7 (Beta 3) conține o problemă în care userinfo proprietatea unei activități de utilizator care poate fi restabilită poate fi goală. Acesta este motivul pentru care mă ocup de orice erori și a afișa o alertă cu userinfo care este returnat de sistemul de operare.

Construiți și rulați din nou aplicația dvs. și căutați un spectacol. Când apăsați pe un spectacol din rezultatele căutării, aplicația trebuie să vă ducă direct la controlerul de vizualizare detaliat și să afișeze informațiile actuale pentru emisiunea pe care ați primit-o.

2. Folosind cadrul Core Spotlight

Un alt set de API-uri disponibile în iOS 9 pentru a face ca conținutul dvs. să poată fi căutat de utilizatori este Aspectul principal cadru. Acest cadru are un design în stil de bază de date și vă oferă posibilitatea de a oferi mai multe informații despre conținutul pe care doriți să îl puteți căuta.

Înainte de a putea utiliza cadrul Core Spotlight, trebuie să conectăm proiectul cu cadrul. În Project Navigator, selectați proiectul și deschideți Construiți faze în partea de sus. Apoi, extindeți Link binar cu biblioteci și faceți clic pe butonul plus. În meniul care apare, căutați CoreSpotlight și conectați-vă proiectul la acest cadru. Repetați acești pași pentru MobileCoreServices cadru.

Apoi, pentru a vă asigura că rezultatele căutării oferite de aplicația noastră provin de la Core Spotlight, ștergeți aplicația de pe dispozitivul dvs. de testare sau simulatorul iOS și comentați următorul rând în DetailViewController clasă:

activity.becomeCurrent ()

În cele din urmă, deschisă MasterViewController.swift și adăugați următoarele rânduri înainte de Spectacol definiția structurii:

import CoreSpotlight import MobileCoreServices

Apoi, adăugați următorul cod la viewDidLoad metodă a MasterViewController clasă:

var searchableItems: [CSSearchableItem] = [] pentru a fi afișat în obiecte let attributeSet = CSSearchableItemAttributeSet (itemContentType: kUTTypeItem ca șir) attributeSet.title = show.name date dateFormatter = NSDateFormatter () dateFormatter.timeStyle = .ShortStyle attributeSet.contentDescription = genul + "\ n" + dateFormatter.stringFromDate (show.time) var cuvinte cheie = show.name.componentsSeparatedByString ("") keywords.append (show.genre) attributeSet.keywords = keywords let item = CSSearchable (uniqueIdentifier: , domainIdentifier: "tv-shows", attributeSet: attributeSet) searchableItems.append (item) CSSearchableIndex.defaultSearchableIndex () .indexSearchableItems (searchableItems) (error) ) altfel // Elementele au fost indexate cu succes

Înainte de a testa acest cod, hai să trecem prin fiecare pas al lui pentru buclă.

  1. Creați a CSSearchableItemAttributeSet obiect, trecând în a tipul de conținut pentru element. În cazul în care rezultatul căutării dvs. face legătura cu o fotografie, de exemplu, ați trece kUTTypeImage constant.
  2. Atribuiți numele emisiunii la titlu proprietatea setului de atribute. Ca și cu NSUserActivity, acest titlu este ceea ce va apărea în partea de sus a rezultatelor căutării dvs..
  3. Apoi, creați un șir descriptiv și alocați-i acestuia contentDescrierea proprietatea setului de atribute care pot fi căutate. Acest șir va fi afișat sub titlul de rezultat în Spotlight.
  4. Creați o serie de cuvinte cheie din rezultatul căutării, la fel cum ați procedat NSUserActivity.
  5. În cele din urmă, creați o CSSearchableItem cu un identificator de element unic, un identificator de domeniu unic pentru gruparea elementelor împreună și un set de atribute. Spre deosebire de NSUserActivity, care returnează activitatea utilizatorilor din rezultatul căutării, identificatorii unici pe care îi folosiți pentru a CSSearchableItem sunt singurele informații pe care le primiți din sistemul de operare atunci când rezultatul căutării dvs. este selectat de utilizator. Trebuie să utilizați acești identificatori pentru a restaura aplicația în starea corectă.

Odată ce ați creat o CSSearchableItem pentru emisiunile TV, le indexați folosind indexSearchableItems (_: completionHandler :) metoda implicită CSSearchableIndex obiect.

Construiți și difuzați aplicația dvs., iar toate emisiunile dvs. vor fi indexate de Spotlight. Navigați la vizualizarea de căutare și căutați una dintre emisiuni.

Rezultatele căutării Spotlight sunt tratate prin aceleași metode ca și cele de la NSUserActivity, dar procesul este ușor diferit. Când un CSSearchableItem este selectat din rezultatele căutării, sistemul creează un NSUserActivity obiect pentru dvs. care conține identificatorul unic al elementului selectat.

În delegatul aplicației cerere (_: continueUserActivity: restorationHandler :) , puteți utiliza următoarea implementare pentru a prelua informațiile de care aveți nevoie dintr-un rezultat al căutării Core Spotlight:

dacă userActivity.activityType == CSSearchableItemActionType dacă permite identificator = userActivity.userInfo? [CSSearchableItemActivityIdentifier] ca? String // Utilizați identificatorul pentru a afișa conținutul corect pentru acest rezultat de căutare return true

O bună practică atunci când indexați conținut din aplicația dvs. cu cadrul Core Spotlight este de asemenea să ștergeți articolele atunci când nu mai sunt necesare. CSSearchableIndex clasa oferă trei metode de ștergere a elementelor care pot fi căutate:

  • deleteAllSearchableItemsWithCompletionHandler (_ :)
  • deleteSearchableItemsWithDomainIdentifiers (_: completionHandler :)
  • deleteSearchableItemsWithIdentifiers (_: completionHandler :)

De exemplu, adăugați următorul cod la sfârșitul secțiunii viewDidLoad metodă a MasterViewController clasă:

CSSearchableIndex.defaultSearchableIndex () deleteSearchableItemsWithDomainIdentifiers (["tv-shows"]) (eroare) -> Void în cazul în care eroare! = Nil print (error? .LocalizedDescription) altceva // Elementele au fost șterse cu succes

Construiți și rulați aplicația încă o dată. Când încercați să căutați oricare dintre emisiunile dvs., nu se întoarce rezultate, deoarece au fost șterse din index.

3. Combinarea NSUserActivity și Spot Spotlight

O altă adăugare nouă în NSUserActivity clasa în iOS 9 este contentAttributeSet proprietate. Această proprietate vă permite să atribuiți CSSearchableItemAttributeSet, la fel ca cele pe care le-ai creat mai devreme. Acest set de atribute vă permite să obțineți rezultatele căutării NSUserActivity obiecte pentru a afișa aceleași detalii de detaliu ca și rezultatele căutării Core Spotlight.

Începeți prin adăugarea următoarelor importuri în partea de sus a paginii DetailViewController.swift:

import CoreSpotlight import MobileCoreServices

Apoi, actualizați configureView metodă în DetailViewController clasa cu următoarea implementare:

func configureView () // Actualizați interfața cu utilizatorul pentru elementul de detaliu. dacă auto.nameLabel! = nil && self.detailItem! = nil auto.nameLabel.text = detaliuItem.name self.genreLabel.text = detailItem.genre let dateFormatter = NSDateFormatter () dateFormatter.timeStyle = .ShortStyle self.timeLabel.text = dateFormatter.stringFromDate (detailItem.time) permite activitatea = NSUserActivity (activitateType: "com.tutsplus.iOS-9-Search.displayShow") activity.userInfo = ["nume": detailItem.name, "genre": detailItem.genre , "time": detailItem.time] activity.title = detaliuItem.name var keywords = detaliuItem.name.componentsSeparatedByString ("") keywords.append (detailItem.genre) activity.keywords = Set (keywords) activity.eligibleForHandoff = .eligibleForSearch = adevărat //activity.eligibleForPublicIndexing = true //activity.expirationDate = NSDate () permite attributeSet = CSSearchableItemAttributeSet (itemContentType: kUTTypeItem ca șir) attributeSet.title = detailItem.name attributeSet.contentDescription = detailItem.genre + "\ n" + dateFormatter.stringFromDate (detailItem.t ime) activity.becomeCurrent ()

Construiți și rulați aplicația dvs. pentru o ultimă oară și deschideți câteva dintre emisiunile dvs. Când căutați acum un spectacol, veți vedea că rezultatele dvs., create cu NSUserActivity, conțin același nivel de detaliu ca și rezultatele căutării Core Spotlight.

Concluzie

În acest tutorial, ați învățat cum să faceți conținutul aplicației dvs. accesibil prin iOS Spotlight utilizând NSUserActivity clasa și Aspectul principal cadru. De asemenea, v-am arătat cum să indexați conținutul din aplicația dvs. folosind ambele API-uri și cum să restaurați starea aplicației dvs. atunci când un rezultat al căutării este selectat de utilizator.

Noile API-uri de căutare introduse cu iOS 9 sunt foarte ușor de utilizat și fac ca conținutul aplicației să fie mai ușor de descoperit și mai accesibil utilizatorilor aplicației. Ca întotdeauna, dacă aveți orice comentarii sau întrebări, lăsați-le în comentariile de mai jos.

Cod