스트리밍은 대부분의 브라우저와
Developer 앱에서 사용할 수 있습니다.
-
앱 인텐트를 통해 앱 단축어 구현
앱에서 사용자 설정 없이 단축어를 생성하는 방법을 확인하세요. 앱 인텐트를 활용하여 맞춤형 단축어 보기를 표시하는 방법을 보여드리고, 매개변수화된 구문에 대한 지원을 추가하여 사용자가 인텐트를 빠르게 표현할 수 있도록 지원하는 방법을 알아보겠습니다. 또한 Siri 팁과 단축어 링크를 통해 앱 단축어의 검색 가능성을 높이는 방법을 소개합니다. 이 세션을 최대한 활용하려면 SwiftUI의 기본 사항을 숙지하시는 것이 좋습니다.
리소스
관련 비디오
Tech Talks
WWDC22
-
다운로드
♪ 부드러운 힙합 음악 ♪ ♪ 안녕하세요, Michael Sumner입니다 Siri와 앱 Intent를 담당하는 소프트웨어 엔지니어죠 이 세션에서는 새로운 앱 Intent 프레임워크를 사용하여 앱에 대한 앱 단축어를 만드는 방법에 대해 이야기하고자 합니다 우선 앱 단축어가 무엇이며 앱 Intent와 어떤 관련이 있는지 간략하게 살펴보겠습니다 그런 다음 Swift에서 앱 단축어를 만들고 매개 변수를 추가하는 과정을 살펴보겠습니다 마지막으로 여러분의 노력으로부터 사용자가 이점을 누릴 수 있게 앱 단축어를 검색 가능하게 만드는 방법에 대해 설명하죠 앱 Intent 프레임워크와 앱 단축어로 시작하겠습니다 사람들은 단축어 앱과 Siri에서 사용할 수 있는 앱으로 다단계 워크플로를 만들기 위해 단축어를 사용합니다 지금까지는 사용자가 여러분의 Intent를 사용하려면 먼저 ‘Siri에 추가’ 버튼 또는 단축어 앱을 통해 단축어를 설정해야 했습니다 이제 사용자 설정이 필요 없는 앱 단축어를 소개하게 되어 기쁩니다 이제 사람들이 여러분의 단축어를 이용하기가 그 어느 때보다 쉬워집니다 앱 단축어와 통합하면 앱이 설치되는 즉시 여러분의 앱에서 Intent를 사용할 수 있습니다 따라서 사용자는 앱의 기능을 쉽게 검색하고 사용할 수 있습니다 더 이상 단축어 앱으로 이동하거나 'Siri에 추가’ 버튼을 사용하여 설정할 필요가 없습니다 앱 단축어는 사용자가 만든 단축어처럼 단축어 앱 Spotlignt와 Siri에서 실행할 수 있습니다 이를 통해 사용자는 시스템의 다양한 위치에서 여러분의 응용 프로그램을 검색하고 상호 작용할 수 있죠 예를 들어 Spotlight에서 검색할 때 쉽게 액세스할 수 있도록 검색 결과에 바로 여러분의 앱 단축어가 표시됩니다 앱 단축어를 구현하면 사용자는 앱과 빠르고 가볍게 상호 작용할 수 있으며 이를 통해 작업을 더 쉽게 완료하고 할 일을 할 수 있습니다 우리 팀은 사용자가 명상을 할 수 있도록 도와주는 명상 앱을 개발하고 있습니다 오디오 프롬프트와 사운드를 통해 중요한 것에 집중하도록 도와주는 앱이죠 오늘은 명상을 시작하려면 사용자가 앱을 실행하고 로그인한 다음 실행할 명상 세션을 찾아야 합니다 앱 단축어와 통합하면 사용자는 Siri에게 요청만 하면 어디서든 이러한 기능에 빠르게 접근할 수 있죠 세션을 더 빨리 시작함으로써 사용자는 긴 하루 끝에 저녁에 긴장을 풀거나 아침에 일하러 가기 전에 그들의 일상에 명상을 통합할 수 있습니다 좋아요, 앱 Intent를 만들고 앱 단축어로 바꾸는 데 필요한 코드로 바로 들어가 보도록 하죠 이전 단축어와 달리 앱 단축어는 새로운 앱 Intent 프레임워크로 구축됩니다 앱 Intent는 처음부터 구축된 새로운 Swift 전용 프레임워크로 훌륭한 Intent를 더 빠르고 쉽게 구축할 수 있도록 지원합니다 앱 Intent를 사용하면 별도의 메타데이터 파일이 아닌 Swift 소스 코드에 모든 것이 올바르게 정의됩니다 이렇게 하면 코드 생성 단계가 제거되며 소스 편집기와 메타데이터 편집기의 맥락을 전환하지 않고도 집중할 수 있습니다 또한 코드 리뷰와 병합 충돌 해결이 더 쉽습니다 앱 단축어를 구축하려면 앱 Intent를 완전한 단축어로 변환하는 데 필요한 구문 및 기타 메타데이터를 나열하는 AppShortcutsProvider를 작성해야 합니다 또한 사용자 상호 작용 없이 설정되므로 트리거 구문에 응용프로그램 이름을 포함해야 한다는 걸 기억해 두세요 Intent는 AppIntent 프로토콜을 구현하는 Swift 구조체로 정의됩니다 기본 Intent에는 두 가지 요구 사항만 있습니다 Intent를 단축어 앱에 표시하는 데 사용되는 제목과 수행이라고 부르는 메서드입니다 수행 메서드는 Intent 로직을 실행하고 결과를 반환하는 장소입니다 또한 사용자에 대한 프롬프트를 트리거하고 응답을 기다릴 수 있습니다 이 Intent에서는 앱의 MeditationService를 사용해 기본값 명상 세션을 시작하겠습니다 수행 메서드가 비동기이므로 비동기 코드를 실행하여 세션을 시작할 수 있습니다 세션이 시작되면 사용자에게 표시되는 대화 상자를 반환합니다 앱이 현지화된 경우 이 문자열을 모든 로케일에서 현지화해야 합니다 지금까지 제가 구축한 대로라면 단축어를 작성할 때 단축어 앱에 StartMeditationIntent가 나타납니다 의욕적인 사용자는 이 Intent를 가지고 세션을 시작하는 단축어를 만들 수 있습니다 이 단축어에는 집중을 활성화하기 위한 두 번째 Intent도 추가했습니다 기본적으로 내 앱 Intent는 제가 소스 코드에 지정한 제목을 사용하여 렌더링됩니다 동작에 대한 렌더링을 사용자 정의하려면 앱 Intent에 매개 변수 요약을 추가해야 합니다 매개 변수 요약을 사용하면 값을 인라인으로 표시할 뿐만 아니라 Intent의 모양을 사용자 정의할 수 있습니다 그러나 이 Intent는 그 자체로 훌륭한 단축어로 작용합니다 가장 이상적인 것은 누군가 먼저 단축어를 작성하지 않고도 제 Intent를 실행할 수 있는 것입니다 앱 단축어를 만들어 제가 사용자를 대신하여 이 설정 단계를 수행할 수 있으므로 앱이 설치되는 즉시 사용자가 제 Intent를 사용할 수 있습니다 이제 Intent를 작성했으니 그에 대한 앱 단축어를 만들겠습니다 Intent와 비슷하게 앱 단축어는 AppShortcutsProvider 프로토콜을 구현하여 Swift 코드로 정의됩니다 프로토콜을 구현하기 위해 제가 사용자를 위해 설정할 모든 앱 단축어를 반환하는 단일 게터를 만들어 보겠습니다 참고로 앱은 최대 10개의 앱 단축어를 가질 수 있습니다 하지만 대부분의 앱은 몇 개만 필요합니다 제 StartMeditationIntent를 위해 단일 AppShortcut을 만들죠 시작하기 위해 제 Intent를 예로 들어 보겠습니다 제 Intent의 이니셜라이저가 매개 변수를 사용하는 경우 여기에 값을 지정할 수 있습니다 둘째, Siri에서 내 앱 단축어를 호출하는 일련의 음성 구문을 만들겠습니다 보시다시피 문자열에 응용 프로그램 이름을 직접 쓰는 대신 특별한 .applicationName 토큰을 사용했습니다 이를 통해 Siri는 제 앱의 기본 이름뿐 아니라 제가 구성한 모든 앱 이름 동의어도 삽입할 수 있습니다 사용자가 명상을 시작하려고 다른 구문을 말할 수도 있으니 여기에 대체 구문을 몇 개 더 제공하겠습니다 앱이 현지화된 경우 이러한 구문도 현지화해야 합니다
좋습니다 이제 누군가 명상하고 싶다면 Siri에게 ‘명상을 시작해’라고 말하기만 하면 Siri가 StartMeditationIntent를 호출하고 제가 반환한 대화 상자를 말할 겁니다 또 누군가 Spotlight에서 제 앱을 검색하면 제가 코드에 나열한 첫 번째 앱 단축어를 볼 수 있습니다 사용자가 결과를 누르면 응용 프로그램을 시작하지 않고도 단축어가 즉시 실행됩니다 중요한 참고 사항이 있죠 여러분의 Intent가 앱 실행을 트리거하면 Spotlight에 표시되지 않습니다 자, 아주 적은 양의 코드로 사용자가 제 앱으로 훨씬 더 쉽게 명상하도록 만들었습니다 하지만 지금 Siri는 제 Intent를 실행할 때마다 기본값 뷰만 보여줍니다 이것도 괜찮지만 저는 사용자가 제 앱 단축어를 실행할 때 더 많은 정보를 보여주고 싶습니다 그러려면 제 Intent가 실행될 때마다 Siri가 표시할 수 있는 사용자 정의 뷰를 구현해야 합니다 앱 Intent 프레임워크의 뷰는 SwiftUI를 사용하여 구축되며 위젯과 동일한 뷰 기술을 활용합니다 따라서 개발자는 사용자 정의 뷰를 위해 별도의 UI 확장 프로그램을 작성할 필요가 없습니다 대신, Intent를 실행할 때 뷰를 간단하게 반환할 수 있습니다 이 경우 뷰에 나타나는 특정 제약 조건에 대해 고려하는 게 중요합니다 위젯과 마찬가지로 사용자 정의 앱 Intent 뷰에는 대화형 또는 애니메이션이 포함될 수 없습니다 UI를 설계할 때 이 점을 반드시 고려하세요 앱 Intent는 값 확인 Intent 확인, Intent 완료 후라는 세 가지 단계에서 사용자 정의 UI를 표시할 수 있습니다 이 앱의 경우 제 Intent를 실행한 후 사용자 정의 뷰를 반환합니다 다른 프롬프트를 사용하는 경우 이러한 단계에서 사용자 정의 UI를 통합하는 방법에 대해서도 생각해 보세요 앞서 언급했듯이 사용자 정의 UI를 표시하는 것은 쉽습니다 단지 여러분의 Intent에서 뷰를 반환하기만 하면 되죠 좋아요, 이제 코드에 뛰어들 시간입니다 사용자 정의 뷰를 추가하긴 쉽죠 앞서 언급했듯이 뷰를 대화 상자와 함께 반환하겠습니다 앱 Intent 프레임워크는 Siri 스니펫 안에 제 뷰를 나타낼 겁니다 여러분의 뷰는 스니펫 제목이나 확인 버튼과 같은 다른 Siri 뷰와 함께 표시됩니다 따라서 스니펫 디자인이 Siri 내부에서 편안하게 느껴지면 좋겠죠 다음은 매개 변수를 포함하도록 앱 단축어를 확장하는 방법을 알아보겠습니다 이전 구현에서는 기본값 명상 세션을 시작하도록 선택했죠 하지만 제 앱에는 좋은 세션 유형이 많이 있고 사용자는 그들이 염두에 둔 특정 세션을 시작하고 싶을 겁니다 사용자가 제 Intent를 실행할 때 시작하고 싶은 세션을 지정할 수 있다면 이상적이겠죠 이러한 사용 사례를 지원하려면 사용자가 실행하려는 세션을 캡처하는 매개 변수를 추가하여 Intent를 확장해야 합니다 매개 변수를 추가하려면 먼저 매개 변수의 유형을 정의해야 합니다 세션에 대한 관련 정보가 있는 MeditationSession 구조체를 만듭니다 이름을 포함하고 UUID일 수 있는 식별자 필드를 지정합니다 이 구조체를 제 Intent를 위한 매개 변수로 사용하려면 AppEntity 프로토콜도 구현해야 합니다 AppEntity 프로토콜을 구현하면 앱 Intent 프레임워크에 제 유형을 알려 주고 엔티티가 표시되는 방법과 같은 추가 정보를 지정할 수 있게 해줍니다 엔티티 프로토콜에서는 제가 이미 제공한 식별자가 제 유형에 있어야 합니다 정수나 문자열과 같은 다른 유형도 사용할 수 있죠 또한 엔티티를 표시하는 방법에 대한 정보도 제공해야 합니다 단축어 앱과 내 엔티티가 표시되는 다른 위치에서 사용됩니다 마지막으로 기본값 쿼리를 전송해야 합니다 제 쿼리인 MeditationSessionQuery를 호출하고 다음으로 구현하겠습니다 제 엔티티와 함께 작업하려면 앱 Intent 프레임워크가 식별자를 기반으로 내 엔티티를 조회할 수 있어야 합니다 이를 가능하게 하려면 EntityQuery 프로토콜은 한 가지 요구 사항만 정의하죠 식별자를 가져와서 일치하는 엔티티를 반환하는 함수입니다 SessionManager에서 세션을 찾아 이 함수를 구현합니다 그런 다음 StartMeditationIntent를 업데이트하여 매개 변수를 추가합니다 매개 변수는 간단합니다 제 구조체에서 일반적인 속성일 뿐이죠 그러나 앱 Intent에 제 매개 변수를 알려주려면 @Parameter 속성 래퍼도 추가해야 합니다 이 속성 래퍼로 앱 Intent는 세션 속성이 제 Intent의 일부라는 걸 알 수 있습니다 표시 이름과 같은 매개 변수 속성 래퍼에서 추가 메타데이터를 지정할 수도 있습니다 이제 매개 변수를 제 Intent에 추가했으므로 사용자에게 어떤 세션을 실행할지 물어봐야 합니다 앱 Intent 프레임워크는 제 Intent에 맞는 매개 변수를 수집하기 위해 후속 질문을 하는 데 강력한 지원을 제공합니다 이런 프롬프트는 제 Intent가 실행되는 모든 곳에 표시됩니다 Siri에서 실행되면 Siri가 질문을 말하고 사용자에게 답을 말하도록 요청합니다 Spotlight와 단축어 앱에서는 사용자에게 터치식 UI와 동일한 프롬프트가 제시됩니다 앱 Intent는 세 가지 유형의 값 프롬프트를 지원합니다 명확화는 고정 목록에서 선택하도록 요청합니다 명확화는 Intent의 매개 변수에 대한 고정 옵션 집합이 작은 경우 사용자에게 제시하기에 유용합니다 값 프롬프트를 사용하면 사용자에게 개방형 값을 요청할 수 있죠 문자열이나 정수와 같은 모든 값을 사용할 수 있는 유형에 적합합니다 마지막으로 확인은 사용자에게 특정 값을 확인하도록 요청하며 사용자의 Intent를 이해하고 있는지 다시 확인하려는 경우 도움이 될 수 있죠 값을 묻는 프롬프트는 Intent를 보다 유연하게 만들고 사용자로부터 더 많은 정보를 수집할 수 있는 좋은 방법입니다 그러나 대화 속도가 느려지고 너무 자주 사용하면 사용자가 답답할 수 있죠 멋진 Intent를 디자인하는 방법에 대한 자세한 내용은 린의 세션인 “앱 단축어 디자인”을 확인해 보세요 자, 이제 세션 매개 변수를 StartMeditationIntent에 추가했으니 로직을 수행 메서드에 추가하여 이 값을 입력하라는 프롬프트를 표시해 보죠 제 앱에는 사용자가 실행할 수 있는 세션 수가 정해져 있습니다 세션이 아직 지정되지 않은 경우 내 SessionManager에서 목록을 가져온 다음 명확화를 사용자에게 제시합니다 각 세션에 대한 표시 표현을 사용하여 앱 Intent는 세션을 목록 항목으로 포맷하고 사용자에게 표시합니다 사용자가 하나를 선택하면 선택한 항목이 제게 반환됩니다 선택된 세션을 제 MeditationService로 전달하면 세션이 시작됩니다 이제 사용자에게 Intent가 시작됐음을 알리는 대화 상자를 반환할 수 있습니다 사용자가 세션을 제공했으므로 세션 이름을 대화 상자에 넣어 우리가 요청을 이해했다고 사용자에게 알리는 게 좋습니다 좋아요, 이제 제 사용자가 ‘명상을 시작해’라고 말하면 제 앱은 사용자가 실행하려는 특정 세션을 묻는 메시지를 표시할 수 있습니다 그러나 앞서 언급했듯이 사용자는 빠르고 적절한 Siri 상호 작용을 선호하죠 이상적으로는 사용자가 Siri에게 후속 질문이 아닌 초기 구문으로 실행하려는 세션을 알려주도록 할 수 있습니다 좋은 뉴스가 있습니다 앱 단축어는 미리 정의된 매개 변수를 사용하여 트리거 구문을 확장할 수 있죠 매개 변수화된 구문을 구현하여 제 앱은 “진정 명상을 시작해” 또는 “걷기 명상을 시작해” 같은 발화를 지원할 수 있습니다 Siri에 미리 지정할 수 있는 잘 알려진 매개 변수 값의 고정 집합이 있는 경우 매개 변수는 유용합니다 제 앱의 경우 세션 이름을 사용합니다 매개 변수는 개방형 값을 의미하지 않습니다 예를 들어, 초기 발화에서 사용자로부터 임의 문자열을 수집할 수 없습니다 따라서 제 앱은 “X를 위한 일기를 검색해” 같은 구문을 지원할 수 없었습니다 여기서 X는 무작위의 사용자 입력이 될 수 있으니까요 대신 앱이 실행 중일 때 매개 변수 값이 미리 지정됩니다 매개 변수화된 몇 가지 구문을 구현해 보겠습니다 매개 변수화된 구문을 제 앱에서 구현하려면 몇 가지를 변경해야 합니다 우선 SessionEntity에 대한 쿼리를 업데이트하여 suggestedResults() 메서드를 구현하고 매개 변수화된 단축어에 대한 엔티티 목록을 반환합니다 둘째, 사용 가능한 SessionEntities 목록이 변경되면 앱 Intent 프레임워크에 알려야 합니다 이를 통해 앱 Intent 프레임워크는 Siri에서 사용할 새 단축어 구문을 만들 수 있습니다 세션 목록이 변경될 때마다 앱의 모델 계층을 업데이트하고 앱 Intent 프레임워크에 알려 이를 수행합니다 마지막으로 StartMeditationIntent에 있는 세션 매개 변수를 참조하는 몇 가지 새 구문을 앱 단축어에 추가하겠습니다 우선 suggestedEntities 함수를 구현하여 MeditationSessionQuery를 업데이트합니다 앱 Intent 프레임워크는 이 함수에서 반환된 세션을 사용하여 매개 변수화된 단축어를 만듭니다 이 방법은 옵션이지만 이 방법을 구현하지 않으면 매개 변수화된 단축어를 전혀 얻지 못한다는 걸 이해하는 게 중요합니다 세션 목록이 변경될 때마다 앱의 모델 계층을 업데이트하여 앱 Intent 프레임워크에 알려야 합니다 제 앱에서는 백그라운드의 서버에서 가져온 새 세션 유형을 게시하는 경우가 거의 없습니다 저는 새로운 세션을 받을 때마다 SessionModel을 업데이트하여 updateAppShortcutParameters()를 호출합니다 이 메서드는 앱 Intent 프레임워크가 제공하므로 여러분이 직접 구현할 필요가 없습니다 호출되면 앱 Intent는 엔티티의 쿼리를 호출하여 단축어 구문에 대한 매개 변수 목록을 수집하죠 마지막으로 제 Intent에서 세션 키 경로를 포함하는 새 구문을 추가합니다 앱 Intent 프레임워크는 이 구문을 내 쿼리에서 반환된 모든 세션과 결합하죠 각 값에 사용되는 텍스트는 SessionEntity의 표시 표현에 있는 제목 속성에서 가져옵니다 이전과 마찬가지로 사용자가 제 앱 단축어를 구문으로 만들 수 있는 몇 가지 방법을 포함할 겁니다 그러면 사용자가 여러분이 선호하는 구문을 기억하지 못하더라도 원활한 환경을 보장할 수 있죠 자, 이제 모든 기능을 갖춘 훌륭한 앱 단축어가 있어요 사용자들이 어서 사용해 봤으면 좋겠네요 하지만 그게 가능하려면 제 새로운 단축어를 사용자가 발견하도록 도와야 합니다 첫 번째로 말씀드릴 내용은 멋진 구문을 고르는 겁니다 짧고 기억에 남는 구문이 앱 단축어에 좋습니다 사용자의 휴대폰에는 앱 단축어를 지원하는 앱이 굉장히 많을 겁니다 실제로 사용자는 자신의 단축어 구문을 정확히 기억하는 데 어려움을 겪을 수 있죠 그러니 가능하면 여러분의 구문을 간결하고 명료하게 유지하세요 같은 선상에서 여러분의 앱 이름이 명사나 동사로 사용될 수 있다면 구문에서 그대로 사용하는 것을 고려해 보세요 제 앱에서는 명상을 명사처럼 사용해서 구문이 짧고 기억에도 남습니다 마지막으로, 앱 이름 동의어는 사용자에게 큰 도움을 줄 수 있죠 사용자가 앱의 표시 이름 대신 다른 이름으로 호출하는 경우 앱 이름 동의어를 추가하는 것이 좋습니다 iOS 11은 앱 이름 동의어에 대한 지원을 추가했습니다 아직 작성하지 않았다면 지금이 작성하기에 좋은 기회일 수 있죠 다음으로는 Siri 팁과 단축어 링크에 대해 이야기해 보겠습니다 앱 단축어는 사용자 설정이 필요 없기 때문에 사용자가 여러분의 앱 단축어를 찾아서 사용하려면 검색 가능성이 매우 중요합니다 앱 단축어를 사용하면 사용자가 단축어를 추가하기 위해 ‘Siri에 추가’ 버튼을 사용할 필요가 없죠 이미 추가됐으니까요! 하지만 우리는 ‘Siri에 추가’ 버튼이 제공하는 검색 가능성의 이점을 잃고 싶지는 않습니다 이를 염두에 두고 새로운 Siri 팁 뷰를 만들었죠 이 뷰는 이전에 ‘Siri에 추가’ 버튼을 사용한 적이 있는 모든 곳에서 잘 작동합니다 팁 뷰는 SwiftUI와 UIKit 모두에서 사용할 수 있습니다 또한 다양한 스타일을 제공하므로 어떤 응용 프로그램에서나 팁이 좋아 보입니다 Siri 팁은 화면의 내용과 관련이 있을 때 상황에 맞게 배치하는 게 가장 좋습니다 사용자가 앱에서 방금 주문을 한 경우 주문 상태를 제공하는 단축어 팁을 표시하는 것이 좋습니다 사용자가 가까운 미래에 여러분의 앱 단축어에 참여할 것 같다면 Siri 팁은 신중하게 배치해야 합니다 Siri 팁은 무시도 지원합니다 뷰에는 무시 버튼이 포함되어 있어 누르면 코드에서 사용자 정의 종료가 트리거됩니다 레이아웃에서 뷰를 제거하고 적절하다고 느낄 때까지 뷰를 다시 표시하지 않기를 원할 수도 있습니다 마지막으로 앱에서 단축어 목록으로 시작하는 새로운 ShortcutsLink도 포함되어 있습니다 이 새로운 요소는 앱에 앱 단축어가 많고 사용자가 모든 앱 단축어를 탐색할 수 있도록 유도하려는 경우에 유용합니다 앱 단축어의 장점은 앱이 설치되는 즉시 사용할 수 있다는 것입니다 앱을 처음 시작하기 전에도 사용자는 Spotlight와 Siri 단축어 앱에서 단축어를 보고 실행할 수 있습니다 앱 단축어를 구축할 때 이 점을 고려해야 할 수도 있습니다 예를 들어, 앱에 로그인 흐름이 필요한 경우 사용자가 Intent를 실행하기 전에 로그인하지 않았을 수 있습니다 Intent는 사용자가 로그인해야 함을 설명하는 오류 메시지와 함께 정상적으로 실패하겠죠 둘째, 앱 단축어에 대한 매개 변수화된 구문은 앱이 시작되고 새로운 매개 변수 값이 있음을 앱 Intent 프레임워크에 알릴 때까지 사용할 수 없습니다 매개 변수화되지 않은 구문이 앱 단축어에 포함되어 있지 않으면 처음 앱을 시작할 때까지 사용자는 앱 단축어를 전혀 볼 수 없습니다 이 문제를 방지하려면 매개 변수화되지 않은 구문 몇 개의 추가를 고려할 수 있죠 또한 Siri는 “여기서 무엇을 할 수 있나요?” “명상으로 무엇을 할 수 있나요?” 같은 구문 지원을 추가했습니다 Siri는 여러분을 대신하여 자동으로 앱 단축어 구문을 수집하고 추천하며 사용자에게 제시할 겁니다 이 기능이 작동하기 위해 앱에서 추가 작업을 수행할 필요는 없습니다 마지막으로 Siri와 단축어 앱 모두에서 앱 단축어가 표시되는 순서는 여러분이 소스 코드에 AppShortcuts를 나열하는 순서에 따라 결정됩니다 가장 좋고 유용한 앱 단축어를 가장 먼저 배치하여 가장 많은 관심을 받게 하는 것이 좋겠죠 마찬가지로, 구문 배열에 나열된 첫 번째 구문은 해당 앱 단축어의 기본 구문으로 간주됩니다 기본 구문은 단축어 타일의 레이블로 사용되며 사용자가 Siri에게 앱에 대한 도움을 요청할 때 표시됩니다 좋습니다, 오늘은 앱 Intent 프레임워크와 앱 단축어를 많이 다뤘죠 두 가지 중요한 생각을 기억하시기 바랍니다 첫째, 앱 단축어를 사용하면 사용자가 시스템 어디에서나 앱을 쉽게 사용할 수 있으므로 이 매우 가벼운 모델에 적합한 최상의 앱 사용 사례를 생각해 보세요 둘째, 앱 단축어를 구현하더라도 여러분이 알려 주지 않으면 사용자는 알 수 없습니다! 앱 단축어를 검색할 수 있게 만드는 방법을 고민해 보세요 앱에서 Siri 팁을 표시할 수 있는 장소뿐 아니라 웹 사이트나 상점의 간판 같은 제품 외 위치도 고려하세요 여러분이 새로운 앱 Intent 프레임워크로 만들 훌륭한 앱 단축어를 빨리 보고 싶습니다 디자인뿐만 아니라 앱 Intent 프레임워크에 대해서도 자세히 알아보려면 이번 주에 있을 다른 강연을 꼭 확인해 보세요 감사합니다 즐거운 WWDC 되세요 ♪
-
-
3:43 - Implement an AppIntent
// StartMeditationIntent creates a meditation session. import AppIntents struct StartMeditationIntent: AppIntent { static let title: LocalizedStringResource = "Start Meditation Session" func perform() async throws -> some IntentResult & ProvidesDialog { await MeditationService.startDefaultSession() return .result(dialog: "Okay, starting a meditation session.") } }
-
5:31 - Create an AppShortcutsProvider
// An AppShortcut turns an Intent into a full fledged shortcut // AppShortcuts are returned from a struct that implements the AppShortcuts // protocol import AppIntents struct MeditationShortcuts: AppShortcutsProvider { static var appShortcuts: [AppShortcut] { AppShortcut( intent: StartMeditationIntent(), phrases: ["Start a \(.applicationName)"] ) } }
-
6:35 - Provide multiple phrases
// An AppShortcut turns an Intent into a full fledged shortcut // AppShortcuts are returned from a struct that implements the AppShortcuts // protocol import AppIntents struct MeditationShortcuts: AppShortcutsProvider { static var appShortcuts: [AppShortcut] { AppShortcut( intent: StartMeditationIntent(), phrases: [ "Start a \(.applicationName)", "Begin \(.applicationName)", "Meditate with \(.applicationName)", "Start a session with \(.applicationName)" ] ) } }
-
8:54 - Provide a dialog and snippet view
// Custom views give your intent more personality // and can convey more information func perform() async throws -> some ProvidesDialog & ShowsSnippetView { await MeditationService.startDefaultSession() return .result( dialog: "Okay, starting a meditation session.", view: MeditationSnippetView() ) }
-
10:09 - Implement an AppEntity
// An entity is a type that can be used as a parameter // for an AppIntent. import AppIntents struct MeditationSession: AppEntity { let id: UUID let name: LocalizedStringResource static var typeDisplayName: LocalizedStringResource = "Meditation Session" var displayRepresentation: AppIntents.DisplayRepresentation { DisplayRepresentation(title: name) } static var defaultQuery = MeditationSessionQuery() }
-
10:55 - Query for entities
// Queries allow the App Intents framework to // look up your entities by their identifier struct MeditationSessionQuery: EntityQuery { func entities(for identifiers: [UUID]) async throws -> [MeditationSession] { return identifiers.compactMap { SessionManager.session(for: $0) } } }
-
11:16 - Define a parameter
// Adding a parameter to an intent allows you to prompt the user // to provide a value for the parameter struct StartMeditationIntent: AppIntent { @Parameter(title: "Session Type") var sessionType: SessionType? // ... }
-
13:15 - Prompt for values
// Prompting for values can be done by calling methods // on the property's wrapper type. func perform() async throws -> some ProvidesDialog { let sessionToRun = self.session ?? try await $session.requestDisambiguation( among: SessionManager.allSessions, dialog: IntentDialog("What session would you like?") ) } await MeditationService.start(session: sessionToRun) return .result( dialog: "Okay, starting a \(sessionToRun.name) meditation session." ) }
-
16:11 - Implement suggestedEntities()
// Queries can provide suggested values for your Entity // that serve as parameters for App Shortcuts struct MeditationSessionQuery: EntityQuery { func entities(for identifiers: [UUID]) async throws -> [MeditationSession] { return identifiers.compactMap { SessionManager.session(for: $0) } } func suggestedEntities() async throws -> [MeditationSession] { return SessionManager.allSessions } }
-
16:34 - Update App Shortcut parameters
// Your app must notify App Intents when your values change // This is typically best done in your app’s model layer class SessionModel { @Published var sessions: [MeditationSession] = [] private var cancellable: AnyCancellable? init() { self.cancellable = $sessions.sink { _ in MeditationShortcuts.updateAppShortcutParameters() } } // ... }
-
17:09 - Add parameterized phrases
// Phrases can also contain a single parameter reference import AppIntents struct MeditationShortcuts: AppShortcutsProvider { static var appShortcuts: [AppShortcut] { AppShortcut( intent: StartMeditationIntent(), phrases: [ "Start a \(.applicationName)", "Begin \(.applicationName)", "Meditate with \(.applicationName)", "Start a \(\.$session) session with \(.applicationName)", "Begin a \(\.$session) session with \(.applicationName)", "Meditate on \(\.$session) with \(.applicationName)" ] ) } }
-
-
찾고 계신 콘텐츠가 있나요? 위에 주제를 입력하고 원하는 내용을 바로 검색해 보세요.
쿼리를 제출하는 중에 오류가 발생했습니다. 인터넷 연결을 확인하고 다시 시도해 주세요.