Zaimplementuj Core Spotlight w aplikacji SwiftUI
Część 2 z 2
W pierwszej części tej serii omówiliśmy podstawy implementacji Core Spotlight w aplikacji SwiftUI, w tym indeksowanie, usuwanie i obsługę danych wprowadzanych przez użytkowników.
W tej ostatniej części omówimy zaawansowane przypadki użycia, w tym:
- Kontynuacja wyszukiwania Spotlight w aplikacji
- Akcje niestandardowe dla elementów wyszukiwania Spotlight
- Niestandardowy podgląd elementów wyszukiwania Spotlight
Wyświetl przycisk
Przede wszystkim musimy pokazać przycisk „Szukaj w aplikacji” w wyszukiwarce Spotlight dla wyników naszej aplikacji. Aby to zrobić, musimy po prostu dodać CoreSpotlightContinuationklucz i ustawić go na TAK w Info.plistnastępujący sposób:
Następnie przycisk „Szukaj w aplikacji” musi pojawić się w naszych wynikach Spotlight.
Uwaga: może być konieczne ponowne uruchomienie urządzenia, aby pojawił się przycisk „Wyszukaj w aplikacji”.
Obsługuj dane wejściowe
Gdy użytkownik dotknie przycisku „Wyszukaj w aplikacji”, nasza aplikacja uruchamia się na pierwszym planie i otrzymuje ciąg wyszukiwania użytkownika, którego możemy następnie użyć do kontynuowania wyszukiwania w aplikacji.
Aplikacja otrzymuje ciąg wyszukiwania Spotlight jako NSUserActivity, więc aby go pobrać i obsłużyć, możemy użyć modyfikatora onContinueUserActivity. Zastosuj go w głównym widoku w swojej aplikacji w następujący sposób:
MainView()
.onContinueUserActivity(CSQueryContinuationActionType, perform: handleSpotlightSearchContinuation)
W naszej metodzie możemy pobrać ciąg wyszukiwania i użyć go zgodnie z architekturą aplikacji i przypadkiem użycia w następujący sposób:
func handleSpotlightSearchContinuation(userActivity: NSUserActivity) {
guard let searchString = userActivity.userInfo?[CSSearchQueryString] as? String else {
return
}
// Continue spotlight search
// Use the search string as per your app's use-case
print(searchString)
}
Wyświetl akcje niestandardowe
Aby wyświetlać akcje niestandardowe w wynikach wyszukiwania Spotlight, musimy zrobić dwie rzeczy.
Najpierw musimy dodać akcje niestandardowe w pliku Info.plist naszej aplikacji. Możemy ustawić ciąg tytułu, ikonę (za pomocą symbolu SF) i ciąg identyfikacyjny.
Następnie musimy przekazać identyfikatory dla akcji niestandardowych, które tutaj ustawiliśmy, do CSSearchableItem podczas indeksowania danych.
attributeSet.actionIdentifiers = [“CS_ACTION_1”, “CS_ACTION_2”]
Sprawdź kod źródłowy z części 1, aby uzyskać odniesienie do metody indexData.
Teraz, gdy długo naciskamy element wyszukiwania Spotlight, powinniśmy zobaczyć nasze niestandardowe akcje.
Uwaga: jeśli Twoje dane są już zindeksowane, musisz usunąć je z Spotlight i ponownie zindeksować, aby pojawiły się niestandardowe działania.
Obsługuj akcje niestandardowe
Obsługujemy niestandardowe akcje, używając tego samego, NSUserActivitiygdy stuknięty zostanie element wyszukiwania w centrum uwagi w naszej aplikacji.
Możemy więc zmodyfikować handleSpotlightmetodę, którą zdefiniowaliśmy wcześniej (w części 1), aby obsługiwała również nasze akcje niestandardowe. Ostateczna wersja będzie wyglądać tak:
func handleSpotlight(userActivity: NSUserActivity) {
// Get selected spotlight search item
guard let element = userActivity.userInfo?[CSSearchableItemActivityIdentifier] as? String else {
return
}
// If custom action requested, execute it
if let actionIdentifier = userActivity.userInfo?[CSActionIdentifier] as? String {
if actionIdentifier == "CS_ACTION_1" {
// Perform action 1
} else if actionIdentifier == "CS_ACTION_2" {
// Perform action 2
}
}
// Else handle the element
// Maybe deep-link, or something else entirely
// This totally depends on your app's use-case
else {
self.selection = Int(element)
}
}
Następnie sprawdzamy, czy wybrano akcję niestandardową, sprawdzając wartość actionIdentifier.
Jeśli otrzymamy wartość, możemy wykonać odpowiednią akcję. Jeśli nie, po prostu zajmujemy się gwintowanym elementem.
3) Niestandardowy podgląd elementów wyszukiwania Spotlight
Kiedy długo naciskamy nasze elementy wyszukiwania Spotlight, aby uzyskać dostęp do akcji niestandardowych, widzimy również automatyczny podgląd.
Ten automatycznie generowany podgląd jest dość prosty, jednak możemy ten podgląd zastąpić własnym widokiem.
- Przede wszystkim musimy dodać cel rozszerzenia podglądu szybkiego podglądu do naszej aplikacji. Przejdź do
File > New > Target, aby go dodać i nadać mu nazwę.
2. Następnie znajdź Info.plistwewnątrz celu i ustaw klucz QLSupportsSearchableItemsna TAK.
3. Ściśle mówiąc w przypadku niestandardowych podglądów elementów wyszukiwania Spotlight, nie potrzebujemy pliku PreviewProvider.swiftw elemencie docelowym i możemy go usunąć.
4. W PreviewViewController.swiftpliku odkomentuj preparePreviewOfSearchableItemmetodę. Możemy również pozbyć się preparePreviewOfFilemetody.
class PreviewViewController: UIViewController, QLPreviewingController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
func preparePreviewOfSearchableItem(identifier: String, queryString: String?, completionHandler handler: @escaping (Error?) -> Void) {
// Perform any setup necessary in order to prepare the view.
// Call the completion handler so Quick Look knows that the preview is fully loaded.
// Quick Look will display a loading spinner while the completion handler is not called.
handler(nil)
}
}
Możemy zmodyfikować Storyboard, aby uzyskać pożądany niestandardowy podgląd i skonfigurować go w preparePreviewOfSearchableItemmetodzie za pomocą parametrów:
identifier(które ustalamy dla każdej pozycji podczas indeksowania)queryString(wyszukiwany ciąg znaków)
Teraz, gdy długo naciskamy element wyszukiwania Spotlight w naszej aplikacji, otrzymujemy niestandardowy podgląd, taki jak ten:
Wskazówka: użyj pakietu, jeśli chcesz udostępniać dane/logikę między swoją aplikacją a rozszerzeniem Quick Look.
Na przykład, aby uzyskać dodatkowe informacje o obiekcie za pomocą identyfikatora.
Kompletny przykładowy projekt można znaleźć tutaj .
Dziękuję za przeczytanie! Mam nadzieję, że ten post okazał się pomocny, prosty i interesujący.

![Czym w ogóle jest lista połączona? [Część 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































