Skróty Siri — jak je wdrożyć?

Opublikowany: 2020-01-16

Skró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?

Proces tworzenia skrótów Siri
  1. 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.
  2. 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.
  3. 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 & Intents – przykłady skrótów Siri

NSUserActivity — Stworzymy skrót, który pozwoli nam uruchomić ekran składania nowego zamówienia

  1. 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
} 
Proces wdrażania skrótów Siri w celu zamówienia burgera

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.

Opcje: Wyświetl ostatnie skróty i Wyświetl darowizny na ekranie blokady
  1. Utwórz plik definicji intencji. Najlepszym sposobem jest dodanie go do osobnego frameworka w moim projekcie będzie w OrderKit .
Ikona pliku definicji intencji SiriKit

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.

Intencja niestandardowa, parametry i typy skrótów
Definicja zamówienia – Stwórz niestandardową intencję
Definicja zamówienia — Zdefiniuj odpowiedzi
Definicja zamówienia — Zdefiniuj odpowiedzi

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

Ikona rozszerzenia intencji
Plik -> Nowy -> Cel… -> Rozszerzenie intencji
Tak powinno wyglądać członkostwo docelowe dla Order.intentdefinition

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

Tworzenie UI do intencji
Tworzenie interfejsu użytkownika dla naszych intencji

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"))
    }
    
} 
Wersja demonstracyjna skrótów Siri

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