Intents Extension은 타사 앱이 Siri 음성 명령을 처리하고 SiriKit을 통해 시스템 서비스와 상호 작용할 수 있도록 하는 iOS 확장 기능입니다. 앱은 Intents.intentdefinition에서 자체 인텐트를 정의하고, INIntentHandler를 기반으로 핸들러를 구현하며, 음성 구문 인식을 위해 이를 등록합니다. Apple Developer Documentation(2025)에 따르면 SiriKit은 메시징, 결제, 운동, 예약 등 20개 이상의 인텐트 도메인을 지원하며, iOS 14부터 IntentsExtension을 통해 사용자 정의 인텐트 지원이 추가되었습니다.
핵심 요점
Intents Extension은 Siri, Shortcuts 및 기타 시스템 서비스가 표준화된 INIntentHandler 프로토콜을 통해 앱 기능을 호출할 수 있도록 하는 앱 확장 프로그램입니다. 사용자가 “Hey Siri, Messenger X에서 메시지 보내줘”라고 말하면 Siri는 해당 확장 프로그램을 활성화하고 요청 매개변수를 전달하며 음성 출력 결과를 받습니다.
다른 유형의 확장 프로그램과 달리 Intents Extension은 보이는 인터페이스 없이 백그라운드에서 실행됩니다. Siri는 음성 또는 텍스트 카드로 응답을 표시합니다. 확장 프로그램은 선택적으로 INUIHostedViewProviding을 통해 사용자 정의 UI를 제공할 수 있으며, 확인을 위해 명령 실행 전 Siri 내에 표시됩니다.
확장 프로그램은 기기 화면에 접근할 수 없으며 자체적으로 작업을 시작할 수 없습니다. Siri 또는 Shortcuts의 요청에만 응답합니다. 이는 보안을 보장합니다. 사용자는 앱이 음성 명령을 통해 수행하는 작업을 항상 제어할 수 있습니다.
SiriKit은 iOS 10에서 도입된 Siri 통합을 위한 Apple의 프레임워크입니다. 이 프레임워크는 Siri가 처리할 수 있는 작업 범주(메시지, 전화, 결제, 목록, 알림, 사진, 운동, 예약 등)인 도메인을 정의합니다. 각 도메인에는 고정된 인텐트 및 응답 세트가 있습니다.
INSendMessageIntent — 메시지 전송. INStartWorkoutIntent — 운동 시작. INSearchForPhotosIntent — 사진 검색. INRequestRideIntent — 차량 예약. 각 도메인은 Siri가 음성 요청에서 추출하는 필수 및 선택적 매개변수를 정의합니다. Apple에 따르면 표준 도메인에는 intentdefinition 파일이 필요하지 않으며, 해당 핸들러를 구현하는 것만으로 충분합니다.
표준 도메인에 맞지 않는 앱을 위해 iOS 14에서는 사용자 정의 인텐트를 사용할 수 있는 기능이 도입되었습니다. 앱은 Intents.intentdefinition을 통해 자체 명령 유형과 매개변수를 정의하고, Siri는 개발자가 제공한 예제를 기반으로 해당 구문을 인식하는 방법을 학습합니다.
Intents Extension은 Info.plist의 IntentsSupported 키를 통해 등록되며, 확장 프로그램이 처리하는 모든 인텐트 클래스가 나열됩니다. Siri는 음성 명령 인식 시 적절한 확장 프로그램을 선택하기 위해 이 목록을 사용합니다. 여러 확장 프로그램이 동일한 인텐트를 지원하는 경우 Siri는 사용자에게 선택하도록 요청합니다.
class MessageIntentHandler: NSObject,
INSendMessageIntentHandling {
func handle(
intent: INSendMessageIntent,
completion: @escaping
(INSendMessageIntentResponse) -> Void
) {
let response = INSendMessageIntentResponse(
code: .success, userActivity: nil)
completion(response)
}
}
INIntentHandler는 인텐트 처리의 각 단계(매개변수 해결, 확인, 실행)를 처리하는 메서드를 정의하는 프로토콜입니다. 확장 프로그램은 지원하는 각 인텐트 유형에 대해 이러한 메서드를 구현합니다.
resolve — 인텐트 매개변수의 유효성 검사 및 명확화. Siri는 각 매개변수에 대해 이 메서드를 호출합니다. 매개변수가 누락되었거나 올바르지 않은 경우 확장 프로그램은 명확화 요청을 반환하고 Siri는 사용자에게 추가 질문을 합니다. confirm — 의도 확인. 확장 프로그램은 현재 컨텍스트에서 인텐트를 실행할 수 있는지 확인합니다. handle — 작업의 실제 실행 및 결과 반환.
세 단계 분리는 음성 UX에 매우 중요합니다. 매개변수가 인식되지 않으면 Siri는 작업을 실행하지 않고 명확화를 요청합니다. 예를 들어 사용자가 “Alex에게 메시지 보내줘”라고 말했지만 연락처에 Alex가 세 명 있는 경우, 확장 프로그램은 명확화 요청과 함께 resolve를 반환하고 Siri는 “어떤 Alex요?”라고 묻습니다.
INIntentResponse는 인텐트 실행 후 확장 프로그램이 완료 핸들러에서 반환하는 객체입니다. 응답에는 결과 코드(success, failure, requiresAuthentication, inProgress)와 Siri가 음성 출력할 선택적 데이터가 포함됩니다. 코드는 Siri의 응답 방식을 결정합니다. success — 음성 확인, failure — 오류 메시지, inProgress — 장기 실행 작업 표시.
func resolve(
for intent: INSendMessageIntent,
with completion: @escaping
(INStringResolutionResult) -> Void
) {
if let text = intent.content, !text.isEmpty {
completion(.success(with: text))
} else {
completion(.needsValue())
}
}
iOS 14부터 개발자는 표준 SiriKit 도메인 외부에서 사용자 정의 인텐트를 정의할 수 있게 되었습니다. 사용자 정의 인텐트는 Intents.intentdefinition 파일(Xcode 내에서 매개변수 및 응답과 함께 새 명령 유형을 생성하는 비주얼 편집기)에 설명됩니다.
각 사용자 정의 인텐트는 INIntent(요청 정의)와 INIntentResponse(응답 정의)로 구성됩니다. INIntent에는 String, Integer, CurrencyAmount, 발견된 객체 등 데이터 유형이 있는 매개변수가 포함됩니다. INIntentResponse에는 결과 반환을 위한 속성과 응답 코드 배열이 포함됩니다. Xcode는 이 정의를 기반으로 Swift 클래스를 자동 생성합니다.
Apple은 사용자 정의 인텐트에 5개 이하의 매개변수를 포함할 것을 권장합니다. 매개변수가 너무 많으면 음성 인식이 저하되고 사용자 경험이 복잡해집니다. 각 매개변수에 대해 Siri가 올바르게 인식할 수 있도록 Assistant Dialog에 예제 구문을 제공하는 것이 좋습니다.
Intents.intentdefinition에서 각 인텐트에 대해 예제 문장(사용자가 인텐트를 활성화하기 위해 Siri에게 말할 구문)을 지정할 수 있습니다. 예: “내 앱에서 커피 주문해줘”, “내 앱에게 피자 레시피 찾아달라고 해”. Siri는 이러한 구문을 인식 훈련에 사용하고 Shortcuts 설정 시 사용자에게 제안합니다.
// Intents.intentdefinition(비주얼 편집기)
Intent: OrderCoffeeIntent
Parameters:
- beverage (String)
- size (String)
- quantity (Integer)
Response:
- orderNumber (String)
- price (CurrencyAmount)
Phrases:
- "Order coffee in MyApp"
- "Get a latte from MyApp"
INUIHostedViewProviding은 명령 실행 전에 Intents Extension이 Siri 내에 사용자 정의 인터페이스를 표시할 수 있도록 하는 프로토콜입니다. 예를 들어 차량 예약 시 확장 프로그램은 경로와 비용이 포함된 지도를 표시할 수 있으며, 사용자는 탭하여 작업을 확인합니다.
프로토콜은 메서드 configure(with:for:completion:)를 정의하며, 확장 프로그램은 인텐트를 받고 Siri에 임베드될 UIViewController를 반환합니다. 컨트롤러 크기는 제한되며 최대 높이는 200포인트입니다. 금액, 시간, 주소 등 주요 정보가 포함된 컴팩트 카드를 사용하는 것이 좋습니다.
사용자 정의 인터페이스는 선택 사항입니다. 확장 프로그램이 INUIHostedViewProviding을 구현하지 않는 경우 Siri는 인텐트 유형과 앱 이름이 포함된 표준 카드를 표시합니다. 대부분의 인텐트에서 표준 UI로 충분하며, Apple은 이해를 실제로 향상시키는 경우(예: 경로 표시 또는 결제 확인)에만 사용자 정의 인터페이스를 추가할 것을 권장합니다.
금융 또는 개인 데이터와 관련된 인텐트의 경우 인증이 필요합니다. INIntentResponse는 requiresAuthentication 코드를 지원하여 실행 전에 Siri가 Face ID 또는 Touch ID를 요청하도록 합니다. 인증 후 확장 프로그램은 별도의 handle 호출을 통해 확인을 받으며, 여기서 인증 상태가 확인됩니다.
Apple은 특히 강조합니다. Intents Extension은 자체 비밀번호나 생체 인식을 요청해서는 안 되며 시스템 인증이 사용됩니다. 앱과 확장 프로그램 간에 공유 액세스 권한이 있는 Keychain에 액세스 토큰을 저장하는 것은 장기 세션의 표준 관행입니다.
class IntentViewController: UIViewController {
func configure(
with intent: INIntent,
completion: @escaping
(UIViewController?) -> Void
) {
let cardView = ConfirmationCardView()
let hostingController =
UIHostingController(rootView: cardView)
completion(hostingController)
}
}
자주 묻는 질문
네, 확장 프로그램은 음성 입력 없이 Shortcuts 앱의 인텐트를 처리할 수 있습니다. 사용자는 제안된 작업에서 바로 가기를 만들고 확장 프로그램이 Siri의 개입 없이 실행합니다.
사용자 정의 인텐트는 iOS 14 이상에서 사용할 수 있습니다. iOS 10~13에서는 표준 SiriKit 도메인만 사용할 수 있습니다. 사용자 정의 인텐트에는 Intents.intentdefinition 및 Swift 클래스 생성이 필요합니다.
Siri는 확장 프로그램의 응답을 약 15초 기다립니다. 제한 시간을 초과하면 Siri는 작업을 완료할 수 없음을 사용자에게 알립니다. 장기 실행 작업의 경우 inProgress 응답 코드를 사용하세요.
기본 앱과 확장 프로그램 간에 액세스 그룹을 통한 공유 액세스 권한이 있는 Keychain을 사용하세요. App Group 공유 UserDefaults는 대안이지만 보안에서 Keychain보다 떨어집니다.
Intents Extension은 로직(resolve, confirm, handle)을 처리합니다. Intents UI Extension은 INUIHostedViewProviding을 통해 Siri 내에 표시할 사용자 정의 인터페이스를 제공합니다. 둘 다 함께 작동할 수 있습니다.
요약
턴키 방식의 모바일 애플리케이션을 개발해 드립니다
IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.