Skróty Siri — jak je wdrożyć?
Opublikowany: 2020-01-16Skróty Siri, nowa funkcja zaprezentowana na zeszłorocznym WWDC, oferują możliwość wykonywania niektórych funkcjonalności aplikacji w tle. Nie musimy włączać aplikacji, aby korzystać z tych funkcjonalności w aplikacji, możemy po prostu powiedzieć Siri np. „Burger Time” i system wie, do której aplikacji jest przypisany ten skrót i zamawia dla nas burgera.
Czym są skróty Siri?
- Wygodny sposób wykonywania zadań z ekranu blokady lub obszaru wyszukiwania.
- Skróty można również dodać do Siri, aby uruchomić z frazą głosową na iOS, HomePod i watchOS.
- Deweloperzy dodają do swoich aplikacji haki skrótów, które umożliwiają Siri łączenie się z tymi skrótami.
- Używanie modeli uczenia maszynowego swoich zachowań do analizowania typowych funkcji, które wykonujesz, i automatycznego sugerowania skrótów.
- iOS 12+
W tym artykule skupimy się na wdrożeniu skrótu do zamówienia, jednej z najpopularniejszych aplikacji Siri Shortcuts. Stworzymy prostą aplikację, która pozwoli Ci zamówić burgery
Jak możemy tworzyć skróty Siri?

- Na samym początku musimy pomyśleć o funkcjonalności, którą użytkownik naprawdę chce ułatwić w naszej aplikacji . Powinna to być funkcjonalność, którą użytkownik wykonuje często i wymaga od użytkownika wejścia do aplikacji i przejścia w niej długiej ścieżki. Skróty umożliwią skrócenie tej ścieżki w celu wykonania funkcjonalności.
- W następnym kroku musisz przekazać skrót. Co to znaczy? Musimy przekazać do systemu informację o tym, że złożyliśmy zamówienie, np. jednego burgera z boczkiem. Przekazujemy te informacje do systemu, a później Siri może zasugerować nam w określonym czasie wykonanie tego konkretnego zamówienia.
- Ostatnią rzeczą do zrobienia jest obsługa tego skrótu, co ma miejsce w przypadku, gdy użytkownik powie Siri wcześniej zdefiniowane polecenie , np. „Czas burgera”, lub w przypadku, gdy użytkownik naciśnie sugerowany przez Siri skrót na ekranie blokady.
Ok, może napiszemy jakiś kod? Jakie są nasze możliwości jako deweloperów?

NSUserActivity — Stworzymy skrót, który pozwoli nam uruchomić ekran składania nowego zamówienia
- Dodaj klucz do Info.plist
<key>NSUserActivityTypes</key> <tablica> <string>com.miquido.SiriShotcutDemo.make-order</string> </array>
2. Przekaż skrót, gdy użytkownik wejdzie na ekran
let orderActivity = NSUserActivity(activityType: "com.miquido.SiriShotcutDemo.make-order") orderActivity.persistentIdentifier = NSUserActivityPersistentIdentifier("com.miquido.SiriShotcutDemo.make-order") orderActivity.isEligibleForSearch = prawda orderActivity.isEligibleForPrediction = true orderActivity.title = "Złóż zamówienie" orderActivity.suggestedInvocationPhrase = "Czas burgera" let atrybuty = CSSearchableItemAttributeSet(itemContentType: kUTTypeItem as String) atrybuty.contentDescription = "Pyszne hamburgery !" atrybuty.thumbnailData = UIImage(nazwa: "logo")?.pngData() orderActivity.contentAttributeSet = atrybuty userActivity = orderActivity
3. W AppDelegate
należy zaimplementować delegata continueUserActivity
, który po uzyskaniu tego konkretnego typu przekieruje do danego ekranu
func application(_ application: UIApplication, kontynuuj userActivity: NSUserActivity, restoreHandler: @escape ([UIUserActivityRestoring]?) -> Void) -> Bool { if userActivity.activityType == "com.miquido.SiriShotcutDemo.make-order" { // obsługuj otwartą aplikację na ekranie zamówienia zwróć prawdę } zwróć fałsz }

Intencje — Wdrożymy skrót do składania zamówień
Pro wskazówka przed wdrożeniem:
Intencje pojawiają się, gdy użytkownik robi coś systematycznie. Jeśli jednak chcesz przetestować tę funkcję, aby zawsze otrzymywać sugestie od Siri, musisz włączyć dwie opcje — „ Wyświetl ostatnie skróty ” i „ Wyświetl darowizny na zablokowanym ekranie ” w Ustawienia -> Deweloper.

- Utwórz plik definicji intencji. Najlepszym sposobem jest dodanie go do osobnego frameworka w moim projekcie będzie w
OrderKit
.

2. Wybierz kategorię, w tym przypadku „Zamów”. W tym pliku musimy wybrać parametry, które przekażemy do systemu i stworzyć kombinacje tych parametrów.


3. Utwórz nowy cel z rozszerzeniem dla intencji, wybierz „Dołącz rozszerzenie interfejsu użytkownika” podczas jego tworzenia.



Order.intentdefinition
4. Utwórz interfejs użytkownika do intencji w pliku MainInterface.storyboard
.

5. Skonfiguruj stan ready
i success
w IntentViewController
.
func configureView(dla parametrów: Set<INParameter>, interakcji: INInteraction, InteractiveBehavior: INUIInteractiveBehavior, kontekst: INUIHostedViewContext, zakończenie: @escaping (Bool, Set<INParameter>, CGSize) -> Void) { guard let intent = interakcja.intent as? Intencja zamówienia jeszcze { zakończenie(false, Set(), .zero) zwrócić } if interact.intentHandlingStatus == .ready { konfiguracja(z: zamiarem) waitTime.isHidden = prawda zakończenie (prawda, parametry, pożądany rozmiar) } else if interact.intentHandlingStatus == .success, niech odpowiedź = interact.intentResponse as? ZamówienieIntentResponse { konfiguracja(z: zamiarem) waitTime.isHidden = fałsz if let waitTimeText = response.waitTime { waitTime.text = "Zamówienie będzie gotowe za \(waitTimeText) minut" } everythingIsOkLabel.text = "Dotknij, aby wyświetlić zamówienia " zakończenie (prawda, parametry, pożądany rozmiar) } zakończenie(fałsz, parametry, .zero) } konfiguracja funkcji prywatnej (z intencją: OrderIntent) { burgerNameLabel.text = intent.burgerName if let ilość = intent.quantity?.stringValue { qualityLabel.text = "\(ilość) szt." } if let adds = intent.additions { addedsLabel.text = dodatki.elementy.toString } }
6. Po stworzeniu UI możemy przejść do darowizny naszej intencji. W takim przypadku najlepiej przekazać intencje podczas składania zamówienia. Do systemu przekazujemy wszystkie informacje, które wcześniej zdefiniowaliśmy w pliku Order.intentdefinition
, czyli nazwę burgera, ilość i dodatki oraz proponowaną frazę wyświetlaną w przypadku, gdy chcielibyśmy od razu dodać ten skrót do Siri przy składaniu zamówienia .
private func donateInteraction(dla zamówienia: Order) { let interact = INInteraction(intent: order.intent, response: nil) interakcja.darowizna { (błąd) w jeśli błąd != zero { // obsługuj błąd } w przeciwnym razie { print("Interakcja pomyslnie przekazana") } } }
Zamówienie rozszerzenia publicznego { var intencje: OrderIntent { let orderIntent = OrderIntent() orderIntent.burgerName = nazwa if let intValue = Int(ilość) { orderIntent.quantity = NSNumber(value: intValue) } orderIntent.suggestedInvocationPhrase = "Czas burgera" orderIntent.additions = dodatki.map { opcja -> INObject in return INObject(identyfikator: opcja.rawValue, wyświetlanie: opcja.rawValue) } intencja zwrotu zamówienia } }
7. Teraz możemy poradzić sobie z sytuacją, co się stanie w przypadku, gdy użytkownik otrzyma sugestię skrótu i kliknie w niego oraz w przypadku wywołania skrótu przez Siri.
klasa publiczna OrderIntentHandler: NSObject, OrderIntentHandling { potwierdź funkcję publiczną (zamiar: Zamówienie, zakończenie: @escaping (OrderIntentResponse) -> Unieważnienie) { complete(OrderIntentResponse(kod: OrderIntentResponseCode.ready, userActivity: zero)) } public func handle (zamiar: OrderIntent, zakończenie: @escaping (OrderIntentResponse) -> Unieważnienie) { guard let burgerName = intent.burgerName else { complete(OrderIntentResponse(kod: .failure, userActivity: nil)) zwrócić } Defaults.save(order: Order(od: intent)) complete(OrderIntentResponse.success(burgerName:burgerName, waitTime: "5")) } }

To wszystko, wszystko działa
Cały projekt możesz sprawdzić na moim GitHubie tutaj
Źródła:
- https://developer.apple.com/videos/play/wwdc2018/211/
- https://developer.apple.com/videos/play/wwdc2018/214/
- https://developer.apple.com/documentation/sirikit/donating_shortcuts
- https://developer.apple.com/design/human-interface-guidelines/sirikit/overview/siri-shortcuts/
- https://www.raywenderlich.com/6462-siri-skróty-tutorial-in-ios-12