Siri 바로 가기 - 구현 방법은 무엇입니까?

게시 됨: 2020-01-16

작년 WWDC에서 선보인 새로운 기능인 Siri 바로가기는 백그라운드에서 애플리케이션의 특정 기능을 수행하는 기능을 제공합니다. 응용 프로그램에서 이러한 기능을 사용하기 위해 응용 프로그램을 켤 필요가 없습니다. 예를 들어 Siri에게 "Burger Time"이라고 말하면 시스템은 이 단축키가 할당된 응용 프로그램을 알고 우리를 위해 햄버거를 주문합니다.

Siri 단축키는 무엇입니까?

  • 잠금 화면 또는 검색 영역에서 작업을 수행하는 편리한 방법입니다.
  • iOS, HomePod 및 watchOS에서 음성 문구로 실행하기 위해 Siri에 단축키를 추가할 수도 있습니다.
  • 개발자는 Siri가 이러한 바로 가기에 연결할 수 있도록 앱에 바로 가기 후크를 추가합니다.
  • 행동의 기계 학습 모델을 사용하여 수행하는 일반적인 기능을 분석하고 자동으로 바로 가기를 제안합니다.
  • iOS 12 이상

이 기사에서는 Siri 바로 가기의 가장 인기 있는 응용 프로그램 중 하나인 주문 바로 가기의 구현에 중점을 둘 것입니다. 햄버거를 주문할 수 있는 간단한 응용 프로그램을 만들 것입니다.

Siri 바로 가기를 어떻게 만들 수 있습니까?

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

자, 코드를 작성해 볼까요? 개발자로서 우리의 가능성은 무엇입니까?

NSUserActivity & Intents - Siri 단축키의 예

NSUserActivity — 새 주문을 만들기 위한 화면을 시작할 수 있는 바로 가기를 만듭니다.

  1. 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를 반환
    } 
    거짓을 반환
} 
버거 주문 시 Siri 바로가기 구현 과정

Intents — 주문을 위한 바로 가기를 구현합니다.

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

옵션: 잠금 화면에 최근 바로 가기 표시 및 기부금 표시
  1. 인텐트 정의 파일을 만듭니다. 가장 좋은 방법은 이를 OrderKit 에 있는 내 프로젝트의 별도 프레임워크에 추가하는 것입니다.
SiriKit 의도 정의 파일 아이콘

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

사용자 정의 의도, 매개변수 및 바로 가기 유형
주문 정의 – 맞춤 의도 생성
주문 정의 — 응답 정의
주문 정의 — 응답 정의

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

인텐트 확장 아이콘
파일 -> 새로 만들기 -> 대상... -> 의도 확장
이것은 Order.intentdefinition 에 대한 대상 멤버십의 모양입니다.

4. MainInterface.storyboard 파일에서 인텐트에 대한 UI를 만듭니다.

인텐트에 대한 UI 만들기
의도를 위한 UI 만들기

5. IntentViewController 에서 readysuccess 상태를 구성합니다.

 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"))
    }
    
} 
Siri 바로가기 데모

그게 다야, 모든 것이 작동한다

여기 내 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