Indeksowanie treści aplikacji w iOS
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.
Wykorzystaj widoczność swojej aplikacji
Apple udostępnia 3 główne API, dzięki którym Twoja aplikacja jest bardziej wykrywalna:
- Core Spotlight: Indeksuje Twoje treści prywatnie na urządzeniu użytkownika.
- NSUserActivity: Pozwala udostępniać treści zarówno na urządzeniu, jak i publicznie, śledząc aktywność i stan użytkownika oraz synchronizując je z Apple
- Znaczniki sieciowe: Indeksują strony internetowe związane z aplikacją (nie będę ich tu omawiał).
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.
Indeksuj swoje dane za pomocą Core Spotlight
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:
- Zdefiniuj atrybuty elementu - tytuł, opis, numer telefonu, obraz itp.
- Utwórz element dla indeksu na podstawie wybranych atrybutów.
- Dodaj element do indeksu Spotlight.
Przejdźmy przez kolejne kroki.
Zdefiniuj atrybuty elementu - CSSearchableItemAttributeSet
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
- itd.
Posiadają różne zestawy atrybutów dla obiektu.
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.
Utwórz element 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)
}
}
- Identyfikator elementu ma dwie role - jedna ma nadać elementowi unikalne ID, dzięki czemu można go usunąć lub zmodyfikować w przyszłości, a druga polega na tym, że gdy użytkownik kliknie w element i otworzy aplikację, może załadować się odpowiedni ekran na podstawie przekazanego identyfikatora.
- Identyfikator domeny jest parametrem opcjonalnym i służy do grupowania wyników wyszukiwania dla użytkownika. Może także pomóc w bardzo łatwym usuwaniu elementów z określonej domeny.
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.
Indeksuj elementy do przeszukiwania za pomocą CSSearchableIndex
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
}
Indeksuj aktywność użytkownika za pomocą NSUserActivity
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()
}
Pokaż popularne działania
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.
Indeksuj swoje treści w tle
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:
- Reindeksowanie danych, gdy użytkownik przywróci aplikację z kopii zapasowej lub odzyska dane.
- Ponowane zaindeksowanie danych, jeśli mają wkrótce wygasnąć.
- Indeksowanie nowych elementów otrzymanych metodą przeciągnij i upuść (na iPadzie).
Może to brzmieć jak niewielki problem, ale jeśli chcesz, aby indeks był dobrze utrzymany, musisz tego pilnować.
Najlepsze praktyki wyszukiwania
Oto kilka najlepszych praktyk dotyczących wyszukiwania w iOS:
- Spróbuj użyć
CSSearchableItemAttributeSet
z obrazami, aby wyniki wyszukiwania były zauważalne. - Używaj słów kluczowych w
NSUserActivity
, od trzech do pięciu dla każdego działania. - Zaktualizuj indeks elementów, które można przeszukiwać, usuwając i aktualizując je, aby wyniki były trafne.
- Najlepiej jest utworzyć usługę, która może zapewnić
CSSearchableItemAttributeSet
dla elementu. Jest to nie tylko dobre do testowania, ale możesz także ponownie użyć kodu zarówno dlaNSUserActivity
, jak i dlaCoreSpotlight
. - Spróbuj dowiedzieć się, kiedy zaindeksować treść. Może to być ładowanie aplikacji, zmiana danych lub synchronizacja z serwerem.
- Zwróć uwagę na datę ważności. Aby Twoje treści funkcjonowały w wynikach wyszukiwania, upewnij się, że ustawiłeś datę ważności i ponownie ją zindeksuj.
- Jeśli budujesz rozszerzenie wyszukiwania, udostępnij kod indeksujący głównej aplikacji.
Podsumowanie
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.