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În acest tutorial, vă voi arăta cum puteți folosi NSUserActivity
clasa și Aspectul principal cadru în propriile aplicații.
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.
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:
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.userinfo
dicționar la activitatea utilizatorului. Acesta va fi folosit mai târziu pentru a restabili starea aplicației.titlu
deține o valoare de șir. Aceasta este ceea ce se va afișa în rezultatele de căutare Spotlight.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.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.
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..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.
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ă.
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.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..contentDescrierea
proprietatea setului de atribute care pot fi căutate. Acest șir va fi afișat sub titlul de rezultat în Spotlight.NSUserActivity
.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.
NSUserActivity
și Spot SpotlightO 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.
Î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.