iOS 9: Innføring Søk APIs

iOS 9: presenterer søke APIer Book 23
Del
2
Del

Dette Cyber ​​mandag Envato Tuts + kursene vil bli redusert til bare $ 3. Ikke gå glipp av.

Innledning

På WWDC 2015, Apple offisielt annonsert iOS 9. I tillegg til mange nye funksjoner og forbedringer, denne oppdateringen gir også utviklere muligheten til å gjøre innholdet i sine apps mer synlig og tilgjengelig gjennom Spotlight-søk. Nye API tilgjengelig i iOS 9 tillate deg å indeksere innhold eller grensesnitt stat i programmet ditt, noe som gjør den tilgjengelig for brukerne gjennom Spotlight. De tre komponentene i disse nye søke APIene er:

den NSUserActivity klassen, som er designet for sett appinnholdet

Core Spotlight rammeverk, som er utviklet for enhver app innhold

web markup, designet for applikasjoner som har innhold som speiles på en nettside

i denne opplæringen, skal jeg vise deg hvordan du kan bruke NSUserActivity klasse og Core Spotlight rammeverk i dine egne applikasjoner.

Forutsetninger

Denne opplæringen forutsetter at du kjører Xcode 7 på OS X 10.10 eller senere. For å følge meg, må du også laste ned starter prosjektet fra GitHub.

1. Bruke NSUserActivity

I den første delen av denne opplæringen, skal jeg vise deg hvordan du kan indeksere en app innhold gjennom NSUserActivity klassen. Dette API er den samme som brukes for Handoff, en funksjon som ble introdusert i iOS 8 i fjor, og håndterer både lagring og gjenoppretting av en søknad nåværende tilstand.

Hvis du ikke har jobbet med NSUserActivity før, så foreslår jeg du først lese min min tutorial som dekker det grunnleggende Handoff og NSUserActivity før du fortsetter med denne.

før skrive kode, åpner du starter prosjektet og kjøre app i iOS Simulator eller på en testenhet. På dette stadiet, vil du se at programmet bare viser en liste over fire TV-programmer og en detaljsiden for hver enkelt.

For å begynne, åpner du starter prosjektet og navigere til DetailViewController.swift. Bytt configureView metoden i DetailViewController klassen med følgende gjennomføring:
func configureView () {//Oppdater brukergrensesnitt for detaljelementet. hvis self.nameLabel = null &! & self.detailItem! = null {self.nameLabel.text = detailItem.name self.genreLabel.text = detailItem.genre la dateFormatter = NSDateFormatter () dateFormatter.timeStyle = .ShortStyle self.timeLabel.text = dateFormatter.stringFromDate (detailItem.time ) la aktivitet = NSUserActivity (activityType: "com.tutsplus.iOS-9-Search.displayShow") activity.userInfo = [ "navn": detailItem.name, "genre": detailItem.genre, "tid": detailItem.time ] activity.title = detailItem.name Var ordene = detailItem.name.componentsSeparatedByString ( "") keywords.append (detailItem.genre) activity.keywords = Set (søkeord) activity.eligibleForHandoff = false activity.eligibleForSearch = true //aktivitet. eligibleForPublicIndexing = true //activity.expirationDate = NSDate () activity.becomeCurrent ()}}

koden som konfigurerer etikettene i visningen kontrolleren er uendret, men la oss gå gjennom brukeraktivitet koden steg for steg:


    Du oppretter en ny NSUserActivity objekt med unike ID com.tutsplus.iOS-9-Search.displayShow. Den starter prosjektet allerede er konfigurert for å bruke denne identifikatoren så sørg for å forlate Denne identifikatoren uendret.
  1. Du kan deretter tildele en userinfo ordbok til brukeraktivitet. Dette vil bli brukt senere for å gjenopprette tilstanden til programmet.
  2. Du gir aktiviteten tittel eiendommen en strengverdi. Dette er hva som vil dukke opp i Spotlight-søkeresultater.
  3. For å sikre at innholdet er søkbar for mer enn bare tittelen, du også gi et sett med søkeord. I ovennevnte kodebiten, sett med søkeord omfatter hvert ord av seriens navn samt sin sjanger.
  4. Deretter setter du en rekke egenskaper for NSUserActivity objekt å fortelle operativsystemet hva du vil at denne brukeraktivitet som skal brukes for. I denne opplæringen, vi bare ser på søke komponent av API slik at vi deaktivere Handoff og aktivere søk.
  5. Til slutt, kaller du becomeCurrent metoden på brukeraktivitet på hvilket tidspunkt det blir automatisk lagt til enhetens indeks av søkeresultatene.

    i over gjennomføringen, har du sannsynligvis lagt merke til de to linjene i kommentarene. Selv om vi ikke skal bruke disse egenskapene i denne opplæringen, er det viktig å vite hva hver eiendom brukes til.

  6. Med over gjennomføringen, en brukeraktivitet og søkeresultat opprettes for hver enkelt utstilling bare når søknaden er åpnet. Når du gjør din brukeraktivitet eligibleForPublicIndexing begynner Apple å overvåke bruken og samspillet av denne aktiviteten fra brukerens søkeresultatene. Hvis søkeresultat er engasjert av mange brukere, fremmer Apple brukeraktiviteten til sin egen sky indeksen. Når brukeren aktivitet er i denne skyen indeksen, er det søkbart av alle som har installert programmet, uavhengig av om de har åpnet den aktuelle innhold eller ikke. Denne egenskapen skal bare settes til true for aktiviteter som er tilgjengelig for alle brukere av programmet.
  7. En bruker aktivitet kan også ha en valgfri EXPIRATIONDATE. Når denne egenskapen er satt, vil din brukeraktivitet bare dukke opp i søkeresultatet opp til oppgitt dato.

    Nå som du vet hvordan du oppretter en NSUserActivity stand til å vise søkeresultatene i Spotlight, er du klar til å teste det ut. Bygge og drive din app, og åpne opp noen av de viser i søknaden din. Når du har gjort dette, kan du gå tilbake til startskjermen (trykk Kommando-Skift-H i iOS Simulator) og sveipe ned eller bla helt til venstre skjermen for å få opp søkevisningen.

    Begynn å skrive inn tittelen på en av de viser at du åpnet, og du vil se at det dukker opp i søkeresultatene som vist nedenfor.

    det kan også oppgis sjangeren ett av programmene du har åpnet. På grunn av de søkeordene som du tilordnet brukeraktivitet, vil dette også føre til showet for å bli oppført i søkeresultatene.

    Programmet innhold er riktig indeksert av operativsystemet og resultatene dukker opp i Spotlight. Men når du trykker på et søkeresultat, søknaden din ikke tar brukeren til den respektive søkeresultatet. Det bare lanserer programmet.

    Heldigvis, som med Handoff, kan du bruke NSUserActivity klassen for å gjenopprette riktig staten i programmet. For å gjøre dette arbeidet trenger vi å gjennomføre to metoder

    Implementere programmet (_. ContinueUserActivity: restorationHandler :) metoden i AppDelegate klassen som vist nedenfor
    func program (søknad. UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: (? [AnyObject]) - > Void) - > Bool {la splitController = self.window? .rootViewController Som! UISplitViewController la navigationController = splitController.viewControllers.first som! ? UINavigationController navigationController.topViewController .restoreUserActivityState (userActivity) return true}

    Deretter implementere restoreUserActivityState (_ :) metoden i MasterViewController klassen
    styre func restoreUserActivityState (aktivitet. NSUserActivity) {if la name = activity.userInfo ? [ "navn"] som? String, la sjanger = activity.userInfo? [ "Sjanger"] som? String, la tiden = activity.userInfo? [ "Tid"] som? NSDate {la showet = Show (navn: navn, sjanger: sjanger, tid: tid) self.showToRestore = vis self.performSegueWithIdentifier ( "showDetail", avsender: selv)} else {la alert = UIAlertController (tittel: "Feil", meldingen: "Feil ved henting av informasjon fra Userinfo: \\ n \\ (activity.userInfo)", preferredStyle: .alert) alert.addAction (UIAlertAction (tittel: «Avvis», stil: .Cancel, handler: null)) self.presentViewController ( varsling, animert: true, ferdigstillelse: null)}}

    i skrivende stund, den nyeste versjonen av Xcode 7 (Beta 3) inneholder et problem der Userinfo tilhører en brukeraktivitet blir gjenopprettet kan være tom. Det er derfor jeg håndtere eventuelle feil og vise et varsel med userinfo som returneres av operativsystemet.

    Bygg og kjøre programmet på nytt, og søk etter et show. Når du trykker på et show i søkeresultatene, bør applikasjonen ta deg rett til detaljvisning kontrolleren og vise aktuell informasjon for showet du pekte på.

    2. Ved hjelp av Core Spotlight Work

    Et annet sett med APIer tilgjengelig i iOS 9 å gjøre innholdet søkbart for brukerne er Core Spotlight rammeverket. Dette rammeverket har en database-stil design og lar deg gi enda mer informasjon om innholdet som du ønsker å være søkbar.

    Før du kan bruke Core Spotlight rammeverk, trenger vi å knytte prosjektet mot rammen. I prosjekt Navigator, velger du prosjektet og åpne fanen Bygg Faser på toppen. Deretter utvide Link Binary med biblioteker og klikk på pluss-knappen. I menyen som vises, søke etter CoreSpotlight og knytte prosjektet mot rammen. Gjenta disse trinnene for MobileCoreServices rammeverket.

    Neste, for å sikre at søkeresultatet vår app gir er fra Kjernen Spotlight, slette app fra test enheten eller iOS Simulator og kommentere ut følgende linje i DetailViewController klasse:
    activity.becomeCurrent ()

    til slutt, åpen MasterViewController.swift og legge til følgende linjer før showet struktur definisjon:
    import CoreSpotlightimport MobileCoreServices

    Deretter legger du til følgende kode i viewDidLoad metoden de MasterViewController klasse:
    Var searchableItems: [CSSearchableItem] = [] for showet i objektene {la attributeSet = CSSearchableItemAttributeSet (itemContentType: kUTTypeItem som String) attributeSet.title = show.name la dateFormatter = NSDateFormatter () dateFormatter.timeStyle =. ShortStyle attributeSet.contentDescription = show.genre + "\\ n" + dateFormatter.stringFromDate (show.time) Var ordene = show.name.componentsSeparatedByString ( "") keywords.append (show.genre) attributeSet.keywords = ordene la element = CSSearchableItem (uniqueIdentifier: show.name, domainIdentifier: "tv-show", attributeSet: attributeSet) searchableItems.append(item)}CSSearchableIndex.defaultSearchableIndex().indexSearchableItems(searchableItems) {(Feil) - > Void inn hvis feil! = Null {print (feil .localizedDescription?)} Else {//Elementer ble indeksert vellykket}}

    Før vi teste denne koden, la oss gå gjennom hvert trinn i for loop.


      Du oppretter en CSSearchableItemAttributeSet objekt, passerer i en innholdstype for varen. Dersom søkeresultatet linker til et bilde, for eksempel, ville du passere i kUTTypeImage konstant.
    1. Du tilordner seriens navn til tittelen tilhører attributtet satt. Akkurat som med NSUserActivity, er denne tittelen hva som vil vises på toppen av søkeresultatene.
    2. Deretter oppretter du en beskrivende streng og overlate dette til content tilhører din søkbar attributt satt. Denne strengen vises under resultatet tittel i Spotlight.
    3. Du oppretter en rekke søkeord danne søkeresultat akkurat som du gjorde med NSUserActivity.
    4. Til slutt legger du inn en CSSearchableItem med en unik element identifikator, unik domeneidentifikatoren å gruppere elementer sammen, og et attributt satt. I motsetning til med NSUserActivity, som returnerer brukeraktiviteten fra søkeresultatet, de unike identifikatorer som du bruker for en CSSearchableItem er den eneste informasjonen som du mottar fra operativsystemet når søkeresultat er valgt av brukeren. Du må bruke disse identifikatorene for å gjenopprette app tilbake til riktig tilstand

      Når du har opprettet en CSSearchableItem for TV-programmer, du indekserer dem ved hjelp av indexSearchableItems (_. CompletionHandler :) metoden på standard CSSearchableIndex objektet.

      Bygg og kjøre programmet ditt, og alle dine programmer vil bli indeksert av Spotlight. Gå til søke visning og søk etter en av de viser.

      Kjerne Spotlight-søkeresultater behandles av de samme metodene som de fra NSUserActivity, men prosessen er litt annerledes. Når en CSSearchableItem er valgt fra søkeresultatene, oppretter systemet et NSUserActivity objekt for deg som inneholder en unik identifikator for det valgte elementet

      I appdelegate søknad (_. ContinueUserActivity: restorationHandler :) metoden, du kan bruke følgende gjennomføring for å hente den informasjonen du trenger fra en Core Spotlight søkeresultat:
      hvis userActivity.activityType == CSSearchableItemActionType {if la identifikator = userActivity.userInfo [CSSearchableItemActivityIdentifier] som? String {//Bruk identifikator for å vise riktig innhold for denne søkeresultat return true}}

      En god praksis når de indekserer innhold fra app med Core Spotlight rammeverket skal også slette elementer når de ikke lenger er nødvendig. Den CSSearchableIndex klassen gir tre metoder for å slette søkbar items:


      deleteAllSearchableItemsWithCompletionHandler(_:)

      deleteSearchableItemsWithDomainIdentifiers(_:completionHandler:)

      deleteSearchableItemsWithIdentifiers(_:completionHandler:)

      As et eksempel legge til følgende kode i slutten av viewDidLoad metoden i MasterViewController class:
      CSSearchableIndex.defaultSearchableIndex().deleteSearchableItemsWithDomainIdentifiers(["tv-shows"]) {(Feil) - > Ugyldig i Hvis {(.localizedDescription feil?) Print} feil! = Null else {//Elementer ble slettet}}

      Bygg og kjøre programmet ditt en gang til. Når du prøver å søke etter noen av dine viser, er ingen resultater returneres, fordi de har blitt slettet fra indeksen.

      3. Kombinere NSUserActivity og Core Spotlight

      Et annet nytt tillegg til NSUserActivity klasse i iOS 9 er contentAttributeSet eiendom. Denne egenskapen gjør det mulig å tildele en CSSearchableItemAttributeSet, akkurat som de du opprettet tidligere. Dette attributtet sett gjør at søkeresultatene for NSUserActivity objekter for å vise den samme mengden detaljer som kjerne Spotlight søkeresultater

      Start med å legge til følgende import på toppen av DetailViewController.swift.
      Import CoreSpotlightimport MobileCoreServices < p> Deretter oppdatere configureView metoden i DetailViewController klassen med følgende gjennomføring:
      func configureView () {//Oppdater brukergrensesnitt for detaljelementet. hvis self.nameLabel = null &! & self.detailItem! = null {self.nameLabel.text = detailItem.name self.genreLabel.text = detailItem.genre la dateFormatter = NSDateFormatter () dateFormatter.timeStyle = .ShortStyle self.timeLabel.text = dateFormatter.stringFromDate (detailItem.time ) la aktivitet = NSUserActivity (activityType: "com.tutsplus.iOS-9-Search.displayShow") activity.userInfo = [ "navn": detailItem.name, "genre": detailItem.genre, "tid": detailItem.time ] activity.title = detailItem.name Var ordene = detailItem.name.componentsSeparatedByString ( "") keywords.append (detailItem.genre) activity.keywords = Set (søkeord) activity.eligibleForHandoff = false activity.eligibleForSearch = true //aktivitet. eligibleForPublicIndexing = true //activity.expirationDate = NSDate () la attributeSet = CSSearchableItemAttributeSet (itemContentType: kUTTypeItem som String) attributeSet.title = detailItem.name attributeSet.contentDescription = detailItem.genre + "\\ n" + dateFormatter.stringFromDate (detailItem.time ) activity.becomeCurrent ()}}

      Bygg og kjøre programmet ditt en siste gang, og åpne noen av dine show. Når du nå søke for et show, vil du se at resultatene dine, skapt med NSUserActivity, inneholder den samme detaljnivå som kjernen Spotlight-søkeresultater.

      Konklusjon

      I denne opplæringen du lærte å lage programmets innhold tilgjengelig via iOS Spotlight ved hjelp av NSUserActivity klasse og Core Spotlight rammeverket. Jeg viste deg også hvordan å indeksere innhold fra din søknad ved hjelp av både APIer og hvordan du kan gjenopprette programmets tilstand når et søkeresultat er valgt av brukeren.

      Den nye søke APIer introdusert med iOS 9 er svært enkel å bruke og gjøre programmets innhold lettere å oppdage og mer tilgjengelig for programmets brukere. Som alltid, hvis du har noen kommentarer eller spørsmål, la dem i kommentarfeltet nedenfor.