SiriKit은 iOS 10에서 도입되었으며, 다양한 서비스 도메인(운동, 승차 예약 및 전화 걸기 포함)을 제공합니다. SiriKit 개념 및 앱에서 SiriKit을 구현하는 방법은 SiriKit 섹션을 참조하세요.

iOS 11의 SiriKit은 다음과 같은 신규 및 업데이트된 의도 도메인을 추가합니다.
- 목록 및 메모 – 새로 만들기! 작업 및 메모를 처리하는 앱에 대한 API를 제공합니다.
- Visual Codes – New! Siri는 QR 코드를 표시하여 연락처 정보를 공유하거나 결제 거래에 참여할 수 있습니다.
- 결제 – 결제 상호 작용에 대한 검색 및 전송 의도가 추가되었습니다.
- 승차 예약 – 취소 라이드 및 피드백 의도가 추가되었습니다.
기타 새로운 기능은 다음과 같습니다.
- 대체 앱 이름 – 고객이 Siri에게 대체 이름/발음을 제공하여 앱을 대상으로 지정하도록 지시하는 데 도움이 되는 별칭을 제공합니다.
- 운동 시작 – 백그라운드에서 운동을 시작할 수 있는 기능을 제공합니다.
이러한 기능 중 일부는 아래에 설명되어 있습니다. 다른 항목에 대한 자세한 내용은 Apple의 SiriKit 설명서를 참조 하세요.
목록 및 메모
새 목록 및 메모 도메인은 Siri 음성 요청을 통해 작업 및 노트를 처리하는 앱용 API를 제공합니다.
태스크
- 제목과 완료 상태를 갖습니다.
- 필요에 따라 마감일과 위치를 포함합니다.
참고
- 제목과 콘텐츠 필드가 있습니다.
작업과 메모는 모두 그룹으로 구성할 수 있습니다.
SiriKit 요청을 처리하는 방법
다음 단계에 따라 SiriKit 요청을 처리합니다.
- 해결 – 매개 변수의 유효성을 검사하고 사용자에게 추가 정보를 요청합니다(필요한 경우).
- 확인 – 요청을 처리할 수 있는 최종 유효성 검사 및 확인
- 핸들 – 작업(데이터 업데이트 또는 네트워크 작업 수행)을 수행합니다.
처음 두 단계는 선택 사항이며(권장됨) 마지막 단계가 필요합니다. SiriKit 섹션에는 자세한 지침이 있습니다.
메서드 확인 및 확인
이러한 선택적 메서드를 사용하면 코드에서 유효성 검사를 수행하거나, 기본값을 선택하거나, 사용자에게 추가 정보를 요청할 수 있습니다.
예를 들어 인터페이스의 IINCreateTaskListIntent 경우 필수 메서드는 .입니다 HandleCreateTaskList. Siri 상호 작용에 대한 더 많은 제어를 제공하는 네 가지 선택적 메서드가 있습니다.
ResolveTitle– 타이틀의 유효성을 검사하거나, 기본 제목(해당하는 경우)을 설정하거나, 데이터가 필요하지 않다는 신호를 표시합니다.ResolveTaskTitles– 사용자가 말한 작업 목록의 유효성을 검사합니다.ResolveGroupName– 그룹 이름의 유효성을 검사하거나, 기본 그룹을 선택하거나, 데이터가 필요하지 않다는 신호를 표시합니다.ConfirmCreateTaskList– 코드가 요청된 작업을 수행할 수 있지만 수행하지 않는지 확인합니다(메서드만Handle*데이터를 수정해야 합니다).
의도 처리
목록 및 메모 도메인에는 6개의 의도가 있으며, 3개는 작업용, 3개는 메모에 있습니다. 이러한 의도를 처리하기 위해 구현해야 하는 메서드는 다음과 같습니다.
- 작업의 경우:
HandleAddTasksHandleCreateTaskListHandleSetTaskAttribute
- 참고:
HandleCreateNoteHandleAppendToNoteHandleSearchForNotebookItems
각 메서드에는 특정 의도 유형이 전달되며, 여기에는 Siri가 사용자의 요청에서 구문 분석한 모든 정보(및 Confirm* 메서드에서 Resolve* 업데이트될 수 있음)가 포함됩니다.
앱은 제공된 데이터를 구문 분석한 다음, 데이터를 저장하거나 처리하기 위해 몇 가지 작업을 수행하고 Siri가 말하고 사용자에게 표시하는 결과를 반환해야 합니다.
응답 코드
필수 Handle* 및 선택적 Confirm* 메서드는 완료 처리기에 전달하는 개체의 값을 설정하여 응답 코드를 나타냅니다. 응답은 INCreateTaskListIntentResponseCode 열거형에서 제공됩니다.
Ready– 확인 단계 중에 반환됩니다(예: 메서드에서Confirm*반환되지만 메서드에서는Handle*반환되지 않음).InProgress– 장기 실행 작업(예: 네트워크/서버 작업)에 사용됩니다.Success– 성공한 작업의 세부 정보로 응답합니다(메서드에서Handle*만).Failure– 오류가 발생하여 작업을 완료할 수 없음을 의미합니다.RequiringAppLaunch– 의도에 따라 처리할 수 없지만 앱에서 작업을 수행할 수 있습니다.Unspecified– 사용하지 마세요. 오류 메시지가 사용자에게 표시됩니다.
Apple의 SiriKit 목록 및 노트 설명서에서 이러한 방법 및 응답에 대해 자세히 알아보세요.
목록 및 메모 구현
먼저 SiriKit 지원을 추가하려면 iOS 앱에 대해 다음 단계를 수행합니다.
- Entitlements.plist에서 SiriKit를 선택합니다.
- 개인 정보 – Siri 사용 설명 키를 Info.plist에 추가하고 고객을 위한 메시지를 추가합니다.
- 앱에서
INPreferences.RequestSiriAuthorization메서드를 호출하여 사용자에게 Siri 상호 작용을 허용하라는 메시지를 표시합니다. - 개발자 포털의 앱 ID에 SiriKit를 추가하고 새 자격을 포함하도록 프로비저닝 프로필을 다시 만듭니다.
그런 다음, Siri 요청을 처리하는 새 확장 프로젝트를 앱에 추가합니다.
- 솔루션을 마우스 오른쪽 단추로 클릭하고 새 프로젝트 추가>...를 선택합니다.
- iOS > 확장 의도 확장 > 템플릿을 선택합니다.
- 의도 및 IntentUI라는 두 개의 새 프로젝트가 추가됩니다. UI 사용자 지정은 선택 사항이므로 샘플에는 의도 프로젝트에 코드만 포함됩니다.
확장 프로젝트는 모든 SiriKit 요청이 처리되는 위치입니다. 별도의 확장으로 주 앱과 통신할 방법이 자동으로 없습니다. 일반적으로 앱 그룹을 사용하여 공유 파일 스토리지를 구현하여 해결됩니다.
IntentHandler 구성
클래스는 IntentHandler Siri 요청에 대한 진입점입니다. 모든 의도는 요청을 처리할 GetHandler 수 있는 개체를 반환하는 메서드에 전달됩니다.
아래 코드는 간단한 구현을 보여줍니다.
[Register("IntentHandler")]
public partial class IntentHandler : INExtension, IINNotebookDomainHandling
{
protected IntentHandler(IntPtr handle) : base(handle)
{}
public override NSObject GetHandler(INIntent intent)
{
// This is the default implementation. If you want different objects to handle different intents,
// you can override this and return the handler you want for that particular intent.
return this;
}
// add intent handlers here!
}
클래스는 상속 INExtension되어야 하며 샘플이 목록 및 노트 의도를 처리하므로 구현합니다 IINNotebookDomainHandling.
참고 항목
- .NET에는 iOS SDK에서 프로토콜을 바인딩할 때 Xamarin이 준수하는 대
I문자로 접두사를 지정하는 인터페이스에 대한 규칙이 있습니다. - Xamarin은 iOS의 형식 이름도 유지하며 Apple은 형식 이름의 처음 두 문자를 사용하여 형식이 속한 프레임워크를 반영합니다.
- 프레임워크의
Intents경우 형식 앞에 접두사IN*(예:INExtension)가 있지만 인터페이스는 아닙니다 . - 또한 프로토콜(C#의 인터페이스가 됨)은 두
I개의 s(예: )로IINAddTasksIntentHandling끝납니다.
의도 처리
각 의도(작업 추가, 작업 특성 설정 등)는 아래 표시된 것과 유사한 단일 메서드로 구현됩니다. 메서드는 세 가지 주요 함수를 수행해야 합니다.
- 의도 처리 – Siri에서 구문 분석한 데이터는 의도 유형과
intent관련된 개체에서 사용할 수 있습니다. 앱에서 선택적Resolve*메서드를 사용하여 해당 데이터의 유효성을 검사했을 수 있습니다. - 데이터 저장소 유효성 검사 및 업데이트 – 기본 iOS 앱이 액세스할 수 있도록 앱 그룹을 사용하거나 네트워크 요청을 통해 파일 시스템에 데이터를 저장합니다.
- 응답 제공 – 처리기를
completion사용하여 Siri에 응답을 다시 보내 사용자에게 읽기/표시합니다.
public void HandleCreateTaskList(INCreateTaskListIntent intent, Action<INCreateTaskListIntentResponse> completion)
{
var list = TaskList.FromIntent(intent);
// TODO: have to create the list and tasks... in your app data store
var response = new INCreateTaskListIntentResponse(INCreateTaskListIntentResponseCode.Success, null)
{
CreatedTaskList = list
};
completion(response);
}
null 응답에 두 번째 매개 변수로 전달됩니다. 이는 사용자 활동 매개 변수이며 제공되지 않으면 기본값이 사용됩니다.
iOS 앱이 Info.plist의 키를 통해 NSUserActivityTypes 지원하는 한 사용자 지정 활동 유형을 설정할 수 있습니다. 그런 다음 앱이 열릴 때 이 사례를 처리하고 특정 작업(예: 관련 보기 컨트롤러에 열고 Siri 작업에서 데이터 로드)을 수행할 수 있습니다.
이 예제에서는 결과를 하드 코딩 Success 하지만 실제 시나리오에서는 적절한 오류 보고를 추가해야 합니다.
테스트 구
다음 테스트 구는 샘플 앱에서 작동해야 합니다.
- "TasksNotes에서 사과, 바나나, 배로 식료품 목록 만들기"
- "TasksNotes에서 작업 WWDC 추가"
- "TasksNotes의 학습 목록에 작업 WWDC 추가"
- "TasksNotes에서 WWDC 참석을 완료로 표시"
- "TasksNotes에서 집에 도착하면 아이폰을 구입하라는 알림"
- "TasksNotes에서 완료된 것으로 iPhone 구입 표시"
- "TasksNotes에서 오전 8시에 집을 떠나라는 알림"

참고 항목
iOS 11 시뮬레이터는 이전 버전과 달리 Siri로 테스트를 지원합니다.
실제 디바이스에서 테스트하는 경우 SiriKit 지원을 위해 앱 ID 및 프로비저닝 프로필을 구성하는 것을 잊지 마세요.
대체 이름
이 새로운 iOS 11 기능은 사용자가 Siri를 사용하여 올바르게 트리거할 수 있도록 앱의 대체 이름을 구성할 수 있음을 의미합니다. iOS 앱 프로젝트의 Info.plist 파일에 다음 키를 추가합니다.

대체 앱 이름을 설정하면 샘플 앱(실제로 TasksNotes라는 이름 )에도 다음 구가 작동합니다.
- "MonkeyNotes에서 사과, 바나나, 배로 식료품 목록 만들기"
- "MonkeyTodo에서 작업 WWDC 추가"
문제 해결
샘플을 실행하거나 사용자 고유의 애플리케이션에 SiriKit을 추가하는 동안 발생할 수 있는 몇 가지 오류:
NSInternalInconsistencyException
Objective-C 예외가 throw되었습니다. 이름: NSInternalInconsistencyException 이유: INPreferences 클래스 <사용: 앱에서 0x60400082ff00> 자격 com.apple.developer.siri가 필요합니다. Xcode 프로젝트에서 Siri 기능을 사용하도록 설정했나요?
Entitlements.plist에서 SiriKit이 선택됩니다.
Entitlements.plist는 프로젝트 옵션 > 빌드 > iOS 번들 서명에서 구성됩니다.
(디바이스 배포용) 앱 ID에 SiriKit이 활성화되고 프로비저닝 프로필이 다운로드되었습니다.
