iOS 11의 SiriKit 업데이트
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개는 메모에 있습니다. 이러한 의도를 처리하기 위해 구현해야 하는 메서드는 다음과 같습니다.
- 작업의 경우:
HandleAddTasks
HandleCreateTaskList
HandleSetTaskAttribute
- 참고:
HandleCreateNote
HandleAppendToNote
HandleSearchForNotebookItems
각 메서드에는 특정 의도 유형이 전달되며, 여기에는 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이 활성화되고 프로비저닝 프로필이 다운로드되었습니다.