Siri 바로 가기 - 구현 방법은 무엇입니까?
게시 됨: 2020-01-16작년 WWDC에서 선보인 새로운 기능인 Siri 바로가기는 백그라운드에서 애플리케이션의 특정 기능을 수행하는 기능을 제공합니다. 응용 프로그램에서 이러한 기능을 사용하기 위해 응용 프로그램을 켤 필요가 없습니다. 예를 들어 Siri에게 "Burger Time"이라고 말하면 시스템은 이 단축키가 할당된 응용 프로그램을 알고 우리를 위해 햄버거를 주문합니다.
Siri 단축키는 무엇입니까?
- 잠금 화면 또는 검색 영역에서 작업을 수행하는 편리한 방법입니다.
- iOS, HomePod 및 watchOS에서 음성 문구로 실행하기 위해 Siri에 단축키를 추가할 수도 있습니다.
- 개발자는 Siri가 이러한 바로 가기에 연결할 수 있도록 앱에 바로 가기 후크를 추가합니다.
- 행동의 기계 학습 모델을 사용하여 수행하는 일반적인 기능을 분석하고 자동으로 바로 가기를 제안합니다.
- iOS 12 이상
이 기사에서는 Siri 바로 가기의 가장 인기 있는 응용 프로그램 중 하나인 주문 바로 가기의 구현에 중점을 둘 것입니다. 햄버거를 주문할 수 있는 간단한 응용 프로그램을 만들 것입니다.
Siri 바로 가기를 어떻게 만들 수 있습니까?

- 맨 처음에 우리는 사용자가 우리 응용 프로그램에서 더 쉽게 만들고자 하는 기능 에 대해 생각해야 합니다. 이것은 사용자가 자주 수행하는 기능이어야 하며 사용자가 애플리케이션에 들어가 긴 경로를 전달해야 합니다. 바로 가기를 사용하면 이 경로를 줄여 기능을 수행할 수 있습니다.
- 다음 단계에서 바로 가기를 기부해야 합니다. 이것은 무엇을 의미 하는가? 예를 들어 베이컨을 곁들인 버거와 같이 주문했다는 사실에 대한 정보를 시스템에 전달 해야 합니다. 우리는 이 정보를 시스템에 제공하고 나중에 Siri가 특정 시간에 우리에게 이 특정 주문을 제안할 수 있습니다.
- 마지막으로 해야 할 일은 사용자가 이전에 정의된 명령(예: "Burger time")을 Siri에게 말할 때 또는 사용자가 잠금 화면에서 Siri가 제안한 바로 가기를 눌렀을 때 발생하는 이 바로 가기를 처리하는 것입니다.
자, 코드를 작성해 볼까요? 개발자로서 우리의 가능성은 무엇입니까?

NSUserActivity — 새 주문을 만들기 위한 화면을 시작할 수 있는 바로 가기를 만듭니다.
- Info.plist에 키 추가
<key>NSUserActivityTypes</key> <배열> <string>com.miquido.SiriShotcutDemo.make-order</string> </배열>
2. 사용자가 화면에 들어오면 바로가기 기부
let orderActivity = NSUserActivity(activityType: "com.miquido.SiriShotcutDemo.make-order") orderActivity.persistentIdentifier = NSUserActivityPersistentIdentifier("com.miquido.SiriShotcutDemo.make-order") orderActivity.isEligibleForSearch = true orderActivity.isEligibleForPrediction = true orderActivity.title = "주문하기" orderActivity.suggestedInvocationPhrase = "버거 시간" let 속성 = CSSearchableItemAttributeSet(itemContentType: kUTTypeItem을 문자열로) attributes.contentDescription = "맛있는 버거!" attribute.thumbnailData = UIImage(이름: "로고")?.pngData() orderActivity.contentAttributeSet = 속성 사용자 활동 = 주문 활동
3. AppDelegate
에서 이 특정 유형을 얻은 후 지정된 화면으로 리디렉션되는 continueUserActivity
대리자를 구현해야 합니다.
func 응용 프로그램(_ 응용 프로그램: UIApplication, 계속 userActivity: NSUserActivity, restoreHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool { if userActivity.activityType == "com.miquido.SiriShotcutDemo.make-order" { // 주문 화면에서 열린 앱 처리 true를 반환 } 거짓을 반환 }

Intents — 주문을 위한 바로 가기를 구현합니다.
구현 전 전문가 팁:
의도는 사용자가 체계적으로 무언가를 할 때 나타납니다. 그러나 항상 Siri의 제안을 받을 수 있도록 이 기능을 테스트하려면 설정 -> 개발자에서 " 최근 단축키 표시 " 및 " 잠금 화면에 기부 표시 "의 두 가지 옵션을 활성화해야 합니다.

- 인텐트 정의 파일을 만듭니다. 가장 좋은 방법은 이를
OrderKit
에 있는 내 프로젝트의 별도 프레임워크에 추가하는 것입니다.

2. 범주를 선택합니다(이 경우 "주문"). 이 파일에서 시스템에 전달할 매개변수를 선택하고 이러한 매개변수의 조합을 만들어야 합니다.


3. 의도에 대한 확장을 사용하여 새 대상을 만들고 생성할 때 "UI 확장 포함"을 선택합니다.


Order.intentdefinition
에 대한 대상 멤버십의 모양입니다. 4. MainInterface.storyboard
파일에서 인텐트에 대한 UI를 만듭니다.


5. IntentViewController
에서 ready
및 success
상태를 구성합니다.
func configureView(매개변수의 경우: Set<INParameter>, 상호작용: IN상호작용, InteractiveBehavior: INUIInteractiveBehavior, 컨텍스트: INUIHostedViewContext, 완료: @escaping (Bool, Set<INParameter>, CGSize) -> Void) { 가드 의도 = 상호 작용.의도? 주문 의도 기타 { 완료(거짓, Set(), .zero) 반품 } 만약 상호작용.intentHandlingStatus == .ready { 설정(with: 의도) waitTime.isHidden = 참 완료(true, 매개변수, desiredSize) } 그렇지 않으면 상호 작용.intentHandlingStatus == .success, 하자 응답 = 상호 작용.intentResponse? 주문 의도 응답 { 설정(with: 의도) waitTime.isHidden = 거짓 waitTimeText = response.waitTime { waitTime.text = "주문은 \(waitTimeText)분 안에 준비됩니다" } EverythingIsOkLabel.text = "주문을 보려면 탭하세요." 완료(true, 매개변수, desiredSize) } 완료(거짓, 매개변수, .0) } private func setup(withintent: OrderIntent) { burgerNameLabel.text = 의도.burgerName 수량 = intent.quantity?.stringValue { 수량라벨.텍스트 = "\(수량) 개." } 추가 사항 = intent.additions { 추가 라벨.텍스트 = 추가.요소.toString } }
6. UI를 생성한 후, 우리는 우리의 의도 기부에 갈 수 있습니다. 이 경우 주문 시 기부의향을 전달하는 것이 가장 좋습니다. 우리는 이전에 Order.intentdefinition
파일에서 정의한 모든 정보를 시스템에 제공합니다. 즉, 버거 이름, 수량 및 추가 사항, 주문할 때 이 바로 가기를 Siri에 즉시 추가하려는 경우에 표시되는 제안된 문구 .
private func donateInteraction(주문: 주문) { let 상호 작용 = INInteraction(의도: order.intent, 응답: nil) 상호 작용.기부 { (오류) 오류가 발생하면 != nil { // 오류 처리 } 또 다른 { print("성공적으로 기부한 상호작용") } } }
공개 확장 주문 { var 의도: 주문 의도 { orderIntent = OrderIntent() orderIntent.burgerName = 이름 intValue = Int(수량) { orderIntent.quantity = NSNumber(값: intValue) } orderIntent.suggestedInvocationPhrase = "버거 시간" orderIntent.additions = 추가.맵 { 옵션 -> INObject 반환 INObject(식별자: option.rawValue, 표시: option.rawValue) } 반품 주문 의도 } }
7. 이제 사용자가 바로 가기 제안을 받고 클릭했을 때와 사용자가 Siri로 바로 가기를 호출하는 경우에 발생하는 상황을 처리할 수 있습니다.
공개 클래스 OrderIntentHandler: NSObject, OrderIntentHandling { 공개 함수 확인(의도: OrderIntent, 완료: @escaping (OrderIntentResponse) -> 무효) { 완료(OrderIntentResponse(코드: OrderIntentResponseCode.ready, userActivity: nil)) } 공개 함수 핸들(의도: OrderIntent, 완료: @escaping (OrderIntentResponse) -> 무효) { 가드 let burgerName = intent.burgerName else { 완료(OrderIntentResponse(코드: .failure, userActivity: nil)) 반품 } Defaults.save(order: Order(from: 의도)) 완료(OrderIntentResponse.success(burgerName: burgerName, waitTime: "5")) } }

그게 다야, 모든 것이 작동한다
여기 내 GitHub에서 전체 프로젝트를 확인할 수 있습니다.
출처:
- 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-shortcuts-tutorial-in-ios-12