iOS 9 Introductie van zoek-API's

Invoering

Op WWDC 2015 heeft Apple officieel aangekondigd iOS 9. Naast veel nieuwe functies en verbeteringen biedt deze update ontwikkelaars ook de mogelijkheid om de inhoud van hun apps beter vindbaar en toegankelijk te maken via Spotlight-zoekopdrachten. Met nieuwe API's die beschikbaar zijn in iOS 9, kunt u elke inhoud of interfacestatus in uw app indexeren en via Spotlight toegankelijk maken voor uw gebruikers. De drie componenten van deze nieuwe zoek-API's zijn:

  • de NSUserActivity klasse, die is ontworpen voor bekeken app-inhoud
  • de Core Spotlight kader, dat is ontworpen voor elke app-inhoud
  • web-markup, ontworpen voor apps met inhoud die op een website wordt gespiegeld

In deze zelfstudie laat ik je zien hoe je de kunt gebruiken NSUserActivity klasse en de Core Spotlight kader in uw eigen toepassingen.

voorwaarden

Voor deze zelfstudie is vereist dat u Xcode 7 gebruikt in OS X 10.10 of hoger. Om met mij mee te gaan, moet je ook het startersproject van GitHub downloaden.

1. Met behulp van NSUserActivity

In het eerste deel van deze zelfstudie laat ik je zien hoe je de inhoud van een app kunt indexeren via de NSUserActivity klasse. Deze API is dezelfde die wordt gebruikt voor Handoff, een functie die vorig jaar werd geïntroduceerd in iOS 8 en zorgt voor zowel het opslaan als herstellen van de huidige status van een applicatie.

Als je niet hebt gewerkt NSUserActivity voor, dan stel ik voor dat je eerst mijn mijn tutorial leest die de basisprincipes van Handoff en behandelt NSUserActivity alvorens verder te gaan met deze.

Open, voordat u een code schrijft, het startersproject en voer de app uit in de iOS Simulator of op een testapparaat. In dit stadium ziet u dat de app eenvoudig een lijst met vier tv-shows en een detailpagina voor elke tv weergeeft.

Om te beginnen, open het startersproject en navigeer naar DetailViewController.swift. Vervang de configureView methode van de DetailViewController klasse met de volgende implementatie:

func configureView () // Update de gebruikersinterface voor het detailitem. if self.nameLabel! = nil && self.detailItem! = nil self.nameLabel.text = detailItem.name self.genreLabel.text = detailItem.genre laat dateFormatter = NSDateFormatter () dateFormatter.timeStyle = .ShortStyle self.timeLabel.text = dateFormatter.stringFromDate (detailItem.time) laat activity = NSUserActivity (activityType: "com.tutsplus.iOS-9-Search.displayShow") activity.userInfo = ["name": detailItem.name, "genre": detailItem.genre , "time": detailItem.time] activity.title = detailItem.name var keywords = detailItem.name.componentsSeparatedByString ("") keywords.append (detailItem.genre) activity.keywords = Set (keywords) activity.eligibleForHandoff = false activity .eligibleForSearch = true //activity.eligibleForPublicIndexing = true //activity.expirationDate = NSDate () activity.becomeCurrent ()

De code die de labels in de view-controller configureert, blijft ongewijzigd, maar laten we de gebruikersactiviteitcode stap voor stap doorlopen:

  1. U maakt een nieuwe NSUserActivity object met de unieke ID com.tutsplus.iOS-9-Search.displayShow. Het startproject is al geconfigureerd om deze ID te gebruiken, dus zorg ervoor dat dit ID ongewijzigd blijft.
  2. U wijst vervolgens een gebruikers informatie woordenboek voor de gebruikersactiviteit. Dit wordt later gebruikt om de status van de toepassing te herstellen.
  3. Jij geeft de activiteiten titel eigenschap een tekenreekswaarde. Dit wordt weergegeven in de Spotlight-zoekresultaten.
  4. Om ervoor te zorgen dat de inhoud door meer dan alleen de titel kan worden doorzocht, geeft u ook een reeks zoekwoorden op. In het bovenstaande codefragment bevat de set trefwoorden elk woord van de naam van de show, evenals het bijbehorende genre.
  5. Vervolgens stelt u een aantal eigenschappen van de NSUserActivity object om aan het besturingssysteem te vertellen waarvoor u deze gebruikersactiviteit wilt gebruiken. In deze zelfstudie kijken we alleen naar de zoekcomponent van de API zodat we deze uitschakelen Afgeven en inschakelen zoeken.
  6. Eindelijk, bel je de becomeCurrent methode voor de gebruikersactiviteit, waarna deze automatisch wordt toegevoegd aan de index van de zoekresultaten van het apparaat.

In de bovenstaande implementatie heb je waarschijnlijk de twee regels opgemerkt in reacties. Hoewel we deze eigenschappen niet in deze zelfstudie gebruiken, is het belangrijk om te weten voor elke eigenschap.

  • Met de bovenstaande implementatie worden een gebruikersactiviteit en zoekresultaat voor elke individuele show pas gemaakt nadat de toepassing is geopend. Wanneer u uw gebruikersactiviteit uitvoert eligibleForPublicIndexing, Apple begint het gebruik en de interactie van deze specifieke activiteit te volgen vanuit de zoekresultaten van de gebruiker. Als het zoekresultaat door veel gebruikers wordt gebruikt, promoot Apple de gebruikersactiviteit naar die van hemzelf cloud index. Zodra de gebruikersactiviteit zich in deze cloudindex bevindt, is deze doorzoekbaar voor iedereen die uw app heeft geïnstalleerd, ongeacht of ze die specifieke inhoud hebben geopend of niet. Deze eigenschap moet alleen worden ingesteld op waar voor activiteiten die toegankelijk zijn voor alle gebruikers van uw applicatie.
  • Een gebruikersactiviteit kan ook een optionele activiteit hebben uiterste houdbaarheidsdatum. Wanneer deze eigenschap is ingesteld, wordt uw gebruikersactiviteit pas in de zoekresultaten weergegeven tot de opgegeven datum.

Nu je weet hoe je een NSUserActivity in staat om zoekresultaten weer te geven in Spotlight, bent u klaar om het uit te testen. Bouw en run uw app en open een paar van de shows in uw applicatie. Zodra u dit hebt gedaan, gaat u terug naar het startscherm (druk op Command-Shift-H in de iOS Simulator) en veeg omlaag of scrol naar het scherm uiterst links om de zoekweergave te openen.

Begin met het typen van de titel van een van de shows die u hebt geopend en u zult zien dat deze wordt weergegeven in de zoekresultaten, zoals hieronder wordt weergegeven.

Je kunt ook het genre van een van de shows die je hebt geopend invoeren. Vanwege de zoekwoorden die u aan de gebruikersactiviteit hebt toegewezen, zorgt dit er ook voor dat de show wordt weergegeven in de zoekresultaten.

De inhoud van uw toepassing is correct geïndexeerd door het besturingssysteem en de resultaten verschijnen in Spotlight. Wanneer u echter op een zoekresultaat tikt, neemt uw toepassing de gebruiker niet naar het betreffende zoekresultaat. Het lanceert alleen de applicatie.

Gelukkig, net als bij Handoff, kun je de NSUserActivity klasse om de juiste status in uw toepassing te herstellen. Om dit te laten werken, moeten we twee methoden implementeren.

Implementeer de applicatie (_: continueUserActivity: restorationHandler :) methode in de AppDelegate klasse zoals hieronder getoond.

func applicatie (toepassing: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]?) -> Void) -> Bool let splitController = self.window?. RootViewController as! UISplitViewController laat navigationController = splitController.viewControllers.first as! UINavigationController navigationController.topViewController? .RestoreUserActivityState (userActivity) return true

Implementeer vervolgens de restoreUserActivityState (_ :) methode in de MasterViewController klasse.

override func restoreUserActivityState (activiteit: NSUserActivity) if let name = activity.userInfo? ["name"] as? String, laat genre = activity.userInfo? ["Genre"] zoals? String, let time = activity.userInfo? ["Time"] as? NSDate let show = Show (naam: naam, genre: genre, tijd: tijd) self.showToRestore = toon self.performSegueWithIdentifier ("showDetail", afzender: self) else let alert = UIAlertController (title: "Error", bericht: "Fout bij het ophalen van informatie van userInfo: \ n \ (activity.userInfo)", preferredStyle: .Alert) alert.addAction (UIAlertAction (title: "Dismiss", style: .Cancel, handler: nil)) self.presentViewController ( alert, geanimeerd: true, completion: nil)

Op het moment van schrijven bevat de nieuwste versie van Xcode 7 (Beta 3) een probleem waarbij de gebruikers informatie eigenschap van een gebruikersactiviteit die wordt hersteld, kan leeg zijn. Dat is de reden waarom ik fouten behandel en een waarschuwing weergeef met de gebruikers informatie dat wordt geretourneerd door het besturingssysteem.

Bouw en voer je app opnieuw uit en zoek naar een programma. Wanneer u in de zoekresultaten op een voorstelling tikt, moet de app u rechtstreeks naar de detailweergavecontroller brengen en de huidige informatie weergeven voor de show die u hebt bekeken.

2. Gebruik van het Core Spotlight Framework

Een andere reeks API's beschikbaar in iOS 9 om uw inhoud doorzoekbaar te maken voor gebruikers is de Core Spotlight kader. Dit framework heeft een database-achtig ontwerp en biedt u nog meer informatie over de inhoud die u doorzoekbaar wilt maken.

Voordat u het Core Spotlight-framework kunt gebruiken, moeten we het project koppelen aan het framework. In de Project Navigator, selecteer het project en open de Bouw fases tab bovenaan. Breid vervolgens de uit Binaire koppeling met bibliotheken sectie en klik op de plusknop. Zoek in het menu dat verschijnt CoreSpotlight en koppel uw project aan het framework. Herhaal deze stappen voor de MobileCoreServices kader.

Vervolgens zorgt u ervoor dat de zoekresultaten die onze app biedt afkomstig zijn van Core Spotlight, uw app van uw testapparaat of de iOS-simulator verwijderen en een commentaar geven op de volgende regel in de DetailViewController klasse:

activity.becomeCurrent ()

Eindelijk, open MasterViewController.swift en voeg de volgende regels toe vóór de Laten zien structuur definitie:

importeer CoreSpotlight importeer MobileCoreServices

Voeg vervolgens de volgende code toe aan de viewDidLoad methode van de MasterViewController klasse:

var searchableItems: [CSSearchableItem] = [] voor show in objecten let attributeSet = CSSearchableItemAttributeSet (itemContentType: kUTTypeItem as String) attributeSet.title = show.name let dateFormatter = NSDateFormatter () dateFormatter.timeStyle = .ShortStyle attributeSet.contentDescription = show. genre + "\ n" + dateFormatter.stringFromDate (show.time) var keywords = show.name.componentsSeparatedByString ("") keywords.append (show.genre) attributeSet.keywords = trefwoorden let item = CSSearchableItem (uniqueIdentifier: show.name , domainIdentifier: "tv-shows", attributeSet: attributeSet) searchableItems.append (item) CSSearchableIndex.defaultSearchableIndex (). indexSearchableItems (searchableItems) (error) -> Void in if error! = nil print (error? .localizedDescription ) else // Items zijn succesvol geïndexeerd

Voordat we deze code testen, gaan we door elke stap van de voor lus.

  1. Je maakt een CSSearchableItemAttributeSet object, passeren in een inhoudstype voor het item. Als uw zoekresultaten naar een foto linken, kunt u bijvoorbeeld de kUTTypeImage constante.
  2. U wijst de naam van de show toe aan de titel eigenschap van de attributenset. Net zoals met NSUserActivity, deze titel staat bovenaan de zoekresultaten.
  3. Vervolgens maakt u een beschrijvende reeks en wijst u deze toe aan de Inhoudsbeschrijving eigenschap van uw doorzoekbare kenmerkenset. Deze reeks wordt onder Spotlight in de titel van het resultaat weergegeven.
  4. U maakt een reeks trefwoorden uit het zoekresultaat, net zoals u deed met NSUserActivity.
  5. Ten slotte maak je een CSSearchableItem met een uniek item-ID, uniek domein-ID voor groepsitems samen en een attributenset. In tegenstelling tot NSUserActivity, die de gebruikersactiviteit uit het zoekresultaat retourneert, de unieke ID's die u gebruikt voor een CSSearchableItem zijn de enige informatie die u van het besturingssysteem ontvangt wanneer uw zoekresultaat door de gebruiker is geselecteerd. U moet deze ID's gebruiken om uw app terug in de juiste staat te herstellen.

Als je eenmaal een hebt gemaakt CSSearchableItem voor de tv-programma's indexeert u ze met behulp van de indexSearchableItems (_: completionHandler :) methode op de standaard CSSearchableIndex voorwerp.

Bouw en voer uw app uit, en al uw shows worden geïndexeerd door Spotlight. Navigeer naar de zoekweergave en zoek naar een van de shows.

Core Spotlight-zoekresultaten worden behandeld met dezelfde methoden als die uit NSUserActivity, maar het proces is iets anders. Wanneer een CSSearchableItem wordt geselecteerd uit de zoekresultaten, het systeem maakt een NSUserActivity object voor u dat het unieke ID van het geselecteerde item bevat.

In de delegaties van je app applicatie (_: continueUserActivity: restorationHandler :) methode, kunt u de volgende implementatie gebruiken om de benodigde informatie op te halen uit een Core Spotlight-zoekresultaat:

als userActivity.activityType == CSSearchableItemActionType if let identifier = userActivity.userInfo? [CSSearchableItemActivityIdentifier] as? Tekenreeks // ID gebruiken om de juiste inhoud weer te geven voor dit zoekresultaat return true

Een goede gewoonte bij het indexeren van inhoud van uw app met het Core Spotlight-framework is om uw items ook te verwijderen wanneer ze niet langer nodig zijn. De CSSearchableIndex class biedt drie methoden om doorzoekbare items te verwijderen:

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

Voeg als voorbeeld de volgende code toe aan het einde van de viewDidLoad methode van de MasterViewController klasse:

CSSearchableIndex.defaultSearchableIndex () .SearchableItableItemsWithDomainIdentifiers (["tv-shows"]) (error) -> Void in if error! = Nil print (error? .LocalizedDescription) else // Items zijn succesvol verwijderd

Bouw en run uw app nog een keer. Wanneer u naar een van uw shows zoekt, worden er geen resultaten geretourneerd, omdat ze uit de index zijn verwijderd.

3. Het combineren NSUserActivity en Core Spotlight

Nog een nieuwe toevoeging aan de NSUserActivity klasse in iOS 9 is het contentAttributeSet eigendom. Met deze eigenschap kunt u een toewijzen CSSearchableItemAttributeSet, net zoals degene die je eerder hebt gemaakt. Met deze kenmerkset kunnen uw zoekresultaten worden gebruikt NSUserActivity objecten die dezelfde hoeveelheid detail weergeven als de Core Spotlight-zoekresultaten.

Begin door de volgende imports toe te voegen bovenaan DetailViewController.swift:

importeer CoreSpotlight importeer MobileCoreServices

Werk vervolgens het configureView methode in de DetailViewController klasse met de volgende implementatie:

func configureView () // Update de gebruikersinterface voor het detailitem. if self.nameLabel! = nil && self.detailItem! = nil self.nameLabel.text = detailItem.name self.genreLabel.text = detailItem.genre laat dateFormatter = NSDateFormatter () dateFormatter.timeStyle = .ShortStyle self.timeLabel.text = dateFormatter.stringFromDate (detailItem.time) laat activity = NSUserActivity (activityType: "com.tutsplus.iOS-9-Search.displayShow") activity.userInfo = ["name": detailItem.name, "genre": detailItem.genre , "time": detailItem.time] activity.title = detailItem.name var keywords = detailItem.name.componentsSeparatedByString ("") keywords.append (detailItem.genre) activity.keywords = Set (keywords) activity.eligibleForHandoff = false activity .eligibleForSearch = true //activity.eligibleForPublicIndexing = true //activity.expirationDate = NSDate () laat attributeSet = CSSearchableItemAttributeSet (itemContentType: kUTTypeItem as String) attributeSet.title = detailItem.name attributeSet.contentDescription = detailItem.genre + "\ n" + dateFormatter.stringFromDate (detailItem.t ime) activity.becomeCurrent ()

Bouw en run uw app een laatste keer en open een paar van uw shows. Wanneer u nu naar een show zoekt, ziet u dat uw resultaten zijn gemaakt met NSUserActivity, bevatten hetzelfde detailniveau als de Core Spotlight-zoekresultaten.

Conclusie

In deze zelfstudie leer je hoe je de inhoud van je applicatie toegankelijk maakt via iOS Spotlight met behulp van de NSUserActivity klasse en de Core Spotlight kader. Ik heb je ook laten zien hoe je inhoud van je applicatie kunt indexeren met behulp van beide API's en hoe je de status van je applicatie kunt herstellen wanneer een gebruiker een zoekresultaat heeft geselecteerd.

De nieuwe zoek-API's geïntroduceerd met iOS 9 zijn zeer gemakkelijk te gebruiken en maken de inhoud van uw toepassing gemakkelijker te vinden en toegankelijker voor de gebruikers van uw toepassing. Zoals altijd, als je opmerkingen of vragen hebt, laat ze dan achter in de reacties hieronder.