-
앱 스키마로 지능형 Siri 경험 빌드하기
앱 인텐트를 사용하여 앱 콘텐츠와 동작을 Siri에 연동하세요. 앱 엔티티를 사용하여 데이터를 모델링하고, 앱 스키마를 도입해 강력한 시스템 동작을 구현하며, Apple Intelligence로 구동되는 자연어 상호작용을 지원하세요. 시맨틱 검색을 활성화하고, 다양한 앱에 걸쳐 작업을 수행하며, 화면 내용 인지와 콘텐츠 전송을 사용하여 상황에 맞는 경험을 선사하는 방법을 살펴보세요. 빠르고 신뢰할 수 있는 Siri 경험을 빌드하기 위한 모범 사례와 테스트 도구를 확인하세요.
챕터
- 0:00 - Introduction
- 1:06 - What's new in Siri
- 4:06 - Contributing content with App Entities
- 6:21 - Entity resolution and IndexedEntity
- 9:49 - Making actions available
- 12:03 - Adopting a schema domain in UnicornChat
- 15:39 - Moving content across apps
- 16:00 - Working across apps: onscreen awareness
- 21:09 - Best practices
- 24:18 - Testing your integration
- 26:21 - Next steps
리소스
- Integrating your messaging app with Apple Intelligence
- Donating your app’s data and actions to the system
- Making app entities available in Spotlight
- Making actions and content discoverable by Apple Intelligence
- Providing contextual cues to Apple Intelligence and Siri
- Apple Intelligence and Siri AI
- Messages
- App schema domains
관련 비디오
WWDC26
-
비디오 검색…
안녕하세요, 저는 Swift Intelligence Frameworks 팀의 소프트웨어 엔지니어 Dan Niemeyer입니다 오늘은 Apple Intelligence로 구동되는 새로운 기능을 사용해 앱을 Siri에 연동하는 방법을 보여드리겠습니다 27번 릴리스에서 Siri는 더욱 강력하고 더 맥락적이며 더 개인화됩니다 이를 가능하게 하는 기반은 App Intents입니다
오늘 다룰 내용입니다 Siri와 App Intents의 새로운 기능부터 시작합니다 Siri가 앱의 콘텐츠를 이해하는 방법과 Siri가 콘텐츠를 이해할 때 작업을 수행할 수 있도록 하는 방법입니다
세션 후반부에는 여러 앱에 걸친 사용 사례를 다루겠습니다 예를 들어 여러 앱에서 작업하거나 Siri에게 아내에게 비행기 티켓을 문자로 보내달라고 하거나 이 사진에 시네마틱 필터를 적용하는 것 등입니다 그리고 앱을 Siri에 연동하는 모범 사례도 공유하겠습니다 시스템이 앱의 기능을 이해할 수 있도록 확장하는 방법입니다
내용이 많으니 바로 시작하겠습니다
27번 릴리스에서 Siri가 크게 도약합니다 Apple Intelligence가 이를 뒷받침합니다 Apple Intelligence는 사람들이 더 창의적이고 생산적으로 일할 수 있도록 돕는 개인 인텔리전스 플랫폼입니다 개발자가 Apple Intelligence에 참여하는 방식은 App Intents 프레임워크를 통해서입니다 App Intents는 Apple Siri와 Apple Intelligence를 통합하는 기반이며 앱이 할 수 있는 것과 앱이 관리하는 콘텐츠를 구조화된 방식으로 설명하는 수단을 제공합니다 오늘 제가 이야기하는 모든 것은 App Intents를 기반으로 합니다
App Intents가 처음이라면 다음 영상들을 먼저 시청하시기를 강력히 권장합니다 기본 사항을 더 자세히 다룹니다
올해 Siri는 세 가지 핵심 방면에서 더욱 강력해졌습니다 Siri가 이제 앱의 엔티티에 접근할 수 있게 됩니다 앱 내부의 실제 의미 있는 콘텐츠입니다 이를 통해 "다음 미팅이 언제 어디서 열리나요?"와 같은 질문이 가능해집니다 Siri가 앱의 미팅이 무엇인지 이해하여 직접 답변할 수 있습니다 앱에서 미팅이 무엇인지 어떤 미팅이 관련 있는지 어떤 속성을 반환할지 예를 들어 시간과 위치를 파악합니다
Siri가 앱의 인텐트를 사용해 작업을 수행할 수 있습니다 예를 들어 "최근 보고서를 Mary에게 보내줘"라고 말할 수 있습니다 이렇게 하면 그냥 물어보는 것만으로 이메일을 보낼 수 있습니다 인텐트는 앱이 지원하는 작업과 필요한 매개변수 실행이 안전한 시점을 설명합니다 Siri가 언어 이해를 담당합니다 앱은 작업에만 집중하면 됩니다
Siri는 화면 상의 맥락도 이해할 수 있습니다 예를 들어 "이 텍스트를 설명해줘"나 "이 제품의 리뷰를 가져와줘"처럼 말할 수 있습니다 화면에 있는 내용을 설명하는 엔티티로 뷰에 주석을 달면 Siri가 어떤 콘텐츠가 의미 있는지 이해할 수 있습니다 어떤 엔티티를 나타내는지, 어떤 작업이 적용되는지도 파악합니다 이를 통해 사람들에게 더욱 맥락적인 대화 경험을 제공합니다 자연스럽고 강력한 경험이 됩니다
Siri의 새 기능, 콘텐츠 찾기, 작업 수행의 미리보기였습니다 작업 수행, 화면 내용 이해까지 살펴봤습니다 이제 실제 앱에서 이를 구체화할 시간입니다
이 영상의 나머지 부분에서는 UnicornChat이라는 샘플 앱으로 작업합니다
UnicornChat은 사람들이 대화할 수 있는 메시징 앱입니다 Bubbles, Flare, Glow 같은 가상의 유니콘 캐릭터들과 채팅할 수 있습니다 오늘 다루는 개념을 보여주기에 충분한 기능을 갖추고 있습니다 오늘 제가 다루는 개념을 보여주기 위한 앱입니다 메시징 앱이지만 동일한 아이디어가 다양한 다른 도메인의 앱에도 적용됩니다 Apple Developer 웹사이트에서 샘플을 다운로드하여 따라하실 수 있습니다 새로운 기능과 사용할 앱을 살펴봤으니 이러한 기능을 앱에 도입하는 방법을 이야기해보겠습니다 모든 App Intents 기반 경험의 중심에는 하나의 핵심 개념인 앱 엔티티가 있습니다 AppEntity는 앱 내부 콘텐츠의 구조화된 표현입니다 앱 내부 콘텐츠를 나타냅니다 구체적으로 설명하자면 앱이 매일 다루는 데이터를 생각해보세요
캘린더 앱이 있다면 각 이벤트가 엔티티입니다 메일 앱이 있다면 각 메시지가 엔티티입니다 사진 앱이 있다면 각 사진과 각 앨범이 엔티티입니다
앱 엔티티는 세 가지 중요한 것을 설명합니다 대상이 무엇인지, 어떻게 식별되는지, 제목처럼 어떤 속성이 중요한지 날짜나 텍스트 같은 속성입니다
새로운 데이터 모델이 아닙니다 기존 콘텐츠를 설명하는 방법입니다 시스템이 이해할 수 있도록 하기 위한 것입니다
엔티티 모델링은 첫 번째 단계이지만 그것만으로는 Siri가 찾거나 이야기하기에 충분하지 않습니다 Siri가 엔티티가 무엇인지, 어떤 범주를 나타내는지 이해하려면 엔티티가 AppSchema를 준수해야 합니다
앱 스키마는 메시지, 연락처, 문서 같은 일반적인 개념에 대한 Siri의 사전 정의된 이해를 제공합니다 엔티티가 스키마를 준수하면 Siri가 이미 어떻게 추론할지 알고 있습니다
앱을 블랙박스로 취급하는 대신 Siri가 사용자가 무엇에 대해 이야기하는지 추론할 수 있습니다 UnicornChat에서 앱의 명사는 Contact, Conversation, Message입니다 세 가지 모두 앱 스키마를 준수하는 앱 엔티티로 모델링됩니다 이를 통해 Siri가 다음과 같은 질문을 이해할 수 있습니다 "Flare로부터 받은 마지막 메시지 보여줘" Flare는 연락처 중 하나입니다 또는 "UnicornChat에서 Glow와 대화 열어줘" 또 다른 유니콘 친구입니다
콘텐츠를 앱 엔티티로 모델링했다면 다음 질문은 Siri가 올바른 것을 어떻게 찾느냐입니다 엔티티 해석은 Siri가 사용자가 말하는 것을 해석하는 방법입니다 앱 내부의 실제 앱 엔티티로 변환합니다
예를 들어 사용자가 "UnicornChat에서 Glow와 대화 열어줘"라고 하면 Siri는 Glow가 특정 유니콘을 가리킨다고 해석합니다 일치하는 연락처를 찾고 엔티티를 채웁니다 속성 값과 함께 이름과 식별자 같은 속성입니다 시스템이 사용할 수 있도록 합니다 하지만 사람들이 항상 정확한 이름으로 요청하는 것은 아닙니다 개념과 설명으로 이야기합니다 누군가 이런 말을 할 때 "Carmel에서 최고의 윈드서핑" 정확한 텍스트 일치를 찾는 것이 아닙니다 의미를 표현하는 것입니다 그 경험을 지원하려면 Siri에게 문자열 매칭 이상의 것이 필요합니다 시맨틱 검색이 필요합니다 바로 그것이 IndexedEntity가 가능하게 하는 것입니다
엔티티 해석을 구동하는 기본 방법은 IndexedEntity를 채택하는 것입니다 이렇게 하면 앱의 엔티티가 시스템 시맨틱 인덱스에 색인됩니다 Siri가 텍스트뿐 아니라 의미를 기반으로 일치시킬 수 있습니다 엔티티 간의 관계도 이해하고 콘텐츠에 대한 질문에도 답할 수 있습니다 예를 들어 "Flare와 영화에 대해 나눈 메시지 보여줘" 이것은 문자열 매칭이 아닙니다 Siri가 영화 제목을 언급한 메시지를 찾을 수 있습니다 UnicornChat의 색인된 메시지에 대해 시맨틱 쿼리를 수행하기 때문입니다 이 동작을 얻는 방법은 스키마화된 엔티티가 IndexedEntity 프로토콜을 준수하게 하는 것입니다
indexingKey는 Spotlight에 메시지 본문처럼 어떤 속성이 검색 가능해야 하는지 알려줍니다 검색 가능해야 하는지 알려줍니다
색인이 완료되면 Siri가 콘텐츠를 검색하고 추론하며 항목을 검색하는 것을 넘어 질문에 답하는 데 활용할 수 있습니다
IndexedEntity는 시맨틱 매칭으로 최상의 Siri 경험을 제공합니다 후속 질문이 줄어들고 더 자연스러운 언어 이해가 가능합니다 하지만 모든 것을 색인할 수 있는 건 아닙니다 데이터셋이 크거나 서버에 있거나 미리 색인하기에는 너무 자주 변경될 수 있습니다 그런 경우에는 EntityStringQuery를 사용할 수 있습니다 문자열 쿼리를 사용하면 Siri가 사용자의 입력을 전달합니다 앱이 일치하는 엔티티를 찾아서 반환하는 책임을 집니다
시맨틱 이해는 얻지 못하지만 앱의 엔티티를 검색하고 일치시키는 방법에 대한 완전한 제어권을 가집니다
이 모든 것을 종합하면 앱의 콘텐츠를 앱 엔티티로 모델링하는 것부터 시작하세요 각 엔티티가 AppSchema를 준수하게 해서 Siri가 어떤 종류의 것인지 이해할 수 있도록 하세요 데이터를 색인할 수 있다면 IndexedEntity를 채택하세요 색인이 어렵다면 EntityStringQuery를 사용하세요 이를 통해 질문에 답하거나 콘텐츠를 즉시 찾는 등 강력한 경험이 가능해집니다 하지만 엔티티 자체만으로는 단순한 정보입니다 엔티티와 작업을 결합할 때 진정으로 흥미로워집니다
App Intents는 앱이 시스템에 작업을 노출하는 방법입니다 하지만 모든 작업이 동일하게 처리되지는 않는다는 점이 중요합니다 그래서 이것을 두 부분으로 나누겠습니다
앱 인텐트를 정의하면 그 작업이 시스템 전반에 걸쳐 나타날 수 있습니다 Shortcuts, Spotlight, Widgets 등 다양한 곳에서 볼 수 있습니다 이는 사람들이 앱의 작업을 찾고 실행할 수 있다는 의미입니다 Siri 없이도 다양한 곳에서 가능합니다
작업이 무엇을 하는지 설명하고 매개변수를 정의하며 동작을 구현합니다 시스템이 이를 표면화하고 제안하고 연결하는 것을 처리합니다 시스템 경험에 통합됩니다 이것은 매우 강력하며 큰 혜택을 제공합니다 앱과 사용자 모두에게 좋습니다 하지만 몇 가지 추가 단계를 통해 더 많은 가치를 제공할 수 있습니다 작업을 Siri에 연동하는 것입니다
엔티티가 앱 스키마를 사용해 이해되는 것처럼 작업은 스키마를 사용해 Siri가 실행할 수 있게 됩니다 스키마를 App Intents의 특수화로 생각하세요 여전히 App Intents이지만 Siri가 처리하는 방법을 아는 형태로 구성됩니다
스키마는 Siri가 이해하는 작업의 종류를 정의합니다 예상하는 구조 그리고 해당 작업이 자연어에 매핑되는 방식입니다 이것이 Siri가 다음과 같은 명령을 자신 있게 처리할 수 있게 해줍니다 "Mary에게 메시지 보내줘" 또는 "집중 재생목록 재생해줘" 개별 스키마는 개별 작업을 정의합니다 하지만 앱은 보통 완전한 세트가 필요합니다 그래서 스키마는 AppSchema 도메인으로 그룹화됩니다 각 도메인은 작업의 카테고리를 나타냅니다 메일, 사진, 메시지 등입니다 도메인에 통합하면 사전 정의된 앱 스키마 세트를 구현합니다 앱의 기능에 매핑하면 Siri가 즉시 해당 도메인에서 앱에 대해 이야기하는 방법을 알게 됩니다 도메인을 앱과 Siri 간의 계약 카테고리로 생각하세요 앱이 무엇을 할 수 있는지 어떤 작업이 가능한지 Siri에게 알려줍니다 시스템이 어떻게 반응해야 하는지도 알려줍니다
앱 스키마 작동 방식에 대한 자세한 내용은 WWDC24 영상을 확인하세요
일반 App Intents와 시리즈별 앱 스키마의 차이를 이해했으니 이 도메인 중 하나를 채택해서 UnicornChat에서 처음부터 끝까지 연결하는 실습을 해봅시다
전과 마찬가지로 모든 것은 엔티티에서 시작합니다 UnicornChat에서 메시지를 보내기 위해 필요한 두 가지를 이미 모델링했습니다
수신자를 나타내는 Contacts 이름과 식별자 같은 속성을 노출합니다
그리고 메시지 본문과 작성자 같은 내용을 캡처하는 message입니다
이것들은 앱 엔티티로 Siri에게 메시지가 누구에게 가는지 무엇이 전송되는지 알려줍니다 이제 해당 엔티티를 작업에 연결하는 방법을 보여드리겠습니다 앱 스키마를 채택해서 연결합니다
Xcode에서 스키마 이름을 입력하는 것으로 시작합니다 Xcode는 도메인별로 그룹화된 모든 사용 가능한 앱 스키마를 알고 있습니다 도메인별로 그룹화됩니다 자동 완성으로 원하는 것을 정확히 선택할 수 있습니다
메시징 기능을 구축 중이므로 messages 도메인에서 sendMessage 스키마를 선택합니다
커스텀 인텐트 구조를 만드는 대신 Siri가 이미 이해하는 스키마를 채택하고 UnicornChat의 기존 로직에 매핑합니다 이것은 Siri에게 작업이 무엇을 하는지 어떤 매개변수를 예상하는지 알려줍니다 수신자와 메시지 내용처럼요 무언가 빠진 경우 사용자를 안내하는 방법도 알려줍니다
우리가 할 일은 스키마 매개변수를 UnicornChat의 기존 메시징 흐름에 매핑하는 것입니다 먼저 매개변수를 처리합니다
그런 다음 UnicornChat의 인터페이스에 전달합니다 메시지가 실제로 전송됩니다
마지막으로 새로 전송된 메시지를 앱 엔티티로 시스템에 반환합니다
이게 전부입니다
이 작업은 앱 인텐트로 구현되었기 때문에 시스템 전반에서 사용 가능합니다 messages 도메인의 앱 스키마를 준수하기 때문에 Siri가 직접 실행할 수 있습니다 자연어를 직접 처리할 필요가 없습니다 실제로 작동하는 것을 볼까요
여기서 "UnicornChat에서 Glow에게 메시지 보내줘 '어떤 영화를 추천해요?'라고 말해줘"
Siri가 AppEntity 쿼리로 Glow를 해석합니다 인텐트를 호출하고 메시지를 전송합니다
앱을 열지 않아도 됩니다
이것이 앱 스키마의 힘입니다 엔티티가 준비되면 연결하기만 하면 됩니다 잘 정의된 작업에 연결하면 Siri가 나머지를 처리합니다
정리하면 App Intents는 시스템에 작업을 노출합니다 앱 스키마는 해당 작업을 Siri가 이해할 수 있게 합니다 messages 같은 앱 스키마 도메인은 스키마를 강력한 엔드투엔드 경험으로 패키징합니다 도메인을 채택하면 Siri가 앱의 언어를 유창하게 구사할 수 있습니다
지금까지 Siri가 콘텐츠를 이해하고 앱 내에서 작업하는 방법에 집중했습니다 앱 내에서 작업을 취하는 방법입니다 하지만 실제 요청 중 많은 것이 여러 앱에 걸쳐 있습니다
한 앱에서 시작해서 다른 앱으로 이어지다가 다른 곳에서 완료됩니다 예를 들어 "Siri야, Bubbles에서 받은 이 답장을 아내에게 이메일로 보내줘" 이런 경험은 두 가지 기능을 결합합니다 사람들이 무엇을 보고 있는지 이해하는 것과 그 콘텐츠를 다른 앱으로 이동하는 것입니다
두 부분으로 나눠보겠습니다 먼저 Siri는 Bubbles에서 받은 이 답장이 무엇을 가리키는지 이해해야 합니다 화면 인식입니다 그런 다음 Siri는 해당 콘텐츠를 다른 앱에 전달해야 합니다 작업을 수행하기 위해서입니다 이것이 콘텐츠 전송입니다 하나씩 살펴보겠습니다 화면 인식을 활성화하려면 앱이 화면에 보이는 것을 연결합니다 시스템이 이해하는 구조화된 정보와 연결합니다 이것의 핵심은 앱 엔티티입니다 뷰가 엔티티와 연결되면 Siri가 "이 메시지"나 "그 대화" 같은 참조를 명시적으로 이름을 지정하지 않아도 해석합니다 화면 콘텐츠에 주석을 달기 위한 두 가지 API가 있습니다 각각 다른 목적을 위해 사용됩니다 화면에 하나의 주요 항목이 있을 때 UserActivity를 사용하세요 문서 보기나 메시지 작성 같은 경우입니다
동시에 여러 의미 있는 항목이 보일 때 View 주석을 사용하세요 대화의 메시지나 목록의 항목들입니다
이를 달성하는 방법입니다 이 목록의 각 행은 앱의 실제 데이터를 나타냅니다 UnicornChat에서는 메시지입니다 각 메시지 행은 해당하는 메시지 엔티티로 주석이 달립니다 화면에 있는 것을 동일한 엔티티와 명시적으로 연결합니다 이미 인텐트에 사용하고 있는 엔티티입니다 사용자들이 다음과 같이 말할 수 있게 합니다 "이 메시지 편집해줘" 또는 "마지막 것 전달해줘" Siri가 뷰에서 직접 엔티티를 해석합니다 강력한 인앱 경험을 가능하게 합니다 하지만 진정한 힘은 주석과 콘텐츠 전송을 결합할 때 발휘됩니다
콘텐츠 전송은 다른 앱이 엔티티에 작업할 수 있게 해줍니다 Transferable을 사용해 엔티티를 내보내는 방식으로 활성화합니다 이것은 시스템에 콘텐츠를 표현하는 방법을 알려줍니다 다른 앱이 이해할 수 있는 형태로요 예를 들어 "아내에게 이 대화를 문자로 보내줘" 또는 "이 메시지를 요약해줘"
Transferable을 채택하고 IntentValueRepresentation을 제공해서 합니다 UnicornChat에서 ContactEntity를 IntentPerson으로 내보냅니다 내보내지면 시스템이 해당 콘텐츠를 다른 앱의 작업에 전달할 수 있습니다 "이 연락처에 전화해줘" 같은 사용 사례를 가능하게 합니다 앱은 다음에 무슨 일이 일어나는지 알 필요가 없습니다 콘텐츠를 정확하게 설명하기만 하면 됩니다
콘텐츠가 앱으로 들어올 때 보통 두 가지 가능성이 있습니다 그 콘텐츠가 이미 존재하는 것을 가리키거나 완전히 새로운 것을 나타내거나입니다 앱이 어떤 경로를 취할지 결정할 수 있습니다 기존 콘텐츠를 매칭한다면 IntentValueQuery를 사용하세요 새로운 것을 생성한다면 transferRepresentation에서 importing을 사용하세요
들어오는 콘텐츠가 앱의 기존 앱 엔티티로 해석되어야 할 때 IntentValueQuery를 사용하세요 앱의 기존 엔티티로요 개념적으로 이것은 entity query와 매우 유사합니다 하지만 독립적인 엔티티 해석 대신 인텐트 매개변수로 범위가 지정됩니다
이 예에서 UnicornChat은 다른 앱으로부터 IntentPerson을 받습니다 기존 ContactEntity로 매핑하려 합니다 콘텐츠가 이미 앱에 존재하거나 기존 데이터에서 선택하려 할 때 이상적입니다 본질적으로 이렇게 말하는 것입니다 이 들어오는 값이 주어졌을 때 내 엔티티 중 어느 것을 가리키나요?
들어오는 콘텐츠가 앱에 새로운 것을 만들어야 할 때 IntentValueRepresentation importing을 사용하세요 앱에 새로운 것을 만드세요 기존 엔티티로 해석하는 대신 들어오는 값을 변환합니다 완전히 새로운 앱 엔티티로요 UnicornChat에서 이를 통해 필요할 때 IntentPerson으로부터 새 유니콘을 만들 수 있습니다 사용자 관점에서는 콘텐츠가 그냥 작동합니다 하지만 앱은 해당 콘텐츠가 저장되고 관리되는 방식을 제어합니다
콘텐츠를 가져올 때 콘텐츠가 이미 앱에 존재한다면 해석하세요 존재하지 않는다면 가져오세요 많은 앱이 인텐트와 워크플로에 따라 둘 다 사용합니다
정리하면 화면 인식은 Siri가 사용자가 보는 것을 이해하게 합니다 콘텐츠 전송은 해당 콘텐츠가 앱 간에 이동할 수 있게 합니다 함께하면 강력한 멀티 스텝 경험을 가능하게 합니다 모두 앱 엔티티 위에 구축됩니다 앱 인텐트와 스키마입니다 엔티티, 작업, 앱 간 협업을 다뤘으니 모범 사례에 대해 이야기해봅시다 작동하게 하는 것을 넘어 몇 가지 관행이 있습니다 Siri가 앱과 더 잘 작동하게 하고 시간이 지나도 더 탄력적으로 만드는 것입니다 개별 스키마와 API를 독립적으로 채택할 수 있지만 훌륭한 Siri 경험은 이런 요소들이 함께 어떻게 작동하는지에 달려 있습니다 좋은 소식은 혼자서 알아낼 필요가 없다는 것입니다 도구들이 과정에서 도움이 되도록 설계되어 있습니다 데모로 어떤 의미인지 보여드리겠습니다
Xcode로 돌아가서 우리가 중단한 곳에서 계속하겠습니다 지난 데모에서 UnicornChat에서 sendMessage 스키마를 채택했습니다 잘 작동합니다 Siri로 메시지를 보낼 수 있습니다 이제 빌드를 시도해봅시다
빌드 오류가 발생합니다 Xcode가 우리가 sendMessage를 채택했지만 관련 draftMessage 스키마를 채택하지 않았다고 알려줍니다 이것이 중요한 이유는 일부 Siri 시나리오가 완전한 경험을 제공하기 위해 하나 이상의 스키마를 필요로 하기 때문입니다 이것은 단순한 컴파일러 오류가 아니라 설계 힌트입니다 Xcode는 앱이 Siri로 메시지를 보낼 수 있다면 메시지를 초안으로 작성하는 방법도 필요하다는 것을 알고 있습니다 특히 확인이 필요할 때는요 런타임에서 조용히 실패하는 대신 빌드 시스템이 이를 일찍 표면화합니다
오류를 클릭하면 Xcode가 fix-it을 제공합니다
Xcode가 draftMessage 스키마의 샘플 채택을 생성합니다 인텐트 정의를 제공합니다
필수 매개변수와 스텁 구현입니다 모두 올바르게 연결됩니다 여기서부터는 앱별 부분을 채우기만 하면 됩니다 먼저 인텐트를 엔티티에 연결합니다
그런 다음 의존성을 주입합니다
다음으로 입력을 처리합니다
마지막으로 메시지 작성 뷰를 엽니다
이 작업은 UI 상태를 변경하기 때문에 main actor에서 실행해야 합니다
이제 다시 빌드하면 빌드가 성공합니다
스키마 채택을 완료했으며 Siri가 이제 필요한 모든 것을 갖추었습니다 사람들을 전체 메시징 흐름으로 안내하기 위해서입니다
기억해야 할 중요한 점은 Siri 경험이 여러 스키마에 의존하면 Xcode가 알려주고 무엇이 빠졌는지 보여주며 올바른 나머지 단계를 생성하도록 도와줍니다 완전하고 고품질의 통합을 훨씬 쉽게 구축할 수 있습니다 스키마를 채택한 후에는 테스트가 중요해집니다 시작하기 가장 좋은 곳은 AppIntentsTesting입니다 이것은 인텐트를 완전히 격리된 상태에서 실행할 수 있는 새로운 테스트 프레임워크입니다 완전히 격리된 상태로요 Siri 없이도 됩니다 인텐트를 호출하고 매개변수를 전달하며 결과를 검증할 수 있습니다 다른 통합 테스트처럼요 비지니스 로직을 검증하는 가장 빠르고 안정적인 방법입니다 개발 초기에요
"Validate your App Intents adoption with AppIntentsTesting" 영상을 확인해서 더 알아보세요
로직이 탄탄해지면 다음 단계는 Shortcuts 앱입니다 Shortcuts는 인텐트를 위한 구조화된 UI를 제공합니다 매개변수를 검사하고 입력을 조정하며 작업이 사람들에게 어떻게 표시되는지 이해할 수 있습니다 여기서 인텐트의 형태를 검증합니다 무엇을 하는지뿐 아니라 어떻게 구성되고 노출되는지도요 다음으로 Spotlight로 이동하세요 Spotlight는 콘텐츠 통합을 검증하는 곳입니다 엔티티가 올바르게 색인되고 발견 가능하며 링크 가능한지 확인합니다 이를 통해 Siri가 올바른 데이터를 찾을 수 있는지 확인합니다 작업하기 전에요
마지막으로 Siri로 완전한 경험을 테스트하세요 모든 것이 한데 모이는 곳입니다 자연어, 엔티티 해석, 화면 맥락 그리고 앱 간 워크플로입니다 엔드투엔드 테스트는 모든 것이 함께 작동하는지 확인합니다 사용자가 기대하는 방식으로요
이제 앱 엔티티로 콘텐츠를 모델링하는 방법을 보셨습니다 App Intents와 앱 스키마를 사용해 작업을 노출하는 방법 앱 간 워크플로를 활성화하는 방법 도구를 사용해 자신 있게 구축하고 테스트하는 방법입니다 구체적인 다음 단계로 마무리하겠습니다
시작하는 방법입니다 엔티티를 모델링하고 Spotlight에 색인해서 Siri가 콘텐츠를 찾을 수 있게 하세요 앱의 핵심 경험에 맞는 앱 스키마 도메인을 채택하세요 콘텐츠 가져오기와 내보내기를 활성화하기 위해 Transferable을 채택하세요 AppIntentsTesting을 사용해 일찍 자주 테스트하세요 그런 다음 Shortcuts, Spotlight, Siri로 테스트하세요 이 모든 API는 오늘 사용 가능하며 확장되도록 설계되어 있습니다 Siri가 계속 발전함에 따라 앱과 함께요
Siri가 더욱 강력하고 맥락적이며 더 많은 기능을 갖추게 됩니다 App Intents가 이를 가능하게 하는 기반입니다 앱을 Siri에 연동하는 것은 단순히 음성 지원을 추가하는 것이 아닙니다 앱을 더 빠르게 만드는 것입니다 더 접근 가능하고 시스템 전반에서 사용하기 쉽게 만듭니다 시청해 주셔서 감사합니다 여러분이 만드실 것이 기대됩니다
-
-
7:59 - Contributing message content to Apple Intelligence
// Contributing message content to Apple Intelligence @AppEntity(schema: .messages.message) struct MessageEntity: IndexedEntity { // The text content of the message @Property(indexingKey: \.textContent) var body: AttributedString? } -
8:36 - An interface that locates entities using arbitrary string input
// An interface that locates entities using arbitrary string input struct ContactQuery: EntityStringQuery { func entities(matching string: String) async throws -> [ContactEntity] { let predicate = #Predicate<Person> { person in person.name.localizedStandardContains(string) } let descriptor = FetchDescriptor<Person>(predicate: predicate) let matches = try modelContext.fetch(descriptor) return matches.map(\.entity) } } -
17:19 - Working across apps - View annotations
// Working across apps - View annotations List { ForEach(messages) { message in MessageRow(message: message) .appEntityIdentifier( EntityIdentifier( for: MessageEntity.self, identifier: message.id ) ) } } -
18:18 - Working across apps - Exporting content to another app
// Working across apps - Exporting content to another app extension ContactEntity: Transferable { static var transferRepresentation: some TransferRepresentation { IntentValueRepresentation( exporting: \.person ) } } -
19:21 - Working across apps - IntentValueQuery
// Working across apps - IntentValueQuery struct ContactEntityQuery: IntentValueQuery { func values(for input: [IntentPerson]) async throws -> [ContactEntity] { let names = input.map(\.displayName) let descriptor = FetchDescriptor<Contact>() let contacts = try model.mainContext.fetch(descriptor) let matches = contacts.filter { contact in names.contains(where: { name in contact.name.localizedStandardContains(name) }) } return matches.map(\.entity) } } -
20:00 - Working across apps - IntentValueRepresentation
// Working across apps - IntentValueRepresentation extension ContactEntity: Transferable { static var transferRepresentation: some TransferRepresentation { IntentValueRepresentation(exporting: \.person, importing: { intentPerson in let contact = Contact(importing: intentPerson) ContactManager.shared.contacts.append(contact) return contact.entity }) } }
-
-
- 0:00 - Introduction
How App Intents bring your app to Siri, made more capable, contextual, and personal by Apple Intelligence in the 27 releases. Previews the agenda: what's new, contributing content, making actions available, working across apps, and best practices.
- 1:06 - What's new in Siri
Siri gains three capabilities built on App Intents: accessing your app's entities, taking action through your intents, and understanding onscreen context. Introduces the UnicornChat sample app used throughout the session.
- 4:06 - Contributing content with App Entities
Model your app's content as App Entities (what a thing is, how it's identified, and which properties matter), then conform them to an App Schema so Siri understands the category of content.
- 6:21 - Entity resolution and IndexedEntity
How Siri resolves spoken references to real entities. Adopt IndexedEntity for semantic search and content Q&A over indexed content, using indexingKey to mark searchable properties, or EntityStringQuery when data can't be indexed ahead of time.
- 9:49 - Making actions available
App Intents expose actions across Shortcuts, Spotlight, and Widgets. Conforming intents to App Schemas, and grouping them into App Schema domains, makes those actions executable by Siri through natural language.
- 12:03 - Adopting a schema domain in UnicornChat
End-to-end walkthrough of adopting the Messages domain's sendMessage schema: mapping schema parameters onto UnicornChat's messaging flow and returning the sent message as an entity, so Siri can send messages without opening the app.
- 15:39 - Moving content across apps
Export entities with Transferable and IntentValueRepresentation so other apps can act on them. On import, use IntentValueQuery to match existing content or IntentValueRepresentation(importing:) to create something new.
- 16:00 - Working across apps: onscreen awareness
Requests that span apps rely on onscreen awareness. Connect views to App Entities, via NSUserActivity for a single primary item or view annotations for multiple visible items, so Siri can resolve references like "this" and "that."
- 21:09 - Best practices
Design for complete Siri conversations by adopting full schema sets. Xcode surfaces missing related schemas (for example draftMessage alongside sendMessage) at build time with Fix-Its.
- 24:18 - Testing your integration
Validate progressively: App Intents Testing for business logic in isolation, then the Shortcuts app for intent shape, Spotlight for content indexing, and finally Siri for the full end-to-end experience.
- 26:21 - Next steps
Model and index entities, adopt the App Schema domains matching your app, enable content transfer with Transferable, and test early with Shortcuts, Spotlight, and Siri.