인라인 인벤토리

Android 앱용 앱 작업을 구현할 때 테마의 변형인 요청을 처리해야 할 수 있습니다. 예를 들어 사용자가 어시스턴트에 "Hey Google, Example 앱에서 달리기 시작해 줘"와 같이 말하여 다양한 운동을 시작할 수 있도록 피트니스 앱이 START_EXERCISE 내장 인텐트 (BII)를 구현한다고 가정해 보겠습니다.

이 인텐트를 처리하려면 '조깅', '스프린트', '레이스'와 같은 변형을 포함하여 각 유형의 운동을 처리하는 요청 매칭 로직이 필요합니다. 이 로직은 지원되는 운동이 증가함에 따라 복잡해집니다.

START_EXERCISE와 같이 지원되는 BII의 경우 인라인 인벤토리를 사용하여 이렇게 복잡한 일치 로직을 피할 수 있습니다. 인라인 인벤토리는 앱의 기능과 콘텐츠를 나타내는 shortcuts.xml에 정의된 정적 Android 바로가기 집합입니다.

각 바로가기에는 항목 식별자와 사용자가 항목을 참조하는 방식의 변형을 나타내는 동의어 목록이 포함됩니다. 호출 중 BII는 사용자 제공 BII 매개변수를 동의어 목록과 비교합니다. 일치하는 항목을 찾으면 BII 매개변수가 일치하는 바로가기의 항목 식별자로 업데이트됩니다.

인라인 인벤토리를 사용하면 Google 어시스턴트가 앱 작업 호출 중에 애플리케이션에 제공되는 BII 매개변수 값을 간소화할 수 있습니다.

인라인 인벤토리는 BII 매개변수의 참고표와 같이 작동하여 개발자가 정의한 항목 식별자를 사용하여 사용자가 앱의 기능이나 콘텐츠를 참조하는 다양한 방법을 표현합니다. 처리에서 BII 매개변수의 항목 식별자를 예측할 수 있도록 하여 앱의 요청 매칭 로직을 단순화합니다.

인라인 인벤토리 사용자 플로우 다이어그램
그림 1. 인라인 인벤토리를 사용하여 앱에서 지원되는 운동 유형에 관해 사용자가 제공한 운동 이름을 해석하는 START_EXERCISE 기능의 흐름 다이어그램

제한사항 및 대안

인라인 인벤토리 바로가기에는 다음과 같은 제한사항이 있습니다.

  • 바로가기 제한: 앱당 최대 1,000개의 인라인 인벤토리 바로가기를 정의할 수 있습니다.
  • 동의어 제한: 각 인라인 인벤토리 바로가기는 최대 20개의 동의어 값을 포함할 수 있습니다.
  • 정적 정의: 인라인 인벤토리 바로가기는 shortcuts.xml에서 정적으로 선언되며 앱의 새 버전을 게시하여 사용자를 위해서만 업데이트할 수 있습니다.

정적 구성의 요구사항을 고려할 때 인라인 인벤토리는 메뉴 항목이나 버스 경로, 음료 크기와 같이 자주 변경되지 않으며 맞춤설정되지 않은 앱 정보를 어시스턴트로 확장하는 데 가장 적합합니다. 다른 콘텐츠 유형의 경우 다음과 같은 대안을 고려하세요.

  • 웹 인벤토리: 사용자 쿼리를 지원되는 앱 콘텐츠 식별자와 일치시킬 때 어시스턴트가 공개 웹 콘텐츠를 쿼리할 수 있습니다. 웹 인벤토리 쿼리는 호출 중에 실시간으로 발생하므로 제품 카탈로그, 소셜 미디어 게시물, 기타 자주 업데이트되는 콘텐츠를 어시스턴트로 확장할 수 있습니다.

  • 동적 바로가기: 맞춤설정된 앱 콘텐츠의 인벤토리를 어시스턴트로 확장합니다. 동적 바로가기를 통해 사용자는 음식 주문 앱에서 좋아하는 음료를 재정렬하거나 메모 작성 앱에서 쇼핑 목록을 불러오는 것과 같은 일반적인 작업을 빠르게 재생할 수 있습니다.

인라인 인벤토리 만들기

인라인 인벤토리는 사용자가 앱의 콘텐츠와 기능을 요청하는 다양한 방식을 애플리케이션에서 예상하는 예측 가능한 식별자로 변환할 수 있는 편리한 방법을 어시스턴트에 제공하여 개발을 간소화합니다. 예를 들어 앱에서 사용자가 음성으로 시작할 수 있는 다양한 운동을 제공하고, 사용자가 동일한 운동 유형에 다음과 같은 요청을 할 것으로 예상한다고 가정해 보겠습니다.

  • Hey Google, ExampleApp에서 달리기 시작해 줘
  • Hey Google, ExampleApp에서 조깅 시작해 줘

인라인 인벤토리 바로가기에서 shortcutId을 앱에서 예상하는 운동 식별자인 "CARDIO_RUN"로 설정합니다. 그런 다음 '달리기'와 '조깅'을 shortcutId와 연결된 동의어로 지정합니다. 그런 다음 사용자가 위의 쿼리로 앱 작업을 트리거하면 어시스턴트는 처리 인텐트를 생성할 때 BII 매개변수에 "CARDIO_RUN" 식별자를 사용합니다.

샘플 app/res/shortcuts.xml 파일의 다음 스니펫은 이 사례를 구현합니다.

<capability android:name="actions.intent.START_EXERCISE">
  <intent
    android:targetPackage="com.example.myapp"
    android:targetClass="com.example.myapp.ExerciseActivity">
    <parameter android:name="exercise.name" android:key="exercise" />
  </intent>
</capability>

<shortcut android:shortcutId="CARDIO_RUN">
  <capability-binding android:key="actions.intent.START_EXERCISE">
    <parameter-binding
      android:key="exercise.name"
      android:value="@array/run_names" />
    </capability-binding>
</shortcut>

이전 샘플에서 인라인 인벤토리 shortcut<capability-binding> 요소 내에서 <parameter-binding> 태그를 선언하여 <capability>에 정의된 exercise.name BII 매개변수에 바인딩합니다.

문자열 배열 리소스 @array/run_names는 어시스턴트가 인식하고 "CARDIO_RUN" 항목 ID에 매핑하는 res/values/arrays.xml의 동의어 목록을 지정합니다.

<!-- Synonym values for "CARDIO_RUN" inline inventory -->
<resources>
  <string-array name="run_names">
    <item>Run</item>
    <item>Jog</item>
    <item>Sprint</item>
  </string-array>
</resources>

기능에 <url-template>가 제공되면 일치하는 값의 shortcutId가 생성된 URL의 매개변수 자리표시자에 삽입됩니다. 샘플 app/res/shortcuts.xml 파일의 다음 코드가 이러한 사례를 구현합니다.

<capability android:name="actions.intent.START_EXERCISE">
  <intent>
    <url-template android:value="myapp://workout{?exercise}" />
    <parameter android:name="exercise.name" android:key="exercise" />
  </intent>
</capability>

<shortcut android:shortcutId="CARDIO_RUN">
  <capability-binding android:key="actions.intent.START_EXERCISE">
    <parameter-binding
      android:key="exercise.name"
      android:value="@array/run_names" />
  </capability-binding>
</shortcut>

위 샘플에서 어시스턴트는 처리 딥 링크 myapp://workout?exercise=CARDIO_RUN를 생성합니다.

바로가기 인텐트를 사용한 처리

기본적으로 바로가기는 바로가기의 <capability-binding> 태그에 선언된 대로 일치하는 인라인 인벤토리 값의 shortcutId를 바로가기가 바인딩된 capabilityintent에 제공합니다. 또는 capability<shortcut-fulfillment> 태그를 추가하여 바로가기 자체에 정의된 intent가 처리에 사용되도록 지정할 수 있습니다.

샘플 app/res/shortcuts.xml 파일의 다음 코드는 바로가기 처리를 구현합니다.

<capability android:name="actions.intent.START_EXERCISE">
  <shortcut-fulfillment>
    <parameter android:name="exercise.name"/>
  </shortcut-fulfillment>
</capability>

<shortcut android:shortcutId="CARDIO_RUN">
  <capability-binding android:key="actions.intent.START_EXERCISE">
    <parameter-binding
      android:key="exercise.name"
      android:value="@array/run_names" />
  </capability-binding>
  <intent android:targetPackage="com.example.myapp"
    android:targetClass="com.example.myapp.ExerciseActivity">
    <parameter android:name="exercise.name" android:key="exercise" />
  </intent>
</shortcut>

위 샘플에서 사용자 쿼리가 exercise.name 매개변수의 인라인 인벤토리 값과 일치하면 <shortcut-fulfillment> 태그는 결합된 바로가기의 intent가 처리에 사용되도록 지정합니다.

공개 앱 기능 BII의 인라인 인벤토리

인라인 인벤토리는 일반적으로 이를 지원하는 BII의 선택적 기능이지만 OPEN_APP_FEATURE와 같은 특정 BII에는 필수입니다. 흔히 사용되는 BII를 통해 사용자는 어시스턴트를 사용하여 특정 앱 기능에 딥 링크로 연결할 수 있습니다. 앱 기능 열기 BII에는 사용자를 앱에 딥 링크로 연결하기 전에 사용자가 요청한 기능이 있는지 확인하기 위해 앱 기능 이름의 인라인 인벤토리가 필요합니다.

샘플 app/res/shortcuts.xml 파일의 다음 코드는 앱의 주문 상태 기능을 나타내는 단일 바로가기로 이 BII를 구현합니다.

<capability android:name="actions.intent.OPEN_APP_FEATURE">
  <intent
    android:targetPackage="com.example.myapp"
    android:targetClass="com.example.myapp.MyClass">
    <parameter
       android:name="feature"
       android:key="featureParam" />
  </intent>
  <!-- Required fallback fulfillment to handle when parameters are missing from user query. -->
  <intent
    android:targetPackage="com.example.myapp"
    android:targetClass="com.example.myapp.MyClass">
    <parameter
       android:name="HOME_SCREEN"
       android:key="featureParam" />
  </intent>
</capability>

<!-- Inline inventory for OPEN_APP_FEATURE. -->

<shortcut android:shortcutId="ORDER_STATUS">
  <capability-binding android:key="actions.intent.OPEN_APP_FEATURE">
    <parameter-binding
      android:key="feature"
      android:value="@array/order_status_names" />
    </capability-binding>
</shortcut>

res/values/arrays.xml의 문자열 배열 리소스인 @array/order_status_names는 이 기능의 동의어 목록을 지정합니다.

<resources>
  <string-array name="order_status_names">
    <item>Order status</item>
    <item>Orders</item>
    <item>Order history</item>
  </string-array>
</resources>

위의 기능이 준비되면 어시스턴트는 동일한 기능에 관한 다양한 문구를 처리할 수 있습니다.

  • "Hey Google, Example App에서 주문 상태 보여 줘."
  • "Hey Google, ExampleApp에서 내 주문 보여 줘."
  • "Hey Google, ExampleApp에서 주문 내역 보여 줘."

인라인 인벤토리 테스트

관련 앱 작업 기능을 처리하면서 어시스턴트가 애플리케이션에 제공하는 BII 매개변수 값을 검사하여 인벤토리를 테스트합니다. 인라인 인벤토리는 인벤토리에 결합된 BII 매개변수의 사용자 제공 값을 일치하는 인라인 인벤토리 바로가기의 shortcutId로 대체하는 방식으로 작동합니다.

예를 들어 START_EXERCISE BII 기능은 인라인 인벤토리를 사용하여 사용자 제공 BII 매개변수 '달리기'를 상응하는 운동 ID인 "CARDIO_RUN"로 변환할 수 있습니다.

Google 어시스턴트 플러그인을 사용하면 테스트 기기의 어시스턴트에서 인라인 인벤토리 앱 작업을 미리 볼 수 있습니다. 다음 단계에 따라 플러그인을 사용하여 인벤토리를 테스트하세요.

  1. 인라인 인벤토리와 연결된 동의어 값으로 BII 기능의 인벤토리에 바인딩된 매개변수를 구성합니다.
  2. 플러그인에서 BII를 트리거하여 테스트 기기에서 호출합니다.
  3. 앱 작업 처리 중에 어시스턴트가 애플리케이션에 제공하는 결과 매개변수 값을 검사합니다.