Dlaczego API do wyszukiwania jest ważne? Większość aplikacji zawiera treści dodane przez użytkownika lub przez samą aplikację. iOS posiada świetną wyszukiwarkę o nazwie Spotlight, która pełni rolę Google na Twoim urządzeniu.
Spotlight przeszukuje zawartość Twojego urządzenia, aplikacje, a nawet strony internetowe. Stworzenie zawartości aplikacji w Spotlight jest naprawdę łatwe. Udostępni Twoje treści nawet dla użytkowników, którzy nie mają zainstalowanej aplikacji.
Apple udostępnia 3 główne API, dzięki którym Twoja aplikacja jest bardziej wykrywalna:
Wszystkie 3 interfejsy API są szybkie i proste w użyciu, a przy niewielkim wysiłku możesz sprawić, że użytkownicy będą pobierać wyniki wyszukiwania z Twojej aplikacji. W niektórych przypadkach nawet wtedy, gdy nie mają zainstalowanej aplikacji.
Core Spotlight ma na celu zindeksowanie danych, a przez „dane” rozumiem wszystko, czego chcesz - czy to dokumenty użytkownika, odpowiednie kontakty, adresy, a nawet obrazy.
Istnieją trzy kroki w celu dodania elementu do indeksu Spotlight:
Przejdźmy przez kolejne kroki.
Pierwszy i najważniejszy krok do zindeksowania treści, to zdefiniowanie atrybutów.
Tworzymy instancję CSSearchableItemAttributeSet
, a następnie uzupełniamy jej właściwości.
Podczas inicjowania instancji musimy dopasować typ jej zawartości. Typem zawartości musi być UTI utworzony na podstawie ciągu znaków.
Po ustanowieniu atrybutów możesz rozpocząć wypełnianie właściwości, takich jak temat, tytuł, opis, rodzaj twórcy itd.
import CoreSpotlight
class ContactGenerator {
func index() {
let attributed = CSSearchableItemAttributeSet(itemContentType: "Text")
attributed.title = "Avi Tsadok"
attributed.phoneNumbers = ["0544-xxxxxxx"]
attributed.emailAddresses = ["[email protected]"]
attributed.contentDescription = "iOS Expert"
}
}
Istnieje kilka rozszerzeń tej klasy, takich jak:
CSSearchableItemAttributeSet_Places
CSSearchableItemAttributeSet_Events
CSSearchableItemAttributeSet_Documents
Spróbuj wypełnić jak najwięcej atrybutów. Bogate zestawy atrybutów przełożą się przetłumaczeniem na wyniki wyszukiwania i lepsze doświadczenie dla użytkownika. Ponadto algorytm wyszukiwania, którego używa Apple, priorytetyzuje najbogatsze rezulataty.
Niektóre atrybuty są powiązane z numerami telefonów, adresami i lokalizacjami. Oznacza to, że za każdym razem, gdy wyniki wyszukiwania zawierają elementy o tych atrybutach, obok wyniku elementu wyszukiwania pojawi się przycisk akcji, który pozwoli użytkownikowi uzyskać szybką odpowiedź na wynik wyszukiwania.
To jest krok na jedną linię kodu. Tworzenie elementu wyszukiwania (CSSearchableItem) jest bardzo łatwe i musisz przekazać tylko trzy parametry: identyfikator elementu, identyfikator domeny i przypisany zestaw, który utworzyliśmy w poprzednim zestawie.
import CoreSpotlight
class ContactsIndexer {
func indexItems() {
let attributed = CSSearchableItemAttributeSet(itemContentType: "Text")
attributed.title = "Avi Tsadok"
attributed.phoneNumbers = ["0544-xxxx"]
attributed.emailAddresses = ["[email protected]"]
attributed.contentDescription = "iOS Expert"
// create an item from attributed set
let contactItem = CSSearchableItem(uniqueIdentifier: "123456", domainIdentifier: "Contacts", attributeSet: attributed)
}
}
Kolejnym atrybutem, który może być przeszukiwany, jest data ważności. Domyślnie data ważności elementu wynosi miesiąc, ale możesz zmienić tę właściwość w dowolnym momencie.
Aby zindeksować element, dodajemy go do CSSearchableIndex
.
CSSearchableIndex
ma singleton o nazwie default. Ten ma metodę o nazwie indexSearchableItems
z jednym parametrem, którym jest tablica elementów do indeksowania.
Powinieneś już rozumieć, że najlepszą praktyką jest mapowanie danych na przeszukiwalne elementy, a następnie indeksowanie ich wszystkich razem, zamiast robić to jeden po drugim.
CSSearchableIndex.default().indexSearchableItems([contactSearchableItem]) { (error) in
if !error {
print("Completed successfully")
}
}
CSSearchableIndex
ma dodatkowe metody, takie jak usuwanie wszystkich elementów w indeksie, usuwanie elementów według identyfikatorów lub usuwanie ich według domeny.
// delete all items
CSSearchableIndex.default().deleteAllSearchableItems { (error) in
}
// delete certain items by identifiers
CSSearchableIndex.default().deleteSearchableItems(withIdentifiers: ["aviID"]) { (error) in
}
// delete all items from specific domains
CSSearchableIndex.default().deleteSearchableItems(withDomainIdentifiers: ["contacts"]) { (error) in
}
Innym sposobem na zapewnienie użytkownikom trafnych wyników wyszukiwania jest użycie czegoś o nazwie NSUserActivity.
NSUserActivity
został utworzony w celu śledzenia statusu użytkownika, a następnie zsynchronizowania go z innymi urządzeniami Apple w celu przekazania i zachowania ciągłości. Śledzenie aktywności użytkowników może jednak pomóc Spotlight w uzyskaniu lepszych i dokładniejszych wyników wyszukiwania.
Śledząc aktywność użytkownika połączoną z aplikacją, indeksujesz elementy w wyszukiwarce. Pamiętaj - CSSearchableIndex
odzwierciedla to, co ma Twoja aplikacja, a NSUserActivity
odzwierciedla to, co użytkownik robi z Twoją treścią.
Podobnie jak przy CSSearchableItem
, tworzenie działania jest proste i łatwe:
func addUserActivity() {
let userActivity = NSUserActivity(activityType: "com.searchtutorial.www")
userActivity.title = "Search Tutorial"
userActivity.isEligibleForSearch = true
userActivity.isEligibleForHandoff = true
userActivity.isEligibleForPrediction = true
userActivity.isEligibleForPublicIndexing = true
userActivity.keywords = ["search", "tutorial", "spotlight"]
userActivity.userInfo = ["id" : "tutorial123"]
userActivity.becomeCurrent()
}
Innym sposobem na wzbogacenie wyników wyszukiwania jest dołączenie obiektu CSSearchableItemAttributeSet
do działania użytkownika. To ta sama klasa, której użyliśmy do indeksowania CSSearchableItem
.
func addUserActivity() {
let userActivity = NSUserActivity(activityType: "com.searchtutorial.www")
userActivity.title = "Search Tutorial"
userActivity.isEligibleForSearch = true
userActivity.isEligibleForHandoff = true
userActivity.isEligibleForPrediction = true
userActivity.isEligibleForPublicIndexing = true
userActivity.keywords = ["search", "tutorial", "spotlight"]
userActivity.userInfo = ["id" : "tutorial123"]
let attributed = CSSearchableItemAttributeSet(itemContentType: "Article")
attributed.title = "Search Tutorial"
attributed.emailAddresses = ["[email protected]"]
attributed.contentDescription = "How to search your items with Core Spotlight"
userActivity.contentAttributeSet = attributed
userActivity.becomeCurrent()
}
Należy tutaj zauważyć jedną rzecz. Istnieje właściwość o nazwie isEligibleForPublicIndexing
. Oznacza to, że ten wynik wyszukiwania może pojawiać się także dla innych użytkowników, nawet jeśli nie mają zainstalowanej Twojej aplikacji! Dlatego nigdy nie ustawiaj tej właściwości na true
, chyba że masz pewność, że nie jest to treść prywatna.
Możesz zaindeksować treść w tle, aby zaktualizować ją w wynikach wyszukiwania. Aby to zrobić, musisz utworzyć rozszerzenie indeksu (Spotlight).
To rozszerzenie ma trzy role:
Może to brzmieć jak niewielki problem, ale jeśli chcesz, aby indeks był dobrze utrzymany, musisz tego pilnować.
Oto kilka najlepszych praktyk dotyczących wyszukiwania w iOS:
CSSearchableItemAttributeSet
z obrazami, aby wyniki wyszukiwania były zauważalne.NSUserActivity
, od trzech do pięciu dla każdego działania.CSSearchableItemAttributeSet
dla elementu. Jest to nie tylko dobre do testowania, ale możesz także ponownie użyć kodu zarówno dla NSUserActivity
, jak i dla CoreSpotlight
.To niesamowite, jak wiele korzyści można uzyskać, tak łatwo indeksując treści do wyszukiwania. Postawienie na Spotlight może zbudować lub zwiększyć zaangażowanie wokół Twojej aplikację.
Oryginał tekstu w języku angielskim przeczytasz tutaj.