[iOS][WWDC2019] SiriKit Media Intents

Madeline👩🏻‍💻·2023년 10월 28일
1

iOS study

목록 보기
21/61
post-thumbnail

SiriKit Media Intents

https://developer.apple.com/videos/play/wwdc2019/207/

1. 새로운 시리킷 미디어 인텐트

  • 시리로 할 수 있는 일: 오디오 재생, 프로필 업데이트, 컬렉션에 추가 및 검색, ..
  • 풍부한 자연어 처리 기능

Media Intent에는 4가지가 있음

1) INPlayMediaIntent

: audio 재생할 수 있게

2) INAddMediaIntent

: audio plalist에 삽입

  • "이 노래를 내 여행 플레이리스트에 넣어줘"

3) INUpdateMediaAffinityIntent

: 미디어 항목에 대한 선호도 표현

  • 나는 이 노래를 좋아해요"

4) INSearchForMediaIntent

: 특정 미디어 항목 검색

  • "내 앱에서 Billie Eilish 찾아줘"

SiriKit Media에서 지원되는 미디어 유형

1) 음악
노래, 앨범, 아티스트, 재생목록, 장르 등
INMediaSearch 참고하기!

  • playback 컨트롤: 재생, 반복, 재생대기열, ..
    "내 앱에서 Khalid 셔플 재생해줘"

2) Podcast

  • 에피소드 재생순서와 속도 제어

3) 오디오북

  • playback 속도 제어

4) 라디오

  • 특정 라디오 방송국 요청

위에 속하지 않아도, SiriKit Media Intent 채택하여 모든 기능을 활용할 수 있음

ex) "Play [Search Term(검색어)] in [MyApp(내 앱에서)]"
-> 앱에서 검색어를 조회, 재생할 수 있음

  • 강력하게 parsed되어있는 미디어 유형은 누락될 수 있음
    ex) "내 앱에서 파충류 소리 재생해" or "내 앱에서 포유류 소리 재생해"라고 말하면,
    시리는 이 소리가 서로 다른 두 가지 유형의 동물 소리라는 사실을 인식하지 못해서, 찾아보고 재생할 수 있음. 그래서 다른 유형만큼 구조화되어있지는 않은데, 지원되긴 함

2. 시리킷 미디어 요청을 다루기

SiriKit Media로 요청하는 방법!

  • SiriKit Media Intents는 다른 SiriKit 도메인과 같다.
    그래서 모든 Intent 처리는 SiriKit Media Intent처리 프로토콜을 준수하는 Intents app extension에서 발생한다.

일반적인 요청에 대한 로직

"Play Awesome Song in MyApp"

요청 처리는 "내 앱에서 멋진 노래 틀어줘"로 시작된다.
그러면 Siri는 너의 앱에 대한 요청임을 인식하고, Intents Extension을 시작할거다.

SiriKit Request Process

SiriKit 요청 처리에는 3가지 단계가 있음
1. 해결 Resolve

  • Intent의 INMediaSearch 개체를 가져와, 앱 catalog에 대해 검색을 실행
  • 출력: 재생할 하나 이상의 구체적인 미디어 항목 개체
  • if, 일치하는 항목이 없거나 오류가 있다면, 지원되지 않는 결과 반환 + 시리가 오류 대화 상자를 표시
  1. 확인 Confirm
  • 일반적으로 Media Domain에서는 확인 단계는 사용하지 않는 것이 좋다. 우리 앱의 사용량을 살펴보면, 확인 기능을 사용할 때 사람들이 미디어를 계속 재생할 가능성이 실제로 낮아졌다.

  1. 처리
    INPlayMediaIntent의 경우, 백그라운드 앱 실행을 수행하는 "앱 처리" 응답 코드를 반환하므로, 이는 매우 간단해진다.

    그리고 백그라운드 앱 실행 내에서 우리는 앱에서 평소처럼 미디어를 재생할것이다.
    -> 여기서 까다로운 부분은 테스트.
    화면에 UI가 없어서 모든 것이 재생되는지, 다양한 상황에서 확인하고 싶을 것이다.
    ex) CarPlay, 헤드폰 착용하고 있는 경우

  • 매개변수는 약간 달라도, 해결하는 로직은 4가지의 미디어 Intent 모두 동일하다.
  • 해결(Resolve): 앱 catalog 검색하는 건데, 4가지 Intent 모두에 대해 동일한 방식으로 수행하기를 원한다.
  • 그래서 result를 지원되지 않는 결과로 초기화한다. 그래서 앱 catalog에서 아무 것도 찾을 수 없는 경우, Siri에게 적절한 오류 대화 상자를 말하도록 지시할거다.
  • INMedaiSearch는 사용자가 재생을 요청하는 항목에 대한 세부 정보가 포함된 Intent Field이다. INMedaiSearch는 Siri가 지원하는 모든 오디오 관련 쿼리의 세계를 나타낸다.
  • 해결(Resolve)에서 우리가 하는 일은, 가능성의 후보들 중에서 플레이할 수 있는 단일 아이템으로 이동하는 것이다. 여기에서 가장 먼저 할 일은 INMediaSearch에서 미디어 이름을 읽는거다.
  • 그 다음 앱 catalog에서 항목 목록을 검색한다.
where item.name == mediaName {

미디어 검색에서 미디어 이름 속성을 사용해서 항목의 이름 속성과 비교할거다.
(배송 앱에서 할 작업은 아니다)

  • 이름이 정확히 일치하면, 재생할 항목을 찾은거고, 해당 항목의 속성을 사용하여 성공 결과를 만들거다.

  • 그 다음 completion 핸들러를 호출하고, 핸들링으로 넘어간다.

  • 여기에서는 핸들은 매우 짧아지게 된다. 왜냐면 우리가 할 일은 handlerInApp 성공 응답 코드를 반환하는 것뿐..

  • 그러면 백그라운드에서 앱을 실행하는 프로세스가 시작된다.

백그라운드 앱 실행

백그라운드 앱 실행을 지원하기 위해 App Delegate에서 구현하는 방법은 Application Process Intent Completion Handler이다.
-> 이거 짧은 구현임.


재생할 첫번째 미디어 항목 읽은 다음에, 평소처럼 앱에서 해당 항목을 재생한다.

마지막으로 성공 응답코드를 사용해서 완료 핸들러를 호출한다.

3. Demo

기존 미디어 애플리케이션에 SiriKit Media Intent Process를 추가해보자. 아주 쉽다!
예로 음악 앱이 있고, 여기에 Siri 지원을 추가해볼거다.
TODO
[] Siri extension target 추가
[] 몇가지 메서드 추가
[] Siri 요청 처리

Siri Extension Target 추가

File >> New >> Target >> Select >> Intents Extension 선택

그러면 xcode가 Intent Handler를 만들어줄거다. 이제 앱에 Siri 기능을 추가해보자!

왼쪽 상단에 +Capability >> Siri해서 추가

다시 Target >> (App)Extension >> Intent 추가해야돼
여기서는 InPlayMediaIntent, InAddMediaIntent 추가할게

11:15

Reference
https://developer.apple.com/kr/siri/
https://developer.apple.com/documentation/sirikit/

profile
🍎 Apple Developer Academy@POSTECH 2기, 🍀 SeSAC iOS 4기

0개의 댓글