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:
NSUserActivity
klasse, die is ontworpen voor bekeken app-inhoudIn deze zelfstudie laat ik je zien hoe je de kunt gebruiken NSUserActivity
klasse en de Core Spotlight kader in uw eigen toepassingen.
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.
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:
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.gebruikers informatie
woordenboek voor de gebruikersactiviteit. Dit wordt later gebruikt om de status van de toepassing te herstellen.titel
eigenschap een tekenreekswaarde. Dit wordt weergegeven in de Spotlight-zoekresultaten.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.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.
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.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.
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.
CSSearchableItemAttributeSet
object, passeren in een inhoudstype voor het item. Als uw zoekresultaten naar een foto linken, kunt u bijvoorbeeld de kUTTypeImage
constante.titel
eigenschap van de attributenset. Net zoals met NSUserActivity
, deze titel staat bovenaan de zoekresultaten.Inhoudsbeschrijving
eigenschap van uw doorzoekbare kenmerkenset. Deze reeks wordt onder Spotlight in de titel van het resultaat weergegeven.NSUserActivity
.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.
NSUserActivity
en Core SpotlightNog 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.
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.