View in English

  • Apple Developer
    • 시작하기

    시작하기 탐색

    • 개요
    • 알아보기
    • Apple Developer Program

    알림 받기

    • 최신 뉴스
    • Hello Developer
    • 플랫폼

    플랫폼 탐색

    • Apple 플랫폼
    • iOS
    • iPadOS
    • macOS
    • tvOS
    • visionOS
    • watchOS
    • App Store

    피처링

    • 디자인
    • 배포
    • 게임
    • 액세서리
    • 웹
    • 홈
    • CarPlay
    • 기술

    기술 탐색

    • 개요
    • Xcode
    • Swift
    • SwiftUI

    피처링

    • 손쉬운 사용
    • 앱 인텐트
    • Apple Intelligence
    • 게임
    • 머신 러닝 및 AI
    • 보안
    • Xcode Cloud
    • 커뮤니티

    커뮤니티 탐색

    • 개요
    • Apple과의 만남 이벤트
    • 커뮤니티 주도 이벤트
    • 개발자 포럼
    • 오픈 소스

    피처링

    • WWDC
    • Swift Student Challenge
    • 개발자 이야기
    • App Store 어워드
    • Apple 디자인 어워드
    • 문서

    문서 탐색

    • 문서 라이브러리
    • 기술 개요
    • 샘플 코드
    • 휴먼 인터페이스 가이드라인
    • 비디오

    릴리즈 노트

    • 피처링 업데이트
    • iOS
    • iPadOS
    • macOS
    • watchOS
    • visionOS
    • tvOS
    • Xcode
    • 다운로드

    다운로드 탐색

    • 모든 다운로드
    • 운영 체제
    • 애플리케이션
    • 디자인 리소스

    피처링

    • Xcode
    • TestFlight
    • 서체
    • SF Symbols
    • Icon Composer
    • 지원

    지원 탐색

    • 개요
    • 도움말
    • 개발자 포럼
    • 피드백 지원
    • 문의하기

    피처링

    • 계정 도움말
    • 앱 심사 지침
    • App Store Connect 도움말
    • 새로 추가될 요구 사항
    • 계약 및 지침
    • 시스템 상태
  • 빠른 링크

    • 이벤트
    • 뉴스
    • 포럼
    • 샘플 코드
    • 비디오
 

비디오

메뉴 열기 메뉴 닫기
  • 컬렉션
  • 전체 비디오
  • 소개

더 많은 비디오

  • 소개
  • 요약
  • 자막 전문
  • 코딩 실습: Siri가 앱을 사용할 수 있도록 설정하기

    Siri가 앱을 사용할 수 있도록 설정하는 방법을 보여 주는 Xcode 프로젝트를 자세히 살펴보세요. 앱 스키마를 도입하여 사용자가 캘린더 이벤트에 대해 질문하고 일정 관리와 같은 자연어 작업을 수행할 수 있도록 하는 방법을 알아보세요. Spotlight 시맨틱 인덱스에서 콘텐츠를 사용할 수 있도록 하고 화면 내용 인지를 위한 컨텍스트를 제공하는 모범 사례를 살펴보세요.

    챕터

    • 0:00 - Introduction
    • 1:43 - App Schemas and the plan
    • 3:44 - Build the CalendarEntity
    • 8:00 - Build the AttendeeEntity
    • 10:30 - Build the EventEntity
    • 14:34 - Open events with OpenIntent
    • 15:30 - Onscreen awareness
    • 17:18 - Create events with Siri
    • 19:24 - Update events
    • 21:30 - Custom snippet views
    • 22:30 - Delete events
    • 23:35 - Next steps

    리소스

    • Integrating your calendar app with Apple Intelligence
    • Donating your app’s data and actions to the system
    • Donations and discovery
    • 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
    • Calendar
    • App schema domains
      • HD 비디오
      • SD 비디오

    관련 비디오

    WWDC26

    • 앱 스키마로 지능형 Siri 경험 빌드하기
    • Siri 및 Apple Intelligence를 위한 고급 앱 인텐트 기능 살펴보기
  • 비디오 검색…

    안녕하세요, 저는 Justin이에요 Swift Intelligence Frameworks 팀 엔지니어예요 이 코드 실습에 오신 것을 환영해요 이 영상에서는 앱을 가져와서 단계별로 Siri에서 사용 가능하게 만들겠어요 iPhone에서 Siri와 대화를 시작하며 질문하는 상황을 상상해 보세요 "내 피크닉에 누가 오나요?" Siri가 이벤트와 참석자를 검색해서 게스트 목록을 보여줘요

    항상 늦는 친구가 포함된 걸 발견하고 이렇게 말해요 "정오로 미뤄줘… 아니 오전 11시 30분으로"

    Siri가 세부 사항을 확인하고 저는 이렇게 말해요 "좋아요, 감사해요."

    Siri가 변경 사항을 적용하고 커스텀 뷰를 렌더링해요

    이제 친구들에게 업데이트해야 해요 "피크닉에 오는 모든 사람에게 이모지로 변경 사항을 문자로 알려줘."

    메시지를 다시 확인한 후 말해요 "보내줘."

    그러자 Siri가 메시지를 보내요 그 다음 이벤트 메모에 알림이 있었던 게 기억났어요 피크닉에 중요한 것을 가져와야 한다는 내용이었어요 그래서 물어봐요 "피크닉에 뭘 가져가야 했더라?" Siri가 이벤트를 검색해서 초콜릿 케이크를 가져오라는 메모를 찾아요

    준비할 시간이 얼마나 있는지 궁금해서 이렇게 말해요 "거기까지 운전하는 데 얼마나 걸릴까요?"

    Siri가 이벤트 위치를 찾고 예상 시간을 알려줘요

    Siri는 이렇게 대화만으로 일상을 손쉽게 만들어 줘요 오늘의 목표가 바로 이거예요 기존 앱을 가져와서 Siri에서 사용 가능하게 만들겠어요 Siri는 Apple Intelligence, Apple의 개인 인텔리전스 시스템으로 구동돼요 개발자는 앱을 Apple Intelligence와 통합할 수 있어요 App Intents 프레임워크를 통해 앱의 콘텐츠와 기능이 Siri에서 사용 가능해지고 다른 시스템 경험에서도 활용할 수 있어요 동반 영상 "App Schemas로 지능적인 Siri 경험 구축하기"에서 프레임워크의 개념을 다루고 Apple Intelligence와 Siri가 앱의 콘텐츠 및 기능과 작동하는 방식을 설명해요 App Intents가 처음이라면 "App Intents 알아보기" 영상에서 핵심 기본 사항을 다루고 있어요 intent, 엔티티, 쿼리 등 Siri, Shortcuts 같은 시스템 기능과 연결하는 방법도요 저는 CometCal이라는 샘플 프로젝트를 작업 중이에요 SwiftUI 캘린더 앱으로 우주적인 재미를 담고 있어요 소스 코드는 Apple 개발자 웹사이트에서 다운로드할 수 있어요 함께 따라할 수 있도록요 캘린더 앱의 기본 기능을 갖췄어요 오늘의 이벤트 표시, 이벤트 보기 및 편집, 더 많은 이벤트 생성,

    다양한 캘린더 관리까지요

    지금은 화면을 통해서만 상호 작용할 수 있지만… 곧 달라질 거예요! 이 영상에서 CometCal을 업데이트할 거예요 Siri가 앱 콘텐츠를 이해하고 제 질문에 답할 수 있도록요 이벤트 업데이트 같은 작업도 수행해서 Siri를 더욱 유용하게 만들겠어요 첫 번째 단계는 Siri에게 앱 콘텐츠를 이해시키는 거예요 지금 Siri는 캘린더가 뭔지 전혀 몰라요 CometCal에서 이벤트가 무엇인지도 모르고요 바로 여기서 App Schemas가 등장해요 App Schemas는 앱의 콘텐츠를 Siri가 이해할 수 있는 방식으로 설명해요 엔티티 구조, 작업 매개변수, 그리고 출력을 정의해요 학습 문구도, 제 쪽의 자연어 처리도 필요 없어요 App Schemas는 App Schema 도메인으로 구성돼요

    calendar 도메인은 일정과 관련된 모든 것을 다뤄요 이벤트, 캘린더, 참석자, 그리고 이들에 적용되는 작업들을요 기초 작업이 끝났으니 Xcode로 들어가 볼 시간이에요 카운트다운을 시작해요! CometCal의 데이터 레이어에는 이미 CalendarModel이 있어요 캘린더용 SwiftData 모델이에요 Personal 캘린더와 Work 캘린더의 차이 같은 거예요 App Schemas를 사용해서 이를 나타내는 앱 엔티티를 만드는 게 목표예요 그래야 Siri가 이 앱에서 캘린더가 무엇인지 이해할 수 있어요 CalendarEntity라는 새 Swift 파일을 만들고 AppIntents를 가져올게요

    다음으로 편집기에서 calendar_를 입력할게요 Xcode 자동 완성에서 Calendar 도메인의 모든 스키마를 바로 볼 수 있어요 목표가 캘린더 엔티티이므로 calendar_calendar를 선택할게요

    스니펫이 구조를 채워줘요 @AppEntity 매크로, 속성, DisplayRepresentation, 쿼리 스텁이에요 이제 Siri가 추론할 수 있는 스키마화된 엔티티가 됐어요 채워야 할 내용이 몇 가지 있어요 먼저 데이터 모델과 일치하도록 id 타입을 UUID로 설정할게요

    텍스트가 아닌 의미로 매칭을 활성화하려면 IndexedEntity 프로토콜을 준수할게요 IndexedEntity를 준수하면 Spotlight 인덱스를 사용해서 엔티티를 제공할 수 있어요 시맨틱 이해의 이점을 활용할 수 있도록요 엔티티가 제공되면 Siri는 이름으로 확인할 수 있어요 속성이나 컨텍스트로도요 커스텀 속성 쿼리 없이도요 계속 진행하기 위해 변환 방법을 추가했어요 데이터 모델과 엔티티 간의 변환이에요 CalendarEntity의 이니셜라이저는 CalendarModel에서 매핑해요 엔티티에 필요한 것을 꺼내기 위해서예요 CalendarModel의 편의 .entity 속성은 이니셜라이저를 사용해서 CalendarEntity를 만들어요 쿼리처럼 두 가지를 변환하는 곳에서 곧 사용할게요

    다음으로 쿼리에서 CalendarManager를 위한 @Dependency 속성을 추가할게요 모든 SwiftData 작업을 처리하는 CometCal의 데이터 레이어예요 @Dependency 속성 래퍼는 App Intents가 shared 리소스를 intent와 쿼리에 주입하는 방법이에요 새 인스턴스를 만드는 대신 한 번 등록한 동일한 객체를 제공해요 오른쪽에서 한 것처럼요

    CalendarManager는 main-actor로 격리되어 있어요 그래서 쿼리 struct에도 @MainActor 주석을 달게요 EntityQuery 프로토콜에서 요구하는 메서드를 구현할게요 CalendarManager 의존성을 사용해서 ID로 캘린더를 가져와요 EntityQuery는 시스템이 이미 엔티티 ID를 알고 있는 경우를 처리해요 하지만 나중에 이벤트를 만들 때는 시스템이 사용 가능한 캘린더를 알아야 해요 Siri가 옵션으로 제공할 수 있도록요 그러려면 EnumerableEntityQuery를 준수할게요 모든 캘린더를 반환하는 allEntities 메서드를 추가할게요

    DisplayRepresentation에서는 제목을 캘린더 제목으로 설정하고 이미지를 캘린더 시스템 이미지로 설정할게요 엔티티 표시 시 Siri와 Spotlight가 사용해요 엔티티 하나가 거의 준비됐어요… 놓치기 쉬운 부분이 하나 더 있어요 IndexedEntity는 인덱싱된 콘텐츠의 형태를 정의하지만 엔티티는 아직 제공되어야 해요 그러려면 CalendarManager 파일을 열게요 캘린더나 다른 인덱싱된 엔티티가 변경될 때마다 인덱스를 업데이트해야 해요 그러려면 CSSearchableIndex 인스턴스가 있어야 해요 CalendarManager의 이니셜라이저에서 초기화되고 CometCal의 고유한 이름을 사용해요 createCalendar 메서드에서 새 캘린더를 반환하기 직전에 indexAppEntities를 호출해서 엔티티를 제공할게요 앞서 만든 searchable 인덱스 인스턴스를 사용해서요

    마찬가지로 updateCalendar 메서드에서 업데이트된 캘린더 엔티티를 인덱싱할게요

    그리고 deleteCalendar 메서드에서는 deleteAppEntities를 호출해서 인덱스에서 엔티티를 제거할게요 엔티티의 id와 타입을 전달하면서요

    엔진을 켜고 실행해 볼게요… CometCal을 열고 "Lunar Orbit Log"라는 새 캘린더를 만들게요

    그런 다음 스와이프 다운으로 "Lunar Orbit Log"를 검색할게요…

    캘린더 아이콘과 제목이 잘 표시되고 있어요 CalendarEntity가 작동하면서 다음 두 엔티티도 같은 패턴을 따라요 하지만 각각 새롭고 흥미로운 내용을 소개해요 AppIntents가 이미 임포트된 AttendeeEntity라는 새 파일이에요 이전과 같은 패턴이에요… calendar_attendee를 입력하고 스니펫을 선택해요 익숙한 부분은 같아요… 카메라 밖에서 연결해서 빠르게 진행할게요 여기서 잠시 멈추고 완성된 소스 코드를 확인해도 좋아요 CalendarEntity와 달리 AttendeeEntity는 IndexedEntity 대신 TransientAppEntity 프로토콜을 준수해요 이는 의도적인 설계예요 Transient 앱 엔티티는 임시 엔티티를 나타내는 것으로 고유 식별자가 필요 없고 쿼리할 필요도 없어요 여기서 딱 맞는 선택이에요 CometCal에서 참석자는 특정 이벤트에 대한 참여를 나타내요 사람 자체가 아니에요 같은 사람이 여러 이벤트에 참석할 수 있고 각 참석을 따로 인덱싱하면 Spotlight에서 중복 결과가 생길 수 있어요 참석자는 항상 이벤트를 통해 접근하기 때문에 독립적인 조회 경로가 필요 없어요 TransientAppEntity가 이를 명시해요 작성할 쿼리도 없어요 유지할 인덱스도 없어요 참석자에는 스키마에서 요구하는 속성이 있어요 참석이 선택 사항인지 알리는 불리언 속성 같은 거예요

    새로운 항목으로 IntentPerson 타입이 있어요… 사람을 나타내는 시스템 표준 방식이에요 이름과 연락처 정보를 포함해요 앱 간에 이 데이터를 공유할 때 유용해요 Mail 앱에서 메시지 초안 작성을 위해 참석자의 이메일 주소를 보내는 것처럼요 스키마에는 두 가지 @AppEnum 타입도 포함돼요 스키마는 가능한 케이스 집합을 정의하고 앱은 해당하는 것을 채택해요 이것도 스키마화되어 있어서 코드 스니펫으로 빠르게 만들게요 상태에는 calendar_attendeeStatus 스니펫을 사용할게요 스니펫에는 스키마가 지원하는 모든 케이스가 포함돼 있어요 CometCal의 모델은 이미 직접 매핑되어 있어서 변경이 필요 없지만 앱이 다른 용어를 사용한다면 기존 모델을 스키마의 케이스에 매핑하기만 하면 돼요 그러면 Siri가 형태를 인식할 수 있어요 마찬가지로 참석자 타입에는 calendar_attendeeType을 사용할게요 스키마는 참석자의 종류를 설명하는 케이스를 최소 하나 요구해요 CometCal의 참석자는 모두 사람이므로 person 케이스를 추가할게요

    상태와 타입에 각각 타입을 채울게요

    이것으로 AttendeeEntity가 완성됐어요

    두 엔티티가 궤도에 올랐어요 하나만 더 발사하면 돼요 캘린더와 참석자 엔티티가 다음 것과 궤도를 찾아요… 모두를 끌어당기는 중력 중심… 바로 EventEntity예요 시스템 검색 인덱스는 이벤트 엔티티에서 정말 빛을 발해요 "crew lunch가 언제야?"라고 물으면 Siri가 제목을 검색해요 "산소를 언급하는 이벤트가 뭐야?"라고 물으면 메모 내용을 검색할 수 있어요 사용자가 데이터에 대해 질문하면 Siri가 바로 답해줘요 calendar_event 스니펫이 이미 적용된 EventEntity예요 CalendarEntity처럼 EventEntity도 IndexedEntity 프로토콜을 준수해요 CalendarManager에 인덱싱을 포함시켜 시맨틱 인덱스를 활용해요 내용이 많아요 스키마는 다양한 속성을 다뤄요 당황하지 마세요, 이전 엔티티와 같은 패턴을 따라요 주요 차이점은 매개변수의 수와 다양성이에요 이 미션을 일정에 맞추기 위해 익숙한 부분은 카메라 밖에서 연결했어요 잠시 멈추고 소스 코드를 확인해도 좋아요 스키마는 어떤 속성이 필수이고 선택 사항인지 정의해요 title, startDate 같은 필수 항목은 연결하기 간단해요 앱에서 사용하지 않는 선택적 속성은 travelTime, virtualLocation처럼 그냥 설정하지 않아도 돼요 스키마에 없지만 데이터 모델에 있는 속성은 isFavorite처럼 엔티티에 추가할 수도 있어요 이 엔티티가 흥미로운 점은 앞서 만든 다른 엔티티와 어떻게 구성되는가예요 이 이벤트가 속한 캘린더는 CalendarEntity예요…

    그리고 참석자는 AttendeeEntity 배열이에요

    App Schemas로 Siri가 이러한 관계를 이해해요

    recurrence 속성도 빠르게 짚고 넘어갈 만해요 반복되는 이벤트를 나타낼 수 있어요 매주 운동이나 중요한 연간 기념일처럼요 Foundation의 Calendar.RecurrenceRule 타입을 사용해요 CometCal의 간단한 frequency enum과 상호 변환해요 매일, 매주, 매월, 매년 같은 경우에요

    스키마의 일부로 이벤트의 location과 alarm에 대한 union 값도 있어요 union 값은 여러 다른 타입 중 하나를 가질 수 있는 속성이에요 예를 들어 location은 PlaceDescriptor일 수 있어요 GeoToolbox 프레임워크의 것이거나 String일 수 있어요 마찬가지로 코드 스니펫으로 간단하게 구현할 수 있어요

    이렇게요 alarm의 경우 Duration이나 Date일 수 있어요

    속성을 각 타입에 맞게 할당해요

    참석자처럼 여기에도 스키마화된 enum이 있어요 EventEntityStatus처럼요 이벤트 관련 두 enum 모두 스니펫에서 완성돼요 추가하고 연결할게요

    마지막으로 status 속성을 새 status 타입에 할당해요 이로써 콘텐츠 레이어가 완전히 준비되고 발사 준비가 됐어요

    이게 발사될 수 있는지 알아볼 시간이에요! 왼쪽에 Meteor Shower Watch Party의 상세 보기가 있어요 시간, 위치, 메모가 모두 화면에 있어요… 하지만 Siri와 유성에 대해 대화 중이라고 상상해 보세요 그러다 파티가 갑자기 기억나는 거예요 대화를 나가서 CometCal을 열고 상세 정보를 찾는 대신 그냥 물어보면 돼요… "Meteor Shower Party가 곧 있나요?"

    "거기 날씨가 어때요?"

    타이핑으로 전환할 수도 있어요 "최적 관람 시간이 언제예요?"

    결과를 탭하면 CometCal로 이동할 수도 있어요

    Siri가 앱 콘텐츠를 사용해서 모든 질문에 답해줘요 커스텀 자연어 처리가 필요 없어요 엔티티와 스키마만으로 충분해요 눈치채셨을 수도 있지만 Siri 대화에서 이벤트를 탭하면 CometCal이 열려요 하지만 메인 화면으로만 이동해요 기대한 것처럼 이벤트로 이동하지 않아요 Siri가 아직 앱에서 특정 이벤트를 여는 방법을 몰라요 이 경험을 더 좋게 만들기 위해 잠깐 돌아갈게요 이를 작동시키기 위해 OpenEventIntent가 있어요 system.open 스키마를 준수하는 작은 intent예요 EventEntity를 대상으로 받아서 NavigationManager에게 해당 이벤트로 이동하라고 알려줘요 Spotlight나 Siri에서 이벤트 결과를 탭할 때마다 시스템이 호출해요 또는 Siri에게 열어달라고 요청할 때도요

    이게 다예요! 이제 이벤트를 탭하면… 이번에는 CometCal이 바로 상세 보기로 열려요 Meteor Shower Watch Party의 상세 보기로요 이것이 OpenIntent가 간격을 연결하는 방식이에요 이제 Siri가 앱 콘텐츠를 더 잘 이해할 수 있어요 어떤 내용이든 Siri에게 물어볼 수 있어요 세 개의 struct와 코드 스니펫 몇 개로 나쁘지 않죠? Siri와의 대화를 더 좋게 만들 수 있는 것이 하나 더 있어요 더 자연스럽게요 특정 이벤트가 화면에 있을 때 이런 말을 하고 싶을 수 있어요 "이 이벤트의 사람들에게 이메일 보내줘" 이벤트 제목을 말하지 않고도요 화면 인식 기능이에요 뷰 수정자 두 개만 있으면 돼요 CometCal의 CalendarListView에서 모든 이벤트를 나열할 때 목록에 .appEntityIdentifier 수정자를 추가할게요 각 이벤트 엔티티의 EntityIdentifier를 전달하면서요 이렇게 목록을 엔티티에 연결해서 누군가 목록을 탐색할 때 시스템이 어떤 이벤트가 화면에 있는지 알아요 이벤트 상세 보기에서 특정 이벤트의 상세 정보가 화면에 있을 때 EntityIdentifier와 함께 .userActivity 수정자를 추가할게요 특정 이벤트 하나가 화면의 중심임을 시스템에 알려줘요 그래서 Siri가 현재 보고 있는 이벤트를 정확히 확인할 수 있어요

    이게 다예요! 가능한 것들을 볼게요 이제 Siri가 화면에 있는 것을 이해하고 이벤트 엔티티를 열 수 있으므로 자연스러운 방식으로 Siri에게 이벤트를 열어달라고 할게요 "Siri야, 세 번째 이벤트 열어줘"

    현재 Meteor Shower Watch Party 상세 보기에 있는 상태에서 전체 제목 대신 이 이벤트를 참조해 볼게요… "Siri야, 이 이벤트의 사람들에게 이메일 보내줘 초콜릿과 마시멜로를 가져오라고 해줘"

    Siri가 화면 이벤트에 대한 이해를 활용해서 참석자를 찾아 Mail에 전달할 수 있어요

    정말로… 수정자 두 개만으로… 화면에 있는 것을 앱 콘텐츠와 연결하기에 충분해요 이제 Siri가 콘텐츠에 대해 말할 수 있어요 하지만 진정으로 도약하려면 Siri에게 행동 능력을 줄게요 다시 한번 App Schemas가 길을 이끌어요 그리고 여기서 정말 흥미로워져요 이벤트 만들기부터 시작할게요 엔티티처럼 intent도 코드 스니펫을 사용해요 calendar_createEvent 스니펫을 찾아 선택할게요 @AppIntent 매크로로 intent 구조를 만들어줘요 스키마, 스키마에서 요구하는 모든 매개변수, perform 스텁이에요 title부터 note까지 매개변수들은 스키마에서 오고 intent의 perform 로직에 사용할 수 있어요 타입 채우기부터 시작할게요 그런 다음 @Dependency를 추가하고 perform 메서드에서 사용할 CalendarManager를 추가할게요 perform 메서드에서 @MainActor로 표시하고 EventEntity를 반환 값 타입으로 설정할게요

    일반적인 패턴은 간단해요 intent의 매개변수를 데이터 레이어가 이해할 수 있는 것으로 변환하고 작업을 수행한 다음 결과를 엔티티로 반환해요 캘린더 이벤트 만들기의 경우 매개변수를 변환하는 것을 의미해요 union 값에서 위치를 추출하는 것처럼요

    제공된 경우 recurrence를 변환하기도 해요 calendarManager의 createEvent 메서드에 모두 전달하고 결과를 EventEntity로 반환할게요

    놀라운 점이 있어요 App Schema를 준수하기 때문에 Siri가 모든 어려운 작업을 처리해줘요 언어 해석, 명확화 요청, 세부 사항 확인 등… 사람들이 Siri와 자연스럽게 대화할 수 있어요 발사해 볼 시간이에요… 새 이벤트를 만들고 싶다고 상상해 보세요 하지만 우주 유영 중이어서 iPhone이 손에 닿지 않게 떠 있어요 잡는 대신 그냥 Siri에게 물어볼게요… "Siri야, Lunar Orbit Log에 새 이벤트 만들어줘"

    "6월 15일 오전 8시에 Zero Gravity Yoga로 만들어줘"

    Siri가 새 이벤트의 제목, 날짜, 시간을 확인해요 완료되면 캘린더에 이벤트가 추가돼요

    코드 몇 줄만으로 앱이 Siri와 함께 작동해요 App Schemas의 힘이에요 이제 Siri로 이벤트를 만들 수 있으니 이벤트 업데이트로 기세를 이어갈게요 UpdateEventIntent가 있어요 calendar_updateEvent 스니펫으로 이미 채워져 있어요 구조는 create intent와 비슷하지만 핵심 차이점은 대부분의 매개변수가 선택 사항이에요 한두 가지만 변경할 수도 있으니까요 이벤트 매개변수는 Siri가 확인하고 나머지는 모두 선택 사항이에요 perform 로직은 같은 패턴을 따라요 제공된 경우 각 매개변수를 변환하고 CalendarManager의 updateEvent 메서드에 모두 전달하고 업데이트된 이벤트를 반환해요 create intent보다 코드가 더 많을 수 있지만 완전히 새로운 것은 없어요

    하지만 중요한 미묘한 점이 있어요 update intent의 선택적 매개변수에서 짚고 넘어갈 만한 것이에요 예를 들어 recurrence가 nil일 때 "변경하지 말라"는 건지 "제거하라"는 건지 알 수 없어요 단순한 nil 확인으로는 어떤 경우인지 알 수 없어요 perform 메서드의 recurrence 로직을 확대해보면 @AppIntent 매크로가 각 속성을 IntentParameter로 래핑해요 valueState를 노출해요 이렇게 차이를 구분해요 실제 값이 있는 .set은 새 값이 제공됐다는 의미예요 nil 값이 있는 .set은 명시적으로 지워진다는 의미예요 .unset은 매개변수가 요청에 포함되지 않았다는 의미예요 이 패턴은 모든 선택적 매개변수에 적용돼요 값을 지우는 것이 의미 있는 작업인 경우에요 이제 update intent가 연결됐으니 명령 몇 가지를 실행해 볼게요 "Siri야, 이걸 저녁 10시로 옮겨줘"

    "네, 좋아요"

    "그리고 이걸 매주 반복으로 변경하고 Deep Space 캘린더로 옮겨줘"

    "좋아요"

    "아, 이 이벤트는 반복하지 말아줘"

    상세 보기에 모든 변경 사항이 반영돼요 코드 몇 줄과 App Schema만으로요

    업데이트는 작동하지만 Siri가 기본 결과 카드를 표시해요 CometCal이니 더 많은… 분위기가 있어야 해요 기본적으로 Siri는 display representation을 사용해서 결과 카드를 만들어요 스니펫 뷰를 사용하면 커스텀 SwiftUI 뷰로 교체할 수 있어요 EventEntity를 받는 SwiftUI 뷰를 준비했어요 멋진 방식으로 세부 정보를 배치해요 여기서 정말 창의적으로 할 수 있어요… 하지만 단순하고 가볍게 유지하는 것도 기억하세요 이를 모두 연결하기 위해 UpdateEventIntent를 열게요

    perform 메서드의 반환 타입에 ShowsSnippetView를 추가할게요 그런 다음 return 문에서 EventSnippetView를 전달할게요 같은 방법이 결과를 반환하는 다른 intent에도 적용돼요 create intent처럼요

    "Siri야, crew lunch를 한 시간 뒤로 미뤄줘"

    이제 새 스니펫이 나와요! 우주적인 그라데이션 액센트, 짙은 파란색 배경, 업데이트된 이벤트 세부 정보와 별 아이콘… Siri 안에서 앱의 개성이 빛나는 거예요 update intent가 완성됐어요 마지막으로 연결할 기능은 delete이고 세 가지 중 가장 간단해요 DeleteEventIntent가 있어요 꽤 간단해요… 이벤트와 반복 이벤트에 대한 선택적 span이 전부예요 perform 로직이 이벤트를 찾아 삭제해요 Siri가 삭제 전에 자동으로 확인 대화 상자를 처리해요

    이젝션 시퀀스를 테스트할 시간이에요 "Siri야, 그 파티 삭제해줘"

    "네, 삭제해줘"

    "그리고 6월 9일 이벤트도 삭제해줘"

    "아… 사실 괜찮아요"

    Siri가 이벤트를 삭제하기 전에 확인을 요청하고 두 개 이상의 이벤트가 일치할 때 명확히 구분해요 세 가지 intent Siri로 완전한 이벤트 관리가 돼요 미션 완료! CometCal이 화면에 묶인 앱에서 완전히 음성 조종 앱이 됐어요 이 영상에서 많은 것을 만들었어요 앱을 Siri와 연동하기 위한 다음 단계들이에요 CometCal 샘플 프로젝트를 다운로드해서 전체 구현을 살펴보세요 App Intents 문서를 살펴보세요 사용 가능한 모든 App Schemas와 도메인을 살펴보세요 자동화 테스트를 위해 이 영상에서 CometCal 테스트 작성법을 배우세요 새 AppIntentsTesting 프레임워크를 사용해서요 "Siri와 Apple Intelligence를 위한 고급 App Intents 기능 탐색"을 시청하고 앱이 Siri와 작동하는 방식을 더 세밀하게 다듬는 방법을 알아보세요 이 영상에서 다루지 않은 내용도 포함해요 이제 앱을 최전선으로 이끌 준비가 됐어요 함께해 주셔서 정말 감사해요!

    • 0:00 - Introduction
    • Justin Kang previews the goal: take an existing app and make it available to Siri. A picnic scenario shows Siri searching events, updating times with confirmation, texting attendees, and answering questions, all through conversation.

    • 1:43 - App Schemas and the plan
    • Apps integrate with Apple Intelligence through App Intents, and App Schemas describe content and actions in terms Siri already understands, no training phrases or NLP. Schemas are organized into domains (here, the calendar domain). Introduces the CometCal sample app and the two goals: understand content, and perform actions.

    • 3:44 - Build the CalendarEntity
    • Create a schematized @AppEntity from the calendar_calendar snippet, set the id to UUID, conform to IndexedEntity, wire a @Dependency and @MainActor query (EnumerableEntityQuery with allEntities()), set a display representation, and donate to Spotlight via indexAppEntities and deleteAppEntities.

    • 8:00 - Build the AttendeeEntity
    • Built from calendar_attendee, but conforming to TransientAppEntity instead of IndexedEntity, attendees are accessed only through their event, so they need no identifier, query, or index. Introduces the IntentPerson type and two schematized @AppEnums (calendar_attendeeStatus, calendar_attendeeType).

    • 10:30 - Build the EventEntity
    • The central IndexedEntity (from calendar_event), where the semantic index shines for title and note-content questions. Composes the CalendarEntity and [AttendeeEntity], handles recurrence (Calendar.RecurrenceRule), union values for location and alarms, and event status/span enums.

    • 14:34 - Open events with OpenIntent
    • A small OpenEventIntent conforming to the system.open schema takes an EventEntity and tells the NavigationManager to navigate to it, so tapping an event in Spotlight or Siri opens straight to its detail view.

    • 15:30 - Onscreen awareness
    • Two view modifiers connect the screen to entities: .appEntityIdentifier on the event list and .userActivity (with an EntityIdentifier) on the detail view, letting Siri resolve "this event" or "that third event" without naming the title.

    • 17:18 - Create events with Siri
    • Build CreateEventIntent from calendar_createEvent: fill in parameter types, add a @MainActor @Dependency, and in perform() resolve the schema parameters (location union value, recurrence) into the data layer and return an EventEntity. Siri handles language, clarification, and confirmation.

    • 19:24 - Update events
    • UpdateEventIntent (calendar_updateEvent) mostly mirrors create, but parameters are optional. The key subtlety: an IntentParameter's valueState distinguishes .set with a value (change it), .set with nil (explicitly clear it), and .unset (not part of the request).

    • 21:30 - Custom snippet views
    • Replace Siri's default result card by adding ShowsSnippetView to the intent's return type and returning a custom SwiftUI EventSnippetView, bringing the app's visual personality (cosmic gradient, star icon) into Siri.

    • 22:30 - Delete events
    • DeleteEventIntent is the simplest, just the event plus an optional span for recurring events, and Siri automatically handles confirmation and disambiguation before deleting.

    • 23:35 - Next steps
    • Download the CometCal sample, browse the App Intents documentation for all schemas and domains, write tests with AppIntentsTesting, and watch "Explore advanced App Intents features for Siri and Apple Intelligence."

Developer Footer

  • 비디오
  • WWDC26
  • 코딩 실습: Siri가 앱을 사용할 수 있도록 설정하기
  • 메뉴 열기 메뉴 닫기
    • iOS
    • iPadOS
    • macOS
    • tvOS
    • visionOS
    • watchOS
    메뉴 열기 메뉴 닫기
    • Swift
    • SwiftUI
    • Swift Playground
    • TestFlight
    • Xcode
    • Xcode Cloud
    • SF Symbols
    메뉴 열기 메뉴 닫기
    • 손쉬운 사용
    • 액세서리
    • Apple Intelligence
    • 앱 확장 프로그램
    • App Store
    • 오디오 및 비디오(영문)
    • 증강 현실
    • 디자인
    • 배포
    • 교육
    • 서체(영문)
    • 게임
    • 건강 및 피트니스
    • 앱 내 구입
    • 현지화
    • 지도 및 위치
    • 머신 러닝 및 AI
    • 오픈 소스(영문)
    • 보안
    • Safari 및 웹(영문)
    메뉴 열기 메뉴 닫기
    • 문서(영문)
    • 튜토리얼
    • 다운로드
    • 포럼(영문)
    • 비디오
    메뉴 열기 메뉴 닫기
    • 지원 문서
    • 문의하기
    • 버그 보고
    • 시스템 상태(영문)
    메뉴 열기 메뉴 닫기
    • Apple Developer
    • App Store Connect
    • 인증서, 식별자 및 프로파일(영문)
    • 피드백 지원
    메뉴 열기 메뉴 닫기
    • Apple Developer Program
    • Apple Developer Enterprise Program
    • App Store Small Business Program
    • MFi Program(영문)
    • Mini Apps Partner Program
    • News Partner Program(영문)
    • Video Partner Program(영문)
    • Security Bounty Program(영문)
    • Security Research Device Program(영문)
    메뉴 열기 메뉴 닫기
    • Apple과의 만남
    • Apple Developer Center
    • App Store 어워드(영문)
    • Apple 디자인 어워드
    • Apple Developer Academy(영문)
    • WWDC
    최신 뉴스 읽기.
    Apple Developer 앱 받기.
    Copyright © 2026 Apple Inc. 모든 권리 보유.
    약관 개인정보 처리방침 계약 및 지침