스트리밍은 대부분의 브라우저와
Developer 앱에서 사용할 수 있습니다.
-
앱 인텐트의 새로운 내용
앱 인텐트 프레임워크의 개선 사항을 알아보고 이를 통해 앱의 기능을 Siri 및 다른 새로운 기능에 노출할 수 있는 방법을 살펴보세요. Transferable API, File Representations, Item Providers, Spotlight Indexing을 활용하여 플랫폼상에서 엔티티의 의미를 강화하는 방법을 살펴봅니다. 이를 통해 Siri 및 단축어 앱에서 강력한 기능을 활용할 수 있게 됩니다. 인텐트를 강화하여 URL 표현이 가능한 엔티티 및 유연한 Scene API를 통해 사용자가 앱을 더 깊이 탐색할 수 있게 해보세요. 오류 처리, 지연 속성 및 관련 enum을 위한 새로운 API로 엔티티 및 인텐트를 모델링하는 새로운 기술을 살펴볼 수 있습니다.
챕터
- 0:00 - Introduction
- 1:16 - Spotlight integration
- 5:00 - Entities and files
- 11:41 - Universal links
- 14:24 - Developer improvements
리소스
- Accelerating app interactions with App Intents
- App Intents
- Forum: Machine Learning and AI
- Making actions and content discoverable and widely available
관련 비디오
WWDC24
WWDC23
WWDC22
WWDC21
-
다운로드
안녕하세요, Kenny입니다 App Intents 팀 엔지니어죠
앱 인텐트를 사용하면 단축어 Spotlight, 위젯을 사용하는 앱과 동작 버튼을 비롯한 기타 많은 기능 그리고 새로운 Apple Pencil 스퀴즈에서 놀라운 경험을 할 수 있게 되었습니다
올해, Apple Intelligence와 제어 기능에 대한 경험 구축의 핵심에는 앱 인텐트가 있습니다
앱 인텐트 프레임워크는 시스템이 앱 엔티티를 이해하고 사용하도록 하며 AppIntents를 사용하기 쉽게 하는 새로운 방식을 제공합니다
오늘 다룰 내용이 많으니 바로 시작하겠습니다 앱 엔티티를 Spotlight에 인덱싱할 수 있는 방법과 Siri에게 풍부한 콘텐츠 이해력을 제공하는 방법을 다루겠습니다
앱 엔티티를 특정 유형의 콘텐츠로 변환하거나 문서를 앱 엔티티로 직접 노출할 수 있는 방법
앱 인텐트 유형을 범용 링크로 노출해서 기기가 앱에서 필요한 위치로 바로 이동할 수 있게 하는 방법
그리고 앱 인텐트 작업을 쉽게 할 수 있는 몇 가지 개발자 경험 개선 사항을 다룰 것입니다 앱 인텐트 사용이 처음이시라면 먼저 ‘앱 인텐트로 사용자에게 앱의 핵심 기능 제공하기‘를 보세요
Spotlight는 나와 관련된 콘텐츠를 찾는 좋은 시작점입니다 Spotlight는 내가 자주 사용하는 앱을 알고 이를 제안해 줍니다 앱에 따라 흔히 사용하는 동작에 빠르게 접근할 수 있죠
현재 날씨 또는 최근 검색 결과를 표시할 수도 있습니다
Spotlight에는 강력한 검색 기능도 있어서 특정 메모 빠르게 찾기 같은 원하는 내용을 찾을 수 있습니다
가장 연관성 높은 항목의 앱 단축어는 AppIntents를 통해 앱의 유용한 기능을 쉽게 노출할 수 있습니다
올해 새로운 API가 추가되어 이를 사용하면 Spotlight에서 앱 엔티티를 인덱싱할 수 있고 앱 엔티티에 새롭고 강력한 의미 검색을 제공할 수 있습니다 새로운 IndexedEntity 프로토콜부터 시작하겠습니다 CSSearchableIndex는 CSSearchableItem을 사용해 Spotlight에 앱에 대한 정보를 인덱싱할 수 있게 합니다 모든 CSSearchableItem에 정보를 확장하는 속성 세트가 있습니다
새로운 IndexedEntity는 앱 엔티티를 CSSearchableIndex로 인덱싱하는 쉬운 방법인 동시에 속성 세트를 맞춤화할 수 있는 기능을 제공합니다 이렇게 하면 엔티티를 Spotlight 검색 결과에 표시하고 Siri가 엔티티를 이해하고 찾을 수 있습니다
제 가족은 하이킹을 좋아해서 저는 좋아하는 탐방로를 파악하는 앱을 개발하고 있죠 앱을 열지 않고도 Spotlight에서 탐방로를 검색할 수 있다면 좋을 겁니다 이를 위해 저는 TrailEntity에 IndexedEntity 지원을 추가합니다
TrailEntity에 IndexedEntity 프로토콜을 추가합니다
그런 다음 앱의 init 메서드에서 CSSearchableIndex에 대해 indexAppEntities를 호출해 데이터 관리자의 모든 Trail 엔티티를 인덱싱합니다 끝났습니다. Spotlight에 TrailEntity 콘텐츠를 제공하겠습니다 어떻게 작동하는지 봅시다 먼저, 앱을 실행해서 새로운 엔티티 인덱싱 코드가 실행되도록 합니다
이제 Spotlight에서 탐방로 하나를 검색하겠습니다 탐방로 콘텐츠가 검색 결과로 나타납니다
TrailEntity를 매개변수로 받는 OpenTrailIntent가 있기 때문에 앱에서 결과를 탭해 즉시 탐방로로 이동할 수 있습니다 이에 대해서는 나중에 자세히 설명하겠습니다
기본적인 IndexedEntity 구현에서는 DisplayRepresentation만 사용해 속성 세트를 채우지만 Spotlight에 유용한 위치 정보나 키워드 같은 모든 종류의 정보를 속성 세트에 지정할 수 있습니다 직접 attributeSet를 구현해서 Spotlight에 몇 가지 정보를 제공하겠습니다
먼저, TrailEntity에 대해 attributeSet를 구현합니다
attributeSet를 맞춤화해 엔티티와 관련 있는 속성을 포함합니다 예를 들면 탐방로 위치의 시와 주 같은 거죠
그리고 탐방로에서 지원되는 활동에 키워드를 설정합니다
Spotlight에 추가 정보를 제공하면 검색과 이해력에 도움이 되어 더 적절한 결과를 반환합니다 애플리케이션이 CSSearchableItem API를 통해 Spotlight의 콘텐츠를 이미 인덱싱하고 있다면 검색 가능한 항목을 인덱싱하기 전에 associateAppEntity 메서드로 AppEntity를 항목과 연결합니다 새로운 의미 검색을 통해 AppEntity 정보를 찾도록 말입니다
IndexedEntity 인덱싱 API로 우선순위를 설정할 수도 있습니다 값이 클수록 더 중요한 항목입니다 예를 들어 이를 사용해 좋아하지 않는 항목보다는 좋아하는 항목에 더 높은 우선순위를 줄 수 있습니다
CSSearchableItem은 그 자체로 강력한 검색 기능을 제공하지만 콘텐츠에 대해서 동작을 수행할 수는 없습니다 앱 엔티티를 인덱싱해서 엔티티에 대한 기존 작업을 활용할 수 있고 Siri가 엔티티를 찾아 동작을 수행하게 할 수 있으니 항공편 정보 이메일을 찾아 친구에게 전달할 수 있는 거죠 이제 기기에 의미있는 엔티티로 표현하는 방법을 설명하겠습니다
AppEntity를 사용하면 Trail 같은 앱의 개념을 정의하고 표현할 수 있습니다
하지만 다른 앱은 이런 개념을 이해할 수 없습니다 대신, 어느 앱이든 이해할 수 있는 PDF 등의 표준화된 형식으로 엔티티를 표현할 수 있습니다
Uniform Type Identifier로 파일/데이터에 유형을 지정합니다
이미 이렇게 할 수 있는 API가 있습니다 Transferable은 공유와 데이터 전송을 위해 모델을 직렬화하고 직렬화를 해제하는 방법을 설명하는 선언적 방식입니다 이제 앱 엔티티를 Transferable로 만들 수 있습니다
예를 들어 Transferable을 사용해 AppEntity를 PDF 이미지 리치 텍스트로 변환하고 내보낼 수 있습니다 Transferable을 사용하면 Siri와 단축어가 AppEntity를 변환해서 새 값을 다른 AppIntents에 전달할 수 있습니다
이렇게 하면 콘텐츠가 Mail에 첨부 파일로 전달되거나 이미지로 변환되어 사진 보관함에 가져올 수 있습니다
제 Trail 앱에서 저는 완료한 활동을 추적할 수 있고 그 활동을 활동 통계 요약 엔티티로 나타냅니다 저는 그것을 다른 앱에도 의미 있는 것으로 만들고 싶어서 Transferable 지원을 추가하겠습니다
Transferable로 엔티티를 확장하고 정적 transferRepresentation 메서드를 구현합니다
활동 요약을 리치 텍스트로 변환하는 메서드는 이미 있으니 DataRepresentation을 추가하고 exportedContentType으로 RTF를 지정합니다
요약을 PNG 파일로 내보내는 FileRepresentation 메서드도 추가합니다
전송 가능한 표현을 정의하는 순서가 중요합니다 정확성이 가장 높은 것부터 낮은 것 순으로 제공합니다 예를 들면 제 유형의 코딩 가능한 개인 표현 RTF처럼 손실이 더 많은 형식 일반 텍스트 순으로 제공합니다 이제 단축어 앱에서 어떻게 작동하는지 보겠습니다 활동 요약 작업의 결과를 가져와 활동 기록 메모에 소모한 칼로리 속성을 추가하는 단축어입니다
이제 Transferable을 구현했으니 결과를 엔티티 자체로 변경하면 어떻게 되는지 보겠습니다 단축어를 실행한 후 활동 요약 결과가 텍스트로 변환되어 메모에 추가된 것을 보실 수 있습니다
유형을 이미지로 변경하고
단축어를 다시 실행하면 대신 PNG 표현을 사용했다는 걸 볼 수 있습니다 이걸 보세요, 우리 디자인 팀의 앞날이 밝은 것 같죠 현재 AppEntity와 조합해 Transferable API를 사용할 때 몇 가지 제한 사항이 있습니다 Xcode가 컴파일할 때 Transferable 표현을 이해해야 하기 때문입니다 Xcode가 이해할 수 없는 경우 피드백을 제공합니다 또한 ProxyRepresentation은 @Property 속성을 가진 AppEntity를 참조하는 경우에만 사용할 수 있습니다 이 예에서는 @Property 속성을 가지고 있어서 이름 속성을 사용할 수 있습니다
하지만 설명에는 속성이 없어서 사용할 수 없습니다
Transferable에 관해 자세히 알아보고 싶으면 Julia가 진행한 WWDC22 ‘Transferable 소개‘를 보세요
개선된 IntentFile로 콘텐츠에 접근하는 방법을 설명하겠습니다 Transferable로 엔티티의 콘텐츠 유형 변환 방법을 설명했었죠 이것이 수신하는 쪽에서 어떻게 작동하는지 보겠습니다 앞에서 활동 요약을 메모에 추가하는 방법을 보여드렸습니다 AppendToNote처럼 AppIntent는 IntentFile 매개변수를 받을 때 사용 가능한 콘텐츠 유형을 확인하고 필요한 유형이 무엇이든 요청할 수 있습니다 앱 인텐트는 이를 수행할 때 Transferable 표현을 사용해서 엔티티를 요청받은 콘텐츠 유형으로 변환합니다 여기 AppendToNote 예시가 있습니다 첨부 파일 매개변수가 어떤 콘텐츠 유형을 지원한다고 선언하는지 주목하세요 이렇게 하면 Siri와 단축어 앱이 가능한 경우 콘텐츠를 자동으로 변환합니다
IntentFile의 콘텐츠에 접근하기 위해 새로운 API로 콘텐츠를 추출할 수 있습니다 IntentFile이 어떤 콘텐츠 유형을 나타내는지 확인할 수 있고 URL에 접근해 변환을 수행합니다 계속하기 전에 콘텐츠를 나타내는 방법을 한 가지 더 설명하겠습니다 FileEntity API는 문서 기반 앱이나 파일 관리 앱에 적합합니다
Transferable이 AppEntity를 파일 또는 데이터로 변환하는 방법을 설명했는데 이 방법은 엔티티가 데이터베이스나 서버의 객체를 나타내는 경우에 적합합니다 엔티티 자체가 텍스트 문서나 이미지 같은 파일이라면 어떻게 될까요? 이런 경우 파일은 표준 버전의 엔티티입니다 또 다른 앱에는 PhotoEntity가 있습니다 PhotoEntity는 디스크의 이미지 파일을 나타냅니다 제 앱은 제 AppIntents에서 SetFavoritePhoto 인텐트 같은 엔티티를 이해하고 사용할 수 있지만 다른 앱은 그들의 AppIntents에서 이해하고 사용할 수 없습니다 하지만 방금 설명한 것처럼 다른 앱은 IntentFile을 통해 파일을 이해하고 파일에 접근할 수 있습니다
Siri와 단축어 앱은 FileEntity를 사용해 다른 앱의 파일에 안전하게 접근할 수 있고 다른 앱이 파일에 직접 접근하도록 허용합니다 예를 들어 다른 앱의 RotateImageIntent가 PhotoEntity 파일에 안전하게 접근하고 파일을 회전할 수 있죠
여기 FileEntity를 구현하는 예시가 있습니다 다른 AppEntity처럼 작동하지만 지원되는 콘텐츠 유형 목록을 제공해야 합니다
그리고 ID는 FileEntityIdentifier여야 합니다
FileEntityIdentifier는 URL로 생성될 수 있습니다 또는 파일이 없는 경우 초안 식별자로 생성될 수 있습니다 FileEntityIdentifier는 URL의 책갈피 데이터를 사용하니까 파일이 이동되거나 파일 이름이 변경되더라도 엔티티는 유효합니다 제 앱은 PhotoEntity 항목을 격자로 표시합니다 최근에 추가한 두 항목이 격자 하단에 잘못된 방향으로 표시되어 있네요 단축어로 그걸 수정하겠습니다 사진 엔티티에 대해 쿼리를 실행하고 추가된 날짜로 오늘을 사용해 이미지를 필터링한 다음 내장된 단축어 회전 동작을 사용해 쿼리 결과에 90도 회전을 적용합니다 단축어를 실행할 때 앱에서 이미지 파일이 회전되었죠 앱으로 돌아가면 파일 변경이 감지되어 UI가 업데이트된 걸 볼 수 있습니다
이런 새로운 API들은 강력합니다 여러분의 엔티티가 다른 앱에 의미를 갖고 다른 앱의 엔티티가 여러분의 앱에 의미를 가질 수 있어서 Siri와 단축어에 새로운 가능성을 열어주기 때문입니다
다음은 범용 링크와 이 링크를 앱 인텐트 유형으로 나타내는 방법을 설명하겠습니다 범용 링크가 앱에 설치되어 있지 않아도 이 링크를 통해 콘텐츠에 접근할 수 있습니다 Trail 앱은 이미 특정 탐방로를 여는 범용 링크를 지원합니다 여기 특정 탐방로의 세부 내용에 링크되는 예시 URL이 있습니다 1은 열릴 탐방로의 ID를 나타냅니다
이제 여러분의 AppEntity를 표현할 수 있습니다 URLRepresentation을 가진 AppEnum과 AppIntent를 사용해서요 이렇게 하면 Siri와 단축어가 그것들을 특정 콘텐츠 링크처럼 취급해서 URL을 여는 동작을 허용하거나 동작을 공유할 수 있게 합니다 저는 단축어에서 특정 탐방로에 딥링크하고 싶어서 TrailEntity를 확장하고 URLRepresentableEntity를 추가합니다
범용 링크를 템플릿으로 사용해 정적 URLRepresentation도요
저는 엔티티의 식별자를 보간값으로 사용하고 있습니다 @Property 속성을 가진 엔티티의 ID나 속성을 URL 문자열의 보간값으로 사용할 수 있습니다
이제 TrailEntity가 URLRepresentableEntity를 지원하니 URLRepresentableIntent와 함께 이걸 사용하는 방법을 보겠습니다 TrailEntity를 위해 OpenIntent와 OpenTrailIntent를 작성하고
URLRepresentableIntent도 같은 줄에 추가합니다
끝났습니다. perform 메서드를 구현할 필요도 없습니다 앱 인텐트가 기존 URL 처리 코드 호출을 처리합니다
단축어에서 이 앱 인텐트를 사용할 때 어떻게 되는지 봅시다 제 딸과 저는 자전거 애호가라 부근의 자전거 탐방로를 찾아서 하나를 무작위로 선택하는 단축어 앱이 제게 있습니다 하지만 그 단축어는 지금은 탐방로 이름을 표시하는 게 전부죠 앱에서 탐방로로 바로 이동할 수 있다면 좋을 텐데 말이죠 그래서 OpenTrailIntent를 추가하겠습니다
탐방로 열기 동작을 추가해 결과 표시 동작을 대체합니다
이제 단축어를 실행하면 TrailEntity가 URL로 표현되어 탐방로 세부 정보에 바로 딥링크됩니다 앱 인텐트에 URL을 사용할 수 있는 또 다른 방법은 perform 메서드에서 새로운 OpenURLIntent를 반환하는 것이죠 Siri와 단축어 앱은 AppIntent를 수행할 때 제공된 URL을 열어 관련 콘텐츠에 링크할 수 있습니다
‘CreateTrail‘ AppIntent가 있으면 새로 작성된 TrailEntity로 OpenURLIntent를 초기화해서 단축어로 앱을 열고 새로 작성된 Trail로 직접 이동할 수 있습니다
URLRepresentable을 사용하면 AppIntent 유형에 범용 링크를 쉽게 제공하고 기존 URL 처리 코드를 재사용하고 콘텐츠에 접근할 수 있습니다 올해는 또한 개발자 경험을 개선해서 AppIntents를 더 쉽게 작성할 수 있습니다 새로운 유형의 매개변수와 AppIntents를 정의 및 재사용하는 개선된 방법을 설명하겠습니다
먼저, UnionValue입니다 가끔 하나의 유형 세트로 나타낼 수 있는 매개변수나 속성이 있습니다 저의 BuyDayPass AppIntent는 TrailEntity를 받지만 저는 탐방로 하나 또는 전체 공원 1일 이용권을 구입하는 옵션을 사용하고 싶습니다 이를 위해 새로운 UnionValue 매크로를 사용합니다
먼저, 열거형을 작성하고 두 가지 구입 옵션을 정의합니다 하나는 ParkEntity를 사용하고 다른 하나는 TrailEntity를 사용합니다
그리고 새로운 UnionValue 매크로를 열거형에 추가합니다
이제 매개변수를 업데이트해 DayPassType 열거형을 사용합니다
perform 메서드에서 passType 매개변수에 다른 열거형처럼 스위치 사용도 가능하죠
열거형의 각 케이스에 연관 값이 정확히 하나가 있어야 한다는 것에 유의해야 합니다
연관 값이 없는 케이스는 유효하지 않습니다
또한 각 연관 값은 고유해야 합니다 TrailEntity 케이스가 있으면 또 하나 추가할 수는 없습니다 기존 유형 중 하나를 사용하려면 UnionValue를 사용합니다 이것을 ‘or‘ 매개변수라고 생각할 수 있습니다
AppIntent를 전에 사용한 적이 있다면 AppIntent 예제 중 일부에서 @Parameter 속성에 제목이 누락되어 있다는 걸 아셨을 것입니다 Xcode 16.0으로 빌드할 때는 더 이상 AppEntity 속성이나 AppIntent 매개 변수에 제목을 제공하지 않아도 됩니다
따라서 SuggestedTrails 인텐트를 줄일 수 있습니다
이렇게 말이죠 Xcode가 구조체의 속성 이름을 기반으로 제목 문자열을 자동으로 생성합니다
하지만 TrailCollection의 경우 ‘Featured Collection‘을 제목으로 표시하고 싶어서
이전과 마찬가지로 제목을 직접 지정합니다
마지막으로 중요한 점은 프레임워크에서 AppIntents 사용 방법이 개선되었다는 것입니다 이전에는 모든 앱 인텐트 유형이 같은 모듈에 있어야 했습니다 앱에 AppIntent를 사용할 수 없어서 프레임워크 중 하나에 정의된 AppEntity를 사용해야 했습니다 AppIntent도 프레임워크에 있어야 했습니다 Xcode 16에서는 그런 제한이 사라져 앱 엔티티를 프레임워크에서 정의하고 앱과 대상 확장 프로그램에서 참조할 수 있습니다
현재는 프레임워크만 지원됩니다 프레임워크 외부의 라이브러리는 지원되지 않습니다
이런 것들은 AppIntents의 새 기능과 개선 사항 중 일부일 뿐입니다 더 자세히 알아보려면 AppIntents 설명서를 확인하세요
비디오 플레이 속도를 잠깐 늦추고 같이 요약해 보죠 Spotlight에서 앱 엔티티를 인덱싱해서 Siri가 이전에는 불가능했던 것을 찾고 이해할 수 있습니다 앱 엔티티에 대한 의미 있는 표현을 제공해서 다른 앱이 콘텐츠를 이해할 수 있게 합니다 URLRepresentable과 새로운 개발자 개선 사항을 사용해 보고 여러분의 의견을 알려 주세요 또한 AppIntents는 기기 전반에서 다른 많은 기능을 지원합니다 여기 아래에 나열된 다른 비디오를 확인해서 AppIntents를 사용하는 다른 흥미로운 기능을 알아보세요
인텐트로 여러분의 앱을 어떻게 강화하실지 기대됩니다 시청해 주셔서 감사합니다
-
-
찾고 계신 콘텐츠가 있나요? 위에 주제를 입력하고 원하는 내용을 바로 검색해 보세요.
쿼리를 제출하는 중에 오류가 발생했습니다. 인터넷 연결을 확인하고 다시 시도해 주세요.