스트리밍은 대부분의 브라우저와
Developer 앱에서 사용할 수 있습니다.
-
앱 인텐트로 사용자에게 앱의 핵심 기능 제공하기
인텐트, 엔티티, 쿼리 등 App Intents 프레임워크의 기본 요소와, 이러한 요소를 활용하여 앱의 중요 기능을 적재적소에 노출하는 방법을 살펴보세요. 앱 인텐트를 기반으로 Siri, 제어기 및 위젯, Apple Pencil, 단축어, 동작 버튼 등 다양한 시스템 기능과 앱 간의 긴밀한 통합을 빌드하는 방법을 소개합니다. 코드 및 핵심 기능을 공유하면서 앱 인텐트 통합을 효율적으로 빌드하여 모든 인터페이스에서 탁월한 경험을 제공하는 팁도 함께 확인해 보세요.
챕터
- 0:00 - Introduction
- 1:29 - Friction versus flow
- 5:44 - Understanding the framework
- 8:06 - Building the code
리소스
- Accelerating app interactions with App Intents
- App Intents
- Creating your first app intent
- Forum: Machine Learning and AI
- Making actions and content discoverable and widely available
관련 비디오
WWDC24
WWDC23
-
다운로드
안녕하세요 ‘앱 인텐트로 사용자에게 앱의 핵심 기능 제공하기’ 세션입니다 저는 앱 인텐트 팀의 엔지니어인 Christopher Nebel입니다 제가 만든 앱이 보이시나요? 실은 Apple Developer에서 다운로드한 샘플 코드입니다 이 비디오에서 예제로 삼을 등산로 카탈로그 앱입니다 어쨌든 이 앱은 근사합니다 앱에 접속한 사용자에게 기분 좋은 경험을 제공하죠 그럼 접속하지 않을 때는 어떨까요? 홈 화면 구석에 있는 상자처럼 보이지만 꼭 그렇지만은 않습니다 적절한 코드를 사용하면 앱의 기능을 상자에서 꺼내 기기의 다른 위치에 표시할 수 있습니다 그러면 Spotlight나 Siri를 통해 앱의 기능을 바로 사용할 수 있죠
위젯을 홈 화면에 추가할 수도 있고
제어 센터에 작업 및 상태를 추가할 수도 있죠 이렇게 하면 사용자가 앱에 접속하지 않아도 계속 앱 경험을 제공할 수 있습니다 이것이 바로 앱 인텐트 및 관련 기능의 역할입니다 자세한 내용을 이 세션에서 알아보세요 먼저 앱 사용의 흐름을 개선하는 방법과 여기에 필요한 시스템 기능을 설명하겠습니다 그 다음 앱 인텐트의 정의와 작동 방식을 알아보고 적절한 앱 인텐트를 만드는 방법을 알아보겠습니다 기분 좋은 경험을 위해 중요한 건 흐름입니다 심리학에서는 흐름을 사고와 행동의 융합이라고 봅니다 사람의 의도가 행동으로 매끄럽게 이어지는 것을 뜻하죠 기기에서 좋은 흐름을 만들려면 작업의 다음 단계 요소를 가깝고 접근하기 쉽게 배치해야 합니다 흐름에 방해가 되는 추가 단계를 마찰이라고 합니다 작업을 방해하는 모든 것을 마찰에 비유할 수 있죠 다양한 표현에서 이러한 비유가 나타나는데요 ‘마찰이 많아 거칠다’ ‘턱턱 막힌다’ ‘매끄럽지가 않다’ ‘마찰이 적어 유동적이다’ ‘기름칠이 잘 된 기계와 같다’ ‘매끄럽다’처럼요 어떤 경우에는 마찰이 전혀 없는 것보다 약간 있는 게 나을 수도 있지만 일반적으로는 마찰을 최소화하면 좋습니다 마찰이 언제나 하나의 큰 장벽인 것은 아닙니다 오히려 자꾸 부딪치게 되는 작은 걸림돌인 경우가 많습니다 기기 사용 시 겪는 마찰의 예로 앱 전환이 있습니다
앱은 개발자가 공들여 만든 상자 속의 작은 세상이라 앱 안에서는 모든 게 완벽합니다 문제는 대부분 작업에 하나가 아니라 여러 앱을 사용한다는 것입니다 앱 전환은 어떻게 이루어질까요? 각 앱은 서로 다른 상자에 있으므로 상자의 내용물을 보거나 작업을 하려면 반드시 그 상자에 들어가야 합니다 이때 다른 상자 안을 보거나 작업을 하려면 현재 박스에서 나와야 합니다 앱 전환이 필요한 시점이죠 앱 전환은 어렵지 않아도 번거롭습니다 사용자는 앱을 왔다갔다 하는 동안 시간과 에너지를 소비하며 마찰을 경험합니다 기기가 앱의 핵심 기능을 이해하고 이를 꺼내 더 높은 계층에 표시하면 사용자는 앱 기능에 더 쉽고 빠르게 접근할 수 있을 겁니다 이 아이디어를 바탕으로 매끄러운 기기 사용 흐름을 만들기 위해 개발된 시스템 기능 모음이 있습니다 예제를 살펴본 후 함께 빌드해보죠 예제 앱은 지역 내 등산로 카탈로그와 각 등산로의 세부 정보를 제공합니다 Spotlight 검색 등을 사용하면 앱 내 특정 위치로 빨리 이동할 수 있죠 홈 화면에서 앱에 고정된 등산로를 확인해 보겠습니다 Spotlight를 실행합니다 입력하기도 전에 Spotlight 제안이 제 의도를 추측하고 필요한 앱 단축어를 제공합니다 Spotlight가 이걸 추측하지 못하면 번거롭게 앱 이름을 입력해야겠죠 의도가 확실해지자 앱이 가장 연관성 높은 항목으로 표시되고 앱 단축어가 더 크게 배치됩니다
어디서든 Siri에게 원하는 것을 말할 수도 있습니다
앱 전환을 쉽게 만들어줄 뿐 아니라 앱 전환의 필요조차 없애주는 기능도 있습니다 예제 앱에서 특정 등산로의 상태를 계속 확인하려는 경우 생각날 때마다 앱을 열어 보는 대신 홈 화면에 위젯을 추가하면 됩니다 그러면 다른 일을 하면서도 정보를 볼 수 있죠 잠금 화면에 추가하면 휴대폰의 잠금을 해제할 필요도 없습니다 제어 센터에 제어 항목으로 추가하면 다른 앱을 사용하는 도중에도 접근할 수 있습니다 비슷한 기능은 많이 있으며 계속 추가되고 있습니다 작년에는 동작 버튼이 추가되었고 올해는 카메라 캡처, Apple Pencil Pro 의 스퀴즈 등을 추가할 예정입니다 이러한 기능은 앱의 기능을 상자 밖으로 꺼내 전체 기기 경험의 일부로 통합하고 작업 의도에서 실제 작업 수행으로 이어지는 흐름을 간소화합니다 이러한 기능 간에는 중요한 차이점이 있는데 무엇을 끌어 올릴지 누가 정하냐는 것입니다 Spotlight의 경우 바로 여러분 개발자가 선택합니다 개발자가 앱에 있는 중요한 작업을 강조 표시해 두면 기기가 그 작업을 적절한 위치에 자동으로 표시합니다 사용자는 기기의 어느 위치에서든 앱의 핵심 기능에 손쉽게 접근할 수 있으므로 경험의 매끄러운 흐름을 느끼게 됩니다
위젯, 제어 항목 등은 사용자가 선택합니다 사용자는 개발자가 제공한 유연한 구성요소를 선택하여 작업 흐름을 구축합니다 즉, 사용자는 앱 경험을 개인화하여 기기를 자기 경험의 연장선은 물론 자기 표현으로 만들게 됩니다 사용자는 물론 개발자에게도 좋은 일이죠 사용자가 생활에 앱을 녹여낼 수 있다면 앱을 계속 사용할 가능성이 높아지기 때문입니다 흐름을 구축하면 어떤 장점이 있는지 보셨으니 이제 방법이 궁금하실 텐데요 솔루션은 앱 인텐트를 채택하는 것입니다 Siri, 제어 센터 등 각종 기능 구현을 생각하고 계셨던 분들께는 의아하게 느껴질 것입니다 좀 더 자세히 설명해 드리죠 앱 인텐트 자체는 기능이 아니라 다양한 기능의 공통 기반입니다 지금까지 말씀드린 Siri, Spotlight 단축어 등 모든 기능에는 공통점이 있습니다 앱 안의 핵심 기능과 의미 있는 작업 및 콘텐츠를 꺼내와서 앱 바깥에 표시한다는 점입니다 그렇게 하려면 개발자는 시스템이 이해할 수 있는 방식으로 앱의 핵심 기능을 노출해야 합니다 앱 인텐트는 이를 위한 프레임워크로 2가지 큰 부분을 처리합니다 첫째, 핵심 작업 및 콘텐츠를 정의하여 Siri와 Spotlight 같은 시스템 기능이 표시할 항목을 구분합니다 둘째, 사용자에게 기능을 표시하려면 앱과 시스템 사이에 깊은 커뮤니케이션이 필요합니다
예를 들어 Siri에게 앱에서 작업을 수행하라고 말하면 Siri는 해당 앱에 작업 수행 요청 메시지를 보내고 앱은 작업 수행 완료 메시지를 회신해야 결과가 나옵니다
앱 인텐트는 이 커뮤니케이션을 처리하므로 개발자는 기능의 실제 동작을 구현하는 데 집중할 수 있습니다 한 가지 시스템 기능을 지원하도록 작업한 후에는 어떨까요? 같은 작업이 다양한 시스템 기능에 유용하게 쓰입니다. 그 기능들도 모두 앱 인텐트를 기반으로 하기 때문입니다 기능 간에 코드를 공유할 수 있으며 똑같은 코드로 여러 기능이 지원됩니다 세 가지 최상위 항목 작성법을 다음 섹션에서 보여드리겠습니다 인텐트는 보기 열기, 하이킹 시작과 같은 동작을 수행합니다 인텐트는 앱의 명령 또는 동사입니다
엔티티는 등산로 또는 컬렉션과 같은 개체입니다 이들은 명사입니다 인텐트가 동사이고 엔티티가 명사라면 앱 단축어는 문장입니다 단축어는 동사와 명사(또는 공백)로 이루어지며,필요시 다른 옵션도 추가해 앱의 중요 기능 즉 사용자가 주로 하는 동작을 설명하는 문장입니다 Spotlight와 동작 버튼 등의 기능이 그 문장을 제공하므로 사용자는 이를 빠르고 쉽게 수행할 수 있습니다
이 모두는 함께 기기 전체에서 앱이 표시되는 방식을 정의합니다 일반적인 개념을 알아보았으니 이제 코드를 작성해 보겠습니다
앱의 흐름을 원활하게 하기 위해 앱에 몇 가지 기능을 추가하겠습니다 다섯 가지네요 매개변수가 없는 간단한 단축어 동작 매개변수가 있는 단축어 동작 홈 화면 위젯 제어 센터 제어 항목 Spotlight 및 Siri용 앱 단축어 일이 많아 보여도 모두 앱 인텐트 프레임워크 기반이라 기능 간에 많은 코드를 공유할 수 있습니다 그럼 시작하겠습니다
단축어 앱은 동작을 탐색, 결합 조합하여 맞춤형 단축어를 만들 수 있는 강력한 도구입니다 예를 들어 동료는 딸과 산악자전거 타기를 좋아해 제 앱의 동작으로 지역에 자전거 경로를 임의로 택하는 사용자 정의 단축어를 만들었습니다 개발자로서 저는 이 기능에 중점을 안 둘 것 같아요. 좀 세부적이죠 하지만 단축어 동작으로 유연하게 사용자가 직접 동작을 만들고 정확히 자신이 원하는 대로 조정하도록 할 수 있습니다
최근에는 등산로를 목록 위에 핀으로 고정하는 기능을 추가했습니다 그러면 여행을 계획할 때 세부 사항을 빨리 열 수 있어 가는 법, 개를 데려올 수 있는지 등의 질문에 답할 수 있습니다 잘 작동하지만 앱 밖에 있는 경우에도 등산로를 빨리 볼 수 있으면 좋으니 앱에 고정된 등산로의 정보를 여는 단축어 동작을 만들어 보겠습니다 완료되면 단축어 앱에 다음과 같이 표시될 것입니다
앱 인텐트 프레임워크에서 단축어 작업은 인텐트이며 모든 인텐트는 기본적으로 단축어 앱에서 작업으로 표시됩니다
인텐트는 앱 인텐트 프로토콜을 따르는 타입입니다 여기에는 두 가지 필수 부분이 있습니다 작업 이름이 될 현지화 가능한 제목과 작업을 하는 perform 메서드입니다 인텐트는 앱을 사용하는 사람에게 항상 의미 있는 작업이어야 합니다 여기에서 OpenPinnedTrail은 내부 구현이 아닙니다
Perform 메소드에는 항상 결과가 있지만 이렇게 결과가 비어 있을 수 있습니다
이 인텐트는 실행 시 앱을 열고 싶습니다. 앱의 항목을 보여주니까요 지시하면 앱 인텐트가 처리해 줍니다 이렇게 openAppWhenRun으로요
인텐트는 작업 수행에 필요한 추가 매개변수, 정보를 가질 수도 있습니다 이 인텐트에는 필요치 않지만, 나중에 추가 정보가 필요한 것도 다루겠습니다
됐습니다 새 인텐트가 단축어 앱 라이브러리에 작업으로 표시됩니다
이 작업으로 단축어를 만들면 단축어 앱에서 실행할 수 있습니다 한 걸음 더 나아가 홈 화면에 추가할 수도 있습니다
탭하면 앱이 실행되고 원했던 대로 핀 고정한 등산로 정보가 같이 열립니다
지금도 괜찮지만, 등산로 선택 동작도 있으면 좋겠습니다. 특정 등산로를 여는 단축어나, 실행할 때 어떤 등산로를 열지 묻는 단축어를 만들면 됩니다 그러기 위해서는 매개변수를 사용해 인텐트를 만들어야 합니다 첫 번째 인텐트와 매우 비슷해 보일 것입니다 첫 번째 인텐트를 복제하고 이름을 변경하는 것부터 시작하겠습니다 앱에서 매개변수를 여는 인텐트에는 OpenIntent라는 특별한 프로토콜이 있으므로 이를 추가하겠습니다
OpenIntent는 openAppWhenRun을 의미하므로 이건 삭제해도 됩니다
그리고 프로토콜이 정의하는 매개변수를 추가해야 합니다 매개변수는 @Parameter로 표시되는 일반 속성일 뿐이므로, 현지화 가능한 제목과 같은 메타데이터를 추가할 수 있습니다 이것은 등산로여야 한다고 했습니다 등산로는 제 앱의 핵심 콘텐츠이므로 등산로 엔티티를 만들겠습니다
여기서 두 가지 사항을 기억해야 합니다 첫째, 엔티티는 앱을 사용하는 사람에게 의미 있는 것이어야 합니다 데이터베이스 행이 아니고, 제가 만든 다른 무엇도 아니고, 등산로입니다 둘째, 엔티티를 참조하는 매개변수는 설명 데이터가 아닌 엔티티여야 합니다 따라서 이것은 등산로 이름이나 UUID가 아닌 TrailEntity입니다
perform 메서드를 업데이트하여 해당 매개변수로 이동합니다 이제 TrailEntity를 정의해야 하는 부분만 빼고 모두 끝났습니다
다행히 그다지 어렵지는 않습니다 엔티티는 AppEntity 프로토콜을 준수하는 타입입니다 모델 타입을 직접 준수하게 만들 수 있습니다 이 방법은 모델이 작아 한 번에 모두 메모리에 넣을 수 있고, 필요한 인스턴스가 모두 이미 존재하는 경우에 잘 작동합니다 혹은 엔티티를 구현 참조만 하는 자체 타입으로 만들 수 있습니다 이 방법은 모델 인스턴스를 필요할 때만 생성하거나, 인스턴스가 용량이 크거나, 필요하지 않은 속성이 있는 경우에 유용합니다
이 예는 두 번째 방법을 사용하므로 TrailEntity가 기저의 모델 타입 Trail을 참조합니다
여기서 엔티티는 등산로 이름인 속성을 가질 수 있습니다 매개변수와 매우 유사하지만 명령이 아니라 콘텐츠 개체에 있습니다 엔티티는 세 가지를 갖춰야 합니다 기기가 엔티티를 메뉴에 표시하는 등의 작업을 수행할 수 있도록 하는 디스플레이 표시가 있어야 하고 영구 식별자와 쿼리도 있어야 합니다
좋습니다 쿼리는 뭘까요?
쿼리에 대해 이해하려면 쿼리가 하는 일부터 알아야 합니다 쿼리는 엔티티를 요청하는 질문을 실제 엔티티로 전환합니다 인텐트 매개변수의 값을 선택하면 두 가지 질문을 하게 됩니다 첫 번째 질문은 “어떤 엔티티가 있는가?”입니다 이 질문으로 기기는 선택 가능한 옵션 목록을 표시할 수 있습니다 하나를 선택하면 그 엔티티의 ID를 저장합니다 이후 인텐트 실행 시 저장된 ID를 전송, 쿼리로 둘째 질문에 답변합니다 “이 ID는 어떤 엔티티의 것인가?” 질문의 답변이 오면 인텐트 매개변수가 채워지고 인텐트 코드가 ID만이 아니라 엔티티도 가져옵니다 이 코드는 어떻게 생겼을까요?
쿼리는 EntityQuery를 준수하는 타입입니다 엔티티 요청 방법은 여러 가지가 있습니다 앞서 언급한 두 가지 방법인 옵션 목록과 ID 출처 외에도 문자열을 검색하거나 술어로 검색할 수 있습니다 EntityQuery에는 질문 유형마다 하나씩, 여러 하위 프로토콜이 있습니다 어떤 엔티티가 있는지에 대한 질문은 이렇게 allEntities 메서드를 정의하는 EnumerableEntityQuery로 처리할 수 있습니다 이것은 개념적으로 가장 간단한 형태의 쿼리입니다 iOS 18 SDK로 빌드하는 경우 앱 인텐트는 더 복잡한 것을 파생시킬 수 있습니다 물론 실제로 모든 엔티티를 한 번에 반환할 수 있는 경우에만 작동하므로 전체 모델이 메모리에 들어갈 수 있어야 합니다 그렇지 않은 경우나 자동 파생된 쿼리보다 나은 쿼리를 만들 수 있는 경우에는 다른 쿼리 프로토콜 중 하나를 사용해야 합니다 하지만 이 예제는 충분히 간단해서 잘 작동합니다
이 ID를 가진 엔티티에 대한 질문은 entities(for:) 메서드를 사용해 EntityQuery 자체에서 답변합니다
매개변수 구성이 작동하려면 필요한 모든 일을 이것들이 처리합니다
이제 제 인텐트를 실행할 준비가 되었습니다 하지만 하나 더 추가해야 하는데 바로 매개변수 요약입니다
매개변수 요약이 없으면 인텐트는 단축어 앱에서 이렇게 표시됩니다 작동은 하지만, 열고 싶은 등산로가 스크롤 해야 볼 수 있어 어렵습니다
매개변수 요약은 모든 필수 매개변수의 값, 이 경우 열려는 등산로를 포함, 인텐트가 수행할 작업을 설명하는 자연어 문장입니다 이제 이 인텐트를 쉽게 확인하고 매개변수 편집 중에도 읽을 수 있습니다
작동하는 모습을 보겠습니다 Trail 위치 지정자를 탭하면 등산로를 선택할 수 있는 시트가 있습니다 쿼리는 옵션을 제공하고 검색의 기반이 됩니다 선택하면 인라인으로 표시돼 실행 시 수행할 동작을 즉시 읽을 수 있습니다 이것이 실제로 작동하는 매개변수 요약입니다
사실 지금 등산로를 선택하고 싶지는 않습니다 실행될 때 선택하고 싶습니다 그러니 매개변수의 선택을 취소하고 홈 화면에 단축어를 저장하겠습니다
이제 단축어를 탭하면 다시 이 쿼리 기반의 유사한 선택기가 표시되며 홈 화면이나 단축어를 실행할 수 있는 모든 곳에서 바로 작동합니다
단축어 동작은 앱에 유연성을 더하는 최고의 수단입니다 사용자는 생각도 해 보지 못했던 온갖 워크플로에 단축어를 넣을 것입니다 정보를 한눈에 볼 수 있는 더 집중된 형태의 유연성을 살펴보겠습니다 위젯입니다 등산로의 세부 사항은 대부분 자주 변경되지 않습니다 등산로가 새로운 곳으로 이동하거나 하지는 않습니다 아마도요 지진이 날 수 있긴 하죠
하지만 조건은 변경될 수 있고 변경되므로 조건을 계속 지켜볼 수 있으면 편리합니다
위젯을 사용하면 완벽하죠. 정보를 한눈에 볼 수 있도록 디자인되니까요 핀으로 고정한 등산로의 세부 사항만 표시하는 위젯을 만들 수도 있지만 몇 가지 등산로를 계속 지켜보다가 가장 좋은 곳을 선택하면 좋겠습니다 그러려면 표시할 등산로를 설정하도록 위젯을 구성 가능하게 만들어야 합니다 제 위젯이 제 OpenTrail 동작처럼 등산로 매개변수를 갖게 된다는 의미입니다
위젯을 만들려면 위젯 정의가 필요합니다 WidgetKit 비디오는 아니니 보기와 타임라인 제공자 등은 건너뛰겠습니다 이를 자세히 보려면 WidgetKit 문서를 참고하시고, 위젯이 앱 인텐트와 작동하는 방식을 알아보려면 WWDC23의 ‘앱 인텐트 개선 사항 살펴보기’를 확인하세요
여기서 중요한 부분은 body입니다 특히 이 위젯의 구성 인텐트 타입을 설정하는 인텐트 매개변수입니다
구성 인텐트는 WidgetConfigurationIntent를 준수하는 인텐트입니다 작동하는 방식이 재밌습니다
모든 인텐트가 그렇듯이 제목이 있어야 합니다 말했듯이 이 위젯을 등산로로 구성하고자 하므로 매개변수를 추가하겠습니다 등산로가 필요한데, OpenIntent에 이미 등산로 엔티티를 정의했습니다 재사용할 수 있을까요? 물어보니 재밌네요 물론 할 수 있습니다
선택 사항으로 설정해 위젯이 홈 화면에 있을 때는 비어 있을 수 있지만 그 외의 경우 OpenTrail 인텐트의 매개변수와 타입이 동일합니다 이제 구성 가능한 등산로 상태 위젯이 생겨 필요한 만큼 추가할 수 있습니다 아까 작성한 등산로 엔티티와 그 엔티티의 쿼리가 구성 값을 선택하므로 값은 다시 작성하지 않아도 됩니다 매우 간단했기 때문에 한 가지 더 시연해 보겠습니다 iOS 18의 새로운 API가 포함된 제어 센터 제어 항목입니다
위젯처럼 제어 항목의 등산로를 구성 가능하도록 하고 싶습니다 탭하면 앱에서 등산로의 세부 사항이 열립니다
지금은 제어 중 앱 인텐트와 관련이 있는 부분만 다룰 것입니다 제어에 대해서는 ‘시스템 전반에서 앱의 제어 범위 확장하기’를 참고하세요 이 점을 염두에 두고 시작해 봅시다
기본 개요는 제어가 특별한 위젯 타입인 ControlWidget이라는 것입니다 여기에는 제어의 외관과 기능을 정의하는 body가 있습니다 제가 보여 드리려는 구성 가능한 제어는 앱 인텐트를 사용하여 구성됩니다 구성 가능한 위젯과 비슷하게 AppIntentControlConfiguration을 추가합니다
버튼 역할을 해야 한다고 했으니 ControlWidgetButton을 추가하겠습니다
구성 가능한 버튼 제어의 기본 형태입니다 버튼 콘텐츠를 만들 수 있도록 구성을 포함할 인텐트 타입과 버튼을 탭할 때 처리할 인텐트 인스턴스가 여전히 필요합니다 잠시 생각해 보겠습니다 저는 구성에 등산로 매개변수를 포함하고 싶다고 말했습니다 그건 앞서 만든 OpenTrail 인텐트와 비슷한 것 같습니다 재사용할 수 있을까요? 할 수 있을 겁니다 OpenTrail에 대해 변경해야 하는 한 가지 사항은 OpenTrail이 제어 구성 인텐트를 준수한다고 선언하는 것입니다 확장 프로그램이고 인텐트에 아직 없는 것이 필요하지 않으므로 body는 비어 있습니다
완성되면 타입을 채우고 구성된 인스턴스를 사용해 버튼 이미지와 텍스트를 만듭니다
이 부분이 정말 기가 막힙니다 여전히 인텐트 인스턴스인 동작이 필요합니다. 구성된 등산로를 열어야죠 이것도 OpenTrail과 비슷한 것 같습니다 하지만 OpenTrail 인스턴스가 구성 인텐트로 있어 새로 만들지 않아도 됩니다 필요한 Perform 메서드가 이미 있고 원하는 방식으로 구성되어 있으므로 동작으로 간단히 전달할 수 있습니다 실제 작동을 봅시다
제어 센터의 새로운 구성 모드입니다 왼쪽 밑에 이미 새 제어를 추가해 두었고 거기서 Monterey Bay Coastal Trail을 열도록 구성했습니다 편집을 중단하면 제어가 활성화되므로 제어를 탭하면 인텐트가 실행되고 구성한 등산로 세부 사항이 제 앱으로 열립니다
이제 Spotlight와 Siri에서 제 앱의 동작 중 하나인 핀으로 고정한 등산로의 세부 사항 열기를 자동으로 실행할 수 있도록 설정하겠습니다 그렇게 하려면 앱 단축어를 만들어야 합니다 앱 단축어는 개발자가 인텐트 주변에 작성해 인텐트가 중요한 기능임을 알리는 래퍼입니다
그러면 앱을 실행 않거나, 한 번도 실행한 적 없더라도 Spotlight, 동작 버튼 Apple Pencil Pro와 같은 다양한 기능에서 그 앱 단축어를 제안합니다 거기 쓰는 코드를 살펴보겠습니다
앱 단축어 목록인 AppShortcutsProvider를 정적 멤버로 하나 정의하겠습니다 앱 단축어는 인텐트를 감쌉니다 아까 만든 OpenPinnedTrail 인텐트입니다 타입이 아니라 인텐트 인스턴스인 점을 확인해 주세요 그래서 여기에는 매개변수의 일부 또는 전부를 미리 채울 수 있습니다 매개변수가 많은 일반적인 인텐트 하나를 골라서 구체적인 작업을 수행하는 앱 단축어로 래핑할 수 있습니다 단축어가 실행되면 빈 필수 항목을 묻기 때문에 어떤 방식으로든 작동합니다 제공하려는 경험에 따라 달라지죠 이 인텐트는 어떠한 매개변수도 없으므로 괄호가 비어 있습니다
앱 단축어는 Siri에서 사용할 수 있으므로 말할 수 있는 구문 목록이 있으며 각 구문에는 앱 이름이 포함되어야 합니다 Spotlight, 제목, 이미지 등 시각적으로 표시되는 곳도 그렇습니다
여기에 없는 것이 하나 있습니다 바로 모든 종류의 등록 코드입니다 앱 인텐트 프레임워크가 자동으로 제공자를 감지하고 등록을 처리하므로 앱이 설치되는 즉시 앱 단축어를 사용할 수 있습니다
그러면 앱 단축어가 이제 Spotlight에 나타납니다
Siri가 알아들을 수도 있게 됩니다 Spotlight와 Siri는 모두 자동으로 처리됩니다. 기기를 사용하는 사람은 앱을 설치하는 것 외에는 아무것도 할 필요가 없습니다 하지만 기기를 맞춤 설정하려는 경우 앱 단축어를 동작 버튼과 Apple Pencil Pro에 설정할 수 있습니다 지금까지 한 가지 코드의 네 가지 기능에 대해 설명했습니다 만약 기존 앱 단축어를 가지고 있다면 어떨까요? 작년에 동작 버튼이 자동으로 됐던 것처럼 Apple Pencil Pro에서도 이미 작동합니다
괜찮아 보이지만, Siri 상호작용이 완벽하지 않습니다 먼저, 보기를 표시하기 때문에 기기를 바라보기는 해야 합니다 둘째로, 앱을 열기 때문에 현재 사용 중인 앱에서 나가게 됩니다 그러니 이 인텐트를 정보를 반환하는 약간 다른 인텐트로 바꾸겠습니다 인텐트를 만들 텐데, 이번에는 핀으로 고정한 등산로를 여는 인텐트가 아닙니다 등산로를 스니펫으로 표시하고 사용자가 화면을 보고 있지 않은 경우나 HomePod, AirPods처럼 화면이 없는 경우에는 음성으로 안내합니다
짧은 perform 메서드부터 시작하겠습니다 첫 단계는 핀으로 고정한 등산로를 가져오는 것입니다 두 번째 단계는 무엇일까요? 앱을 사용하지 않고 정보를 보여 주거나 읽으려면 어떻게 해야 할까요? result를 사용하면 됩니다 perform 메서드의 결과는 단순한 값이 아닙니다 Siri가 말할 수 있는 대화와 표시 가능한 보기 스니펫 등 다양합니다
결과가 ProvidesDialog와 ShowsSnippetView를 준수한다면 다른 메서드를 사용하여 대화와 보기를 사용하는 결과를 생성할 수 있습니다 대화만 제공하거나 보기만 제공할 수도 있지만, 지금은 둘 다 해 보겠습니다
Siri가 말할 내용을 작성하겠습니다 스니펫의 텍스트와 다를 수 있습니다 여기엔 편의상 보간된 문자열을 사용하지만 매개변수는 사실 IntentDialog 인스턴스이고 필요시 별도의 전체 및 지원 대화를 허용합니다
그리고 SwiftUI 보기를 제공합니다 지금은 보기의 정확한 세부 사항을 생략하고 별도의 함수를 사용해서 가져오겠지만 후행 클로저와 보기 빌더 표현식으로 인라인에 넣을 수도 있습니다 두 경우 모두 보기는 위젯처럼 보관되므로 Siri로 전달될 수 있습니다 따라서 위젯이 지원하는 모든 SwiftUI 기능을 사용할 수 있습니다
이제 Siri에게 요청하면 화면을 보고 있을 경우 Siri가 핀으로 고정한 등산로의 상태를 스니펫으로 보여 줍니다 스니펫을 닫으면 이전에 보고 있던 화면 이므로 다시 찾아갈 필요가 없습니다 화면을 보고 있지 않을 경우 Siri가 대화문을 말해 줍니다 등산화를 찾느라 주머니에서 휴대폰을 꺼내기 힘들면 방 건너편에 있는 HomePod에 등산로 상태를 물어도 됩니다 멋지죠! 사용자가 더 간편하게 제 앱을 사용할 수 있도록 엄청 많은 기능을 추가했는데 코드도 별로 길지 않았습니다 이것이 앱 인텐트의 역할입니다 핵심 개념을 한 번 표현하면 여러 관련 기능에서 재사용할 수 있죠 마무리: 앱을 사용할 때의 흐름을 개선할 수 있습니다 사용자가 작업을 더 빠르고 즐겁게 하고 앱 사용법도 조정할 수 있어 앱이 사용자의 삶에 일부가 됩니다 사용자가 앱에 들어가지 않고도 사용할 수 있도록 Siri, 단축어, 위젯 등의 기능을 채택하세요 이런 기능들은 앱 인텐트를 사용하면 됩니다. 모든 기능의 기반이니까요 그러면 익혀야 할 API의 종류도 적고 한 코드로 여러 기능을 구현할 수 있죠 더 자세히 알아보고 싶으신가요? 물론 그러시겠죠! 다음에 보실 만한 훌륭한 비디오들이 있습니다 앱 인텐트가 여전히 생소하신 분 사실 생소하지 않은 분도 ‘앱 인텐트 디자인하기’에서 좋은 앱 인텐트를 만드는 법을 알아보세요 앱 인텐트가 Siri와 작동하는 방식은 ‘앱을 Siri로 가져오기’를 시청하세요 이미 앱 인텐트가 있고 작년 이후 어떻게 달라졌는지 알아보려는 분은 ‘앱 인텐트의 새로운 내용’을 시청하세요
시청해 주셔서 감사합니다. 앱 인텐트로 무엇을 해내실지 정말 기대됩니다!
-
-
찾고 계신 콘텐츠가 있나요? 위에 주제를 입력하고 원하는 내용을 바로 검색해 보세요.
쿼리를 제출하는 중에 오류가 발생했습니다. 인터넷 연결을 확인하고 다시 시도해 주세요.