Demistifying iOS 9 Spotlight Search dla programistów

Opublikowany: 2022-03-11

W iOS wbudowane są trzy punkty wyszukiwania: Siri, Spotlight Search i Safari. Siri, jedna z najbardziej charakterystycznych funkcji iOS, to coś, co większość użytkowników iPhone'a już zna. Ale wiele osób nie zdaje sobie sprawy z wyszukiwania Spotlight – czegoś, co było integralną częścią iOS na długo przed istnieniem Siri. Wyszukiwanie Spotlight jest dostępne po przesunięciu ekranu głównego w dół lub przesuń palcem w prawo z osobistego ekranu głównego. Spowoduje to wyświetlenie paska wyszukiwania u góry ekranu.

Głównym celem tego narzędzia wyszukiwania w systemie iOS 8 i wcześniejszych było przeszukiwanie samego telefonu, więc jego strona wyników zawiera listę aplikacji znajdujących się na telefonie, a także wiadomości e-mail, wiadomości i innych prywatnych elementów w aplikacjach Apple. Wyświetli również definicję Wikipedii, jeśli wydaje się to istotne. Wreszcie oferuje opcję wyszukiwania w Internecie za pośrednictwem Safari jako dodatkowego kroku.

W przeciwieństwie do wyszukiwania Spotlight, Safari dotyczy świata poza Twoim telefonem. W iOS 8 użytkownik może wybrać wyszukiwarkę używaną do wyszukiwania w Safari: Google, Yahoo, Bing i DuckDuckGo. Oczywiście Google obsługuje większość żądań wyszukiwania Safari. Bez względu na wybraną wyszukiwarkę, w Safari prezentowane są wstępnie wypełnione terminy wyszukiwania, potencjalnie z dopasowaniem do Wikipedii.

W systemie iOS 9 wyszukiwanie Spotlight jest znacznie bardziej widoczne i ma szerszy zakres niż wcześniej. W rzeczywistości pierwszą rzeczą, którą widzisz, są „sugestie Siri” oparte na twoich wzorcach użytkowania. Na przykład, jeśli regularnie korzystasz z Safari po południu, Siri zasugeruje Ci to mniej więcej w tym czasie.

I choć wciąż jest to miejsce, w którym można znaleźć „rzeczy w telefonie”, staje się bezpośrednim portalem „rzeczy, których nie ma w telefonie”. Już widzisz rzeczy w pobliżu i nagłówki wiadomości pochodzące z Internetu za pośrednictwem własnej wyszukiwarki Apple, a inne wyniki internetowe dopiero zaczynają się pojawiać.

Tak, Apple stworzył wyszukiwarkę internetową dla iOS 9, co jest bardzo dużym krokiem. Przywitaj się z Applebotem.

Podobnie jak w Spotlight, celem Apple dotyczącym Safari jest również udostępnianie wyników i sugestii z indeksu wyszukiwania Apple, zanim zaoferuje się możliwość przeszukiwania sieci za pomocą Google (lub innego wybranego dostawcy). Począwszy od iOS 9.1, Safari wydaje się pozostawać w tyle za wyszukiwaniem Spotlight, kontynuując dostarczanie wyników od wybranego przez użytkownika dostawcy wyszukiwania – być może aby dać Apple wolniejsze wdrażanie funkcji wyszukiwania i więcej czasu na dopracowanie swoich algorytmów.

Szczególnie ekscytujące w premierze iOS 9 jest to, że po raz pierwszy daje on programistom iOS możliwość połączenia się z tymi funkcjami wyszukiwania i dołączania treści z aplikacji . Ponadto obiecuje się, że wyszukiwanie ostatecznie obejmie wyniki nie na telefonie użytkownika . To ogromny krok.

Po prostu umieśćmy to w kontekście. Wyszukiwarka Google zrodziła całą branżę zbudowaną wokół „SEO” — procesu optymalizacji zasobów wokół wyszukiwarki Google. Po pełnym uruchomieniu wyszukiwarka Apple będzie posiadać około 50% rynku wyszukiwania mobilnego, co stanowi 50% (i rośnie) ogólnego ruchu wyszukiwania. Applebot jest zatem duży, co oznacza, że ​​„Apple Mobile Search Optimization” będzie również duży.

Wysiłki Apple Mobile Search Optimization będą miały znacznie większy wpływ na odkrywanie aplikacji przez użytkowników mobilnych niż zwykłe SEO.

Witamy w nowo narodzonej branży AMSO.

Zła wiadomość jest taka, że ​​wdrożenie wszystkich tych funkcji wiąże się z wieloma nowymi technologiami firmy Apple, a także z ulepszeniem starych, a połączenie tych elementów może być mylące. Celem tej serii jest omówienie różnych elementów i wyjaśnienie, w jaki sposób można je wdrożyć. Zacznijmy od czegoś podstawowego i budujmy na tym.

Demistifying iOS 9 Spotlight Search dla programistów

Na poparcie tej serii stworzyłem prostą aplikację do odniesienia w całym tekście. Projekt można znaleźć tutaj: https://github.com/rwforsythe/iOS9-Search. Będzie on również aktualizowany, ponieważ seria ta będzie nadal obejmować inne elementy zestawu narzędzi wyszukiwania.

Podstawa: CoreSpotlight Framework

Ta struktura, całkowicie nowa w iOS 9, umożliwia dodawanie elementów do lokalnego indeksu wyszukiwania iPhone'a w celu odkrycia przez użytkownika. Na przykład przed iOS 9 tylko treści w oficjalnych aplikacjach Apple, takich jak Kalendarz, można było znaleźć za pomocą wyszukiwania Spotlight. Teraz każdą aplikację, która publikuje wydarzenia w kalendarzu za pośrednictwem platformy CoreSpotlight, można znaleźć za pośrednictwem wyszukiwania Spotlight, a nawet Siri.

Zwróć uwagę, że skupiamy się tutaj na danych osobowych; nie chcesz, aby Twoje wydarzenia z kalendarza osobistego były znajdowane przez użytkowników na innym telefonie! Apple jest bardzo jasne, że platforma CoreSpotlight współdziała wyłącznie z prywatnym indeksem na telefonie każdej osoby. Nie można używać CoreSpotlight API do publikowania treści poza własnym indeksem telefonu.

Nie oznacza to, że CoreSpotlight nie może być używany do indeksowania już informacji publicznych. Z pewnością można użyć CoreSpotlight do pobrania informacji z chmury i umieszczenia ich w indeksie wyszukiwania telefonu. Jest to po prostu gwarancja Apple, że jeśli dane osobowe i poufne zostaną zindeksowane przez CoreSpotlight, pozostaną poufne.

Struktura składa się z dwóch części: obiektu CSSearchableItemAttributeSet , który umożliwia aplikacji szczegółowe opisanie każdego elementu, oraz obiektu CSSearchableItem , który służy do nadania elementowi unikatowego identyfikatora. Każdy wpis Spotlight składa się z pary tych obiektów. Powodem używania dwóch obiektów zamiast jednego jest to, że obiekty CSSearchableItemAttributeSet są używane do innego rodzaju interakcji wyszukiwania (opisanej później).

Podstawy jest całkiem proste.

Dla tych, którzy odwołują się do przykładowego kodu, konfiguracja CoreSpotlight odbywa się w AppDelegate.

 … @import CoreSpotlight; @import MobileCoreServices; …

Te dwa moduły są potrzebne do nowej funkcjonalności.

Dla uproszczenia w aplikacji demonstracyjnej metoda application:didFinishLaunchingWithOptions: służy do wywołania dedykowanej metody konfiguracji CoreSpotlight:

 if ([CSSearchableItemAttributeSet class]) [self setUpCoreSpotlight]; //Check for iOS version that supports CoreSpotlight API

Przechodząc do metody setUpCoreSpotlight , proces rozpoczynamy od utworzenia obiektu CSSearchableItemAttributeSet :

 CSSearchableItemAttributeSet * attributeSet = [[CSSearchableItemAttributeSet alloc] initWithItemContentType:(NSString *)kUTTypeItem];

Typ treści jest ważny, ponieważ ma regulować ogólny sposób traktowania elementu przez algorytmy wyszukiwania. „Supposed” to słowo kluczowe, ponieważ jest to obszar, który nie jest dobrze udokumentowany przez Apple. Istnieje duże menu typów elementów do wyboru (typy obrazów, typy wideo, typy audio, typ kontaktu), ale wymagane są metody prób i błędów, aby określić, jaki wpływ (jeśli w ogóle) ma na wrażenia użytkownika. Niektóre typy wydają się wyświetlać więcej treści tekstowych niż inne, gdy są wyświetlane w wynikach wyszukiwania. Może również wpływać na to, czy wraz z wynikiem jest wyświetlany obraz miniatury. kUTTypeItem to świetne miejsce na rozpoczęcie.

Teraz opisz bardziej szczegółowo obiekt:

 attributeSet.displayName = @"A Christmas Carol"; attributeSet.title = @"A Christmas Carol By Charles Dickens"; //Sounds similar to displayName but is not displayed to user attributeSet.contentDescription = @"Who would dare to say “Bah! Humbug” after reading A Christmas Carol? Charles Dickens wrote the novella in just six weeks before it was first published on December 19 1843 but his morality tale about a bitter old miser named Ebenezer Scrooge lives on to this day as a reminder of the importance of the Christmas spirit."; attributeSet.keywords = @[@"A Christmas Carol", @"Charles Dickens", @"Victorian Literature"]; UIImage *image = [UIImage imageNamed:@"CC-Cover"]; NSData *imageData = [NSData dataWithData:UIImagePNGRepresentation(image)]; attributeSet.thumbnailData = imageData;

Istnieje wiele możliwych właściwości, specyficznych dla typów mediów, takich jak obrazy, filmy i tak dalej. Więcej informacji jest prawdopodobnie lepszych, ale do ustalenia, jakie informacje są faktycznie używane i/lub wyświetlane w wynikach wyszukiwania, potrzebne są metody prób i błędów. Na przykład w chwili pisania tego tekstu oceny w postaci gwiazdek nie są wyświetlane dla danego elementu indeksu, nawet jeśli atrybut attributeSet zawiera dane dotyczące oceny w postaci gwiazdek.

Większość właściwości tekstu jest zawarta w zapytaniu wyszukiwania, więc nawet jeśli właściwość title nie jest wyświetlana, tekst można znaleźć za pomocą wyszukiwania. Dlatego nie jest do końca jasne, w jaki sposób własność słów kluczowych różni się zasadniczo od własności tytułu.

Więcej informacji znajdziesz w dokumentacji firmy Apple: developer.apple.com

Ostatnim krokiem jest spakowanie CSSearchableItemAttributeSet z CSSearchableItem i zarejestrowanie go w indeksie.

 CSSearchableItem *item1 = [[CSSearchableItem alloc] initWithUniqueIdentifier:@”https://www.notestream.com/streams/564159e4e5c24” domainIdentifier:@"notestream.com" attributeSet:attributeSet];

Tutaj dwie nowe rzeczy. Właściwość domainIdentifier umożliwia grupowanie elementów na potrzeby operacji wsadowych. Na przykład @"meetingItem" i @"reminderItem" w aplikacji kalendarza pozwalają usunąć wszystkie wpisy Spotlight jednego rodzaju, pozostawiając inne.

Właściwość uniqueIdentifier ma do odegrania ważniejszą rolę. Najpierw jest przesyłany z powrotem do aplikacji, gdy użytkownik kliknie element w indeksie CoreSpotlight (omówionym później). Po drugie, Apple zalecił, jak to powinno wyglądać podczas korzystania z innych elementów infrastruktury wyszukiwania. Na razie użyjemy ciągu, który w rzeczywistości jest adresem URL, który jednoznacznie reprezentuje ten element. Technicznie rzecz biorąc, ta właściwość może być dowolnym ciągiem, o ile jest unikalna dla przedmiotu.

Ostatni krok: wstaw elementy, które utworzyłeś do rzeczywistego indeksu.

 [[CSSearchableIndex defaultSearchableIndex] indexSearchableItems:@[item1, item2, item3] completionHandler: ^(NSError * __nullable error) { if (!error) NSLog(@"Search item(s) journaled for indexing."); }];

Kilka punktów do zrobienia:

  1. Ta metoda pobiera tablicę obiektów (i istnieją inne metody, których można użyć do wsadowego przetwarzania procesu, jeśli jest dużo danych do zindeksowania).

  2. Ważne jest, aby zdać sobie sprawę, że ta metoda w rzeczywistości nie kończy procesu indeksowania. Procedura obsługi zakończenia jest wywoływana tylko wtedy, gdy elementy wyszukiwania zostały umieszczone w kolejce do indeksowania. Użyj CSSearchableIndexDelegate do obsługi scenariuszy, w których sam proces indeksowania nie powiedzie się z jakiegoś powodu, a aplikacja musi obsłużyć sytuację.

Gratulacje, dodałeś elementy do indeksu wyszukiwania CoreSpotlight telefonu!

Jak działa wyszukiwanie w iOS 9

Oczywiście Apple trzyma swoje algorytmy wyszukiwania blisko siebie, więc warto zainstalować przykładową aplikację i bawić się słowami kluczowymi. Na przykład szybko staje się jasne, że Apple maksymalizuje prezentowane wyniki, podając bardzo różne wyniki, gdy użytkownik wpisuje każdą literę:

Wygląda na to, że zasada jest taka, że ​​wyniki uważane za bardziej odpowiednie zostaną przedstawione po wpisaniu zaledwie kilku liter. Gdy użytkownik wpisuje więcej liter, te wczesne wyniki są usuwane, a zamiast nich prezentowane są inne rzeczy (pierwotnie uważane za mniej prawdopodobne).

Mówiąc ogólniej, Apple ma tylko kilka rzeczy do powiedzenia na temat tego, jak poprawić ranking w ramach swoich algorytmów. Ta strona zawiera rekomendacje Apple: Popraw wyniki wyszukiwania

Jednym z kluczowych wniosków płynących z dokumentacji Apple jest to, że ranking poprawia się, gdy aplikacja wykorzystuje wiele technologii wyszukiwania do indeksowania treści. W następnym artykule omówimy inną z tych technologii. Tymczasem nadal musimy zaimplementować kod, aby obsłużyć scenariusz, gdy użytkownik kliknie wynik wyszukiwania.

Gdy użytkownik kliknie

Stworzyliśmy kod w celu wypełnienia indeksu potencjalnymi wynikami wyszukiwania, ale co się dzieje, gdy użytkownik kliknie wynik? Odpowiedź brzmi, że CoreSpotlight pożycza metodę application:continueUserActivity:restorationHandler: z protokołu UIApplicationDelegate. Zostało to pierwotnie wprowadzone w iOS 8 dla mechanizmu przekazywania, który umożliwia przekazywanie działań użytkownika z urządzenia na urządzenie (np. użytkownik widzi adres URL sieci na iWatch, używa handoff do pobrania go w przeglądarce Safari na iPhonie i ostatecznie do wyświetlenia go na swoim Macu, gdy dotrą do biura).

Pierwszym wyzwaniem jest ustalenie, czy metoda została wywołana z powodu działania Handoff, czy z wyszukiwania Spotlight. Właściwość activityType parametru activity powie ci, ale jeśli kod może działać w systemie iOS 8, musisz w takim przypadku uniknąć awarii.

Oto jak może wyglądać tutaj prosty kod:

 - (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)activity restorationHandler:(void (^)(NSArray *))restorationHandler { NSString * valueCSSearchableItemActionType; BOOL wasHandled = NO; if ([CSSearchableItemAttributeSet class]) //iOS 9 { valueCSSearchableItemActionType = CSSearchableItemActionType; } else { // iOS 8 – This method was introduced in iOS 8, so iOS 7 is not a possible scenario valueCSSearchableItemActionType = @"not supported"; } if ([activity.activityType isEqual: valueCSSearchableItemActionType]) { // Invoked via CoreSpotlight, we can assume iOS 9 from now on… NSString * activityIdentifier = [activity.userInfo valueForKey:CSSearchableItemActivityIdentifier]; wasHandled = YES; NSLog(@"Continuing user activity %@", activityIdentifier); } else { //the app was launched via Handoff protocol //or with a Universal Link } return wasHandled; }

Zwróć uwagę na wiersz kodu:

 NSString * activityIdentifier = [activity.userInfo valueForKey:CSSearchableItemActivityIdentifier];

To wyodrębnia unikalny identyfikator, który został umieszczony w indeksie reflektorów podczas tworzenia obiektu CSSearchableItem . Oczywiście Twoja aplikacja powinna używać tego unikalnego identyfikatora, aby prezentować użytkownikowi treść wybraną przez niego z indeksu wyszukiwania. Dla uproszczenia tutaj po prostu NSLog unikalny identyfikator.

podsumowanie

Do tej pory zbadaliśmy tylko jedną część funkcji wyszukiwania w iOS 9. Przejrzeliśmy podstawowe funkcje potrzebne do załadowania indeksu wyszukiwania Spotlight telefonu z rzeczami, które użytkownik może uznać za przydatne: dokumentami, pozycjami kalendarza, kontaktami i tak dalej. Gdy użytkownik czegoś szuka, widzi wynik z Twojej aplikacji i klika go, aplikacja będzie w stanie obsłużyć żądanie i wyświetlić odpowiedni element dla użytkownika.

To, czego jeszcze nie omówiliśmy, to technologie związane z publicznym indeksem, który buduje Apple. Ten indeks ma na celu umożliwienie użytkownikom znajdowania treści w Twojej aplikacji nawet bez jej zainstalowania na telefonie. Zajmiemy się tym w następnym poście.