Krótko o wyszukiwaniu zawartości aplikacji z Core Spotlight w iOS

Dzisiaj omówię jeden z frameworków dodanych w iOS 9: Core Spotlight. API pozwala na dodanie zawartości do wyszukiwarki spotlight, czyli np. aplikacja służąca do przeglądania filmów może dodać filmy, aktorów, reżyserów oraz pozwala zareagować, jeśli użytkownik wybrał naszą pozycję. Możemy go wtedy przenieść do odpowiedniego miejsca w aplikacji.
Core Spotlight – wyszukiwanie zawartości
Na potrzeby wpisu stworzyłem projekt, w którym listuję pracowników Holdapp.
Podzielę całość na dwie części:
- Zindeksowanie naszych pracowników
- Obsługa zdarzenia, gdy użytkownik wybierze jakiegoś pracownika
Indeksowanie zawartości
Żeby zindeksować pracowników należy:
- Stworzyć obiekt: CSSearchableItemAttributeSet.
- Dodać mu odpowiednie dla naszego przypadku atrybuty. Należy również dodać, że można wyświetlać nie tylko teksty, ale też obrazki, numery, daty i punkty na mapie (wszystkie opcje są dostępne tutaj).
- Stworzyć obiekt: CSSearchableItem z unikalnym identyfikatorem, domeną i wcześniej stworzonym obiektem CSSearchableItemAttributeSet.
- Dodać listę CSSearchableItem do CSSearchableIndex.
// Mamy stworzoną listę employees, która jest wypełniona obiektami Employee
var searchableItems = [CSSearchableItem]()
for (i, employee) in employees.enumerate() {
//1.
let searchableItemAttributeSet = CSSearchableItemAttributeSet(itemContentType: kUTTypeText as String)
//2.
searchableItemAttributeSet.title = employee.name
searchableItemAttributeSet.thumbnailURL = NSBundle.mainBundle().URLForResource(employee.imageName, withExtension: "png")
var keywords = [String]()
keywords.appendContentsOf(employee.appsMade)
keywords.appendContentsOf(employee.favouriteLanguages)
searchableItemAttributeSet.keywords = keywords
//3.
let searchableItem = CSSearchableItem(uniqueIdentifier: "com.hldp.team.\(i)", domainIdentifier: "hldp_team", attributeSet: searchableItemAttributeSet)
print(searchableItem)
searchableItems.append(searchableItem)
}
//4.
CSSearchableIndex.defaultSearchableIndex().indexSearchableItems(searchableItems) { (error) -> Void in
if error != nil {
print(error?.localizedDescription)
}
}
Obsługa zdarzenia
Gdy użytkownik wybierze jedną z naszych pozycji w spotlight, zostanie wykonana metoda w AppDelegate, mianowicie:
func application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]?) -> Void) -> Bool
Przy czym:
- application to obiekt aplikacji,
- userActivity to obiekt, który służy do odpowiedniego zareagowania na to co użytkownik wybrał, posiada no property: activityType, który jest równy uniqueIdentifier z obiektu CSSearchableItem,
- restorationHandler to blok, który można wywołać, gdy jest potrzeba kontynuowania aktywności.
Funkcja pozwala na dostosowanie aplikacji do wykonanej akcji użytkownika. Jeśli obsłużymy akcję zwracamy true w innym wypadku zwracamy false.
Reasumując, Core Spotlight jest bardzo prosty i przejrzysty w implementacji. Kilka linijek kodu może bardzo zwiększyć widoczność aplikacji i ułatwić dostęp do odpowiedniego miejsca dla użytkownika.