- 시리에게 어떻게 말을 전달하고, 시리가 어떻게 응답할 것인가?
- 다양한 언어, 다양한 형식으로 전달될 수 있다.
- 여러 앱들사이에서 일관성 있게 동작해야한다.
- Speech - Intent - Action - Response 단계
- 앱개발자 입장에서의 시리 실행 과정
- Speech에서 Vocabulary가 추출된다.
- Vocabulary를 분석해서 Intent를 구성한다.
- Intent는 앱에서 처리된다.
- 이후 시리의 UI에 뷰가 뜨게 된다.
- 시리의 언어로 말하기
- 도메인 기반
- 알려진 동작들, 혹은 인텐트
- 인텐트는 수행될 동작을 나타내며 0~n개의 파라미터를 가진다.
- 인텐트는 앱에서 처리된 후, 응답 코드로 결과를 전달하게 된다.
- 인텐트의 라이프사이클
- Resolve: 인텐트를 만들기 위해 파라미터를 채우는 과정. 여러번 일어날 수 있고, 같은 파라미터도 여러번 채워질 수 있다.
- 바로 ok혹은 확인 요청, 여러 후보 중 하나를 선택하도록 할 수 있음
- 정보가 부족하다면 디테일한 정보 혹은 해당 값을 요구할 수 있음.
- 처리할 수 없다면, 처리할 수 없다고도 응답 가능
- 특정 값은 필요하지 않을 수 있고, 이를 체크하면 알아서 처리
- Confirm: 인텐트를 확정
- 여기서 확정을 위한 얼럿 형태의 UI를 띄울 수 있음
- Handle: 실제로 결과를 처리하는 것
- 사용자에게 최대한 피드백을 제공할 것
- 네트워크 처리로 인해 시간이 많이 걸라면 시리가 로딩 UI를 처리할 수 있다.
- 앱에 시리킷 추가하기
- Intents 익스텐션
- 시리킷의 근간
- 1개 이상의 인텐트를 추가
- 시리가 동작할 때 백그라운드에서 돌아감
- 인텐트의 라이프사이클에 관여할 수 있는 메소드가 들어간다.
- 잠겨 있는 동안은 실행되지 않도록 하거나, 잠금이 풀려있더라도 추가 인증을 요구할 수 있다.
- intents UI 익스텐션
- 시리에게 커스텀 UI를 제공하기 위한 수단
- UIViewController 기반
- 인터렉션은 불가능
- 앱에서
- 앱단어장
- 앱은 각자 고유한 용어를 쓸 수 있다.
- 메인 앱 번들에 plist 형태로 추가
- 로컬라이징 권장
- 형태
- 유저의 사용 예제
- 파라미터
- 구체적인 단어
- 발음
- 앱에서의 해당 단어의 사용 예제
- 유저 단어장
- 특정 유저에게만 통용되는 단어
- 용어들의 OrderedSet 형태로 제공 -> 이는 우선순위를 줄 수 있게 하기 위함
- 추가 및 삭제 가능
- 시리킷을 사용할 때는 사용자 권한을 물어봐야 함
- 시리킷과 iOS는 긴밀하게 통합되어 있다.
- Contact와 CallKit등과도 긴밀하게 연결되어 있다.
- 앱 선택하기
- 유저는 사용할 앱 이름을 말해야 된다.
- 번들에 있는 displayName이 사용된다.
- 디자인 가이드라인
- 대화기반 인터페이스
- 많은 부분을 자동으로 해주지만, 다양한 상황에서 올바르게 동작하도록 테스트할 것
- 준비
- 유저의 입장에서 볼 것: 유저는 개발자와 같지 않다.
- 실제 사람이 어떻게 말하는 지 체크할 필요가 있다.
- 유저의 요청을 최대한 살려라
- 기본 값을 최대한 제공하라
- 유저가 기대하지 않는 응답을 기본값으로 하지는 말 것
- 최대한 간결하게 응답할 것
- 컨펌창이 필요하다면
- 옵션수는 최대한 적게
- 정말로 필요한지, 그렇게 큰 임팩트가 있는지 확인 할 것
- 모호함 제거
- 가짓수를 최대한 적게, 사용자가 제공한 정보를 이용해서 필터링
- 필요하다면 커스텀 UI
- 모든 사이즈에 대응
- 최대한 간결하게, 중복되지 않도록
- 예시는 최대한 간결하게, 기능에 집중
- 무엇보다 반복적인 테스트만이 답