[WWDC 2021] Meet Group Activities
안녕하세요 Pingu입니다.🐧
오늘은 WWDC 2021의 "Meet Group Activities"라는 영상을 보고 정리한 글을 써보려고 합니다.
이번 영상은 iOS 15에 새롭게 추가된 Group Activities라는 프레임워크에 대해 알아보는 영상이었습니다.
Group Activities를 간단하게 말하면 다른 애플 생태계 사용자와 FaceTime과 Message 앱을 사용하면서 다양한 콘텐츠를 함께 즐길 수 있도록 만들어주는 프레임워크였습니다.
Meet Group Activities
애플은 함께 뭔갈 즐기고 있는 사람들에게 같은 방에 있는 것처럼 느낄 수 있도록 하는 방법을 고민했고 이를 위한 방법으로 iOS 15에서 추가한 기능이 "SharePlay"라고 합니다. 이번 영상에서는 앱에서 이를 사용하는 방법을 알아본다고 하네요. 일단 사용하기 전에 Share Play의 구성에 대해 알아보도록 하겠습니다.
Communication
지난 1년간 코로나로 인해 멀리 떨어진 상태에서의 커뮤니케이션이 중요해졌다고 생각한 애플은 FaceTime, Message에 Share Play 기능을 추가했다고 합니다. FaceTime을 하는 친구와 영화를 보는 등의 활동이 가능하게 된 것이죠. 이런 기능이 어떻게 작동하는지 살펴보겠습니다.
모든 것은 Session에서 시작됩니다. 어떤 그룹에 속한 인원들이 뭔가를 시작하기 전에 모두 공유할 준비가 되도록 Session에 참가해야 하죠. 사용자가 session에 참가하면, 기존에 가능했던 text, audio, video를 통해 소통이 가능합니다. 그리고 사용자에게 session을 관리할 수 있는 일관된 system-wide를 제공합니다. 사용자는 session에 새로운 사람을 추가하거나, 떠날 수 있고, session에 참가한 사용자는 전체 시스템을 탐색하고 모든 앱에 접근할 수 있다고 합니다.
개발자는 이런 모든 기능을 Group Activies를 활용해서 개발할 수 있다고 하네요.
Platform
다음 구성 요소는 Platform 입니다. 애플은 여러 개의 제품에서 Share Play가 쉽고 동일하게 사용할 수 있기를 바랐다고 해요. 그래서 iOS, iPadOS, macOS에서 작동하는 통합 환경을 구축하고 있고, WebKit이 있는 웹사이트에서도 Group Activities를 사용할 수 있다고 합니다. 물론 AppleTV에서도 사용 가능하다고 하네요. 어떤 제품이던 Session에 있다면 인식이 되고 session에 참여할 수 있기 때문에 여러 제품에서도 잘 사용할 수 있다고 합니다.
Playback
Share Play를 사용할 때 에어팟과 같은 블루투스 장치에 고품질의 오디오를 전달하도록 설계했다고 합니다.
기존 API의 표현력을 최대한 활용하여 다양한 유형의 Share Play 활동이 생겨나기를 바라고, 미디어를 공유하는 경험을 쉽게 구현할 수 있도록 많은 개선 사항을 만들었다고 합니다.
미디어를 사용할 때 가장 중요한 것은 재생 버튼인데요, 재생 버튼을 누르고 난 후부터 콘텐츠를 즐길 수 있기 때문입니다. 애플은 시스템의 모든 재생 버튼이 Share Play와 함께 작동할 수 있도록 노력했다고 합니다. 즉 사용자가 FaceTime을 즐기는 도중 모든 미디어를 친구와 공유할 수 있다고 느끼길 바란다는 뜻이 되겠죠. 따라서 이를 위한 새로운 API가 제공된다고 합니다.
Share Play를 위한 새로운 API를 사용하면 그룹 대화가 활성화된 상태에서의 재생 버튼은 위와 같이 미디어를 공유할 수 있는 기능이 추가됩니다.
Time-Synced Playback
다음으로 Time-Synced Playback에 대해 알아보도록 하겠습니다.
Share Play를 통해 여러 사람들과 미디어를 공유했는데, 위와 같이 모두 영상의 서로 다른 시간을 보고 있다면 어떻게 될까요? 갑자기 어떤 사람은 웃고 어떤 사람은 우는 이상한 상황이 발생할 수 있습니다. 즉 재생 시간을 동일하게 맞추는 것이 중요하다고 할 수 있습니다.
Share Play를 사용하면 재생 시간을 플랫폼 수준에서 동기화된 상태로 유지하기 때문에 이를 걱정할 필요가 없다고 합니다. 이를 위해 iPhone과 같은 기기의 AVFoundation 스택에 통합된 새로운 playback-sync 프로토콜을 만들었다고 합니다. 이를 통해 그룹의 누군가가 재생을 누르면 그룹의 모든 사람의 영상이 재생되게 됩니다. 누군가 보여주고 싶은 장면으로 이동하면 모두 해당 화면으로 이동하게 되겠죠.
이러한 재생 동기화를 위해서는 어떤 식으로도 미디어를 재전송하지 않는다는 것을 의미한다고 합니다. 즉 앱에서 바로 재생되고 서버에서 스트리밍 되기 때문에 모든 사람이 고화질 비디오를 볼 수 있는 것이죠.
또한 여러 명의 사람과 함께 볼 수 있기 때문에 서로 대화를 하더라고 자연스럽게 느껴지도록 하기 위한 Smart Volume이라는 기능을 사용하면 콘텐츠 재생 중에 말을 하면 콘텐츠의 오디오를 잠깐 줄였다가 대화가 끝나면 다시 복구한다고 합니다.
마지막으로 Picture in Pictrue(PIP)와 잘 작동하도록 만들어서 사용자가 멀티태스킹을 하더라도 괜찮다고 합니다.
Content
앱에서 좋은 콘텐츠가 제공해줘야 사용자는 앱을 사용하게 됩니다.
애플은 FaceTime으로 통화를 하면서 앱으로 이동하여 콘텐츠를 공유할 수 있기를 기대한다고 합니다. Share Play를 사용하면 제품의 터치포인트를 확장하고 사용자가 앱을 사용하는 시간을 늘릴 수 있을 것으로 기대하는 듯합니다. 새로운 앱 사용자에게 기존 사용자가 앱을 설명해주는 활동도 해줄 수 있을 것으로 기대한다고 해요.
What are Group Activities?
여기까지 Share Play의 구성 요소에 대해 간단히 알아봤으니 이젠 프레임워크의 핵심 개념인 Group Activities에 대해 알아보도록 하겠습니다. Group Activities는 Share Play를 사용하여 FaceTime에서 사람들과 공유하고 즐길 수 있도록 해주는 객체입니다.
사용자는 위와 같이 앱에서 Group Activity를 시작할 수 있습니다. 통화 중에 사용자는 앱으로 이동하여 앱이 Group Activity를 채택한 경우 앱이 Share Play를 지원한다는 알림을 받게 됩니다.
공유 활동을 구성하기 위해서는 Group Activity 프로토콜을 채택한 객체를 만들어야 합니다. 이를 만든 뒤에는 prepareForActivation API를 호출하여 활동을 공유하기 시작합니다. 이 API는 사용자에게 활동을 FaceTime을 함께 사용 중인 모든 사람과 공유하거나 로컬에서만 보는 옵션을 제공합니다. 만약 그룹에 공유하기로 결정한다면 Group Activities에서 이를 알린 뒤 Group Session 객체에 참여할 수 있게 됩니다.
만약 사용자들이 Group Session에 참여하게 되면, 재생, 일시 정지, 특정 시점으로 이동할 때 그룹원과 비디오가 동기화됩니다. 이러한 이벤트는 발생할 때마다 Group Activities는 사용자에게 자동적으로 알려서 처리한다고 합니다.
마지막으로 위와 같이 사용자가 자신 혹은 전체 그룹에 대한 activities를 종료하도록 선택할 수 있다고 합니다.
Concepts and architecture
다음으로는 Group Activities라는 새로운 프레임워크의 몇 가지 고급 개념과 아키텍처에 대해 알아보겠습니다.
Group Activities는 FaceTime를 사용 중에 사용자들끼리 공유 경험을 제공할 수 있는 새로운 Swift 프레임워크입니다. 이는 AVFoundation과 통합되어 공유 비디오, 오디오 재생 경험을 쉽게 구현할 수 있도록 만들어졌다고 해요.
Group Activity API의 high-level 개념을 살펴보기 전에 두 가지 핵심 부분인 GroupActivity, GroupSession에 대해 알아보도록 하겠습니다.
GroupActivity
GroupActivity는 앱이 공유 경험을 정의할 때 사용합니다. 이는 앱이 공유 기능을 제공하기 위해 필요한 정보들을 가지고 있습니다. 예를 들어 공유 오디오, 비디오 재생을 사용하는 경우 재생 중인 콘텐츠의 URL을 가지고 있습니다.
혹은 앱에서 직접 구현한 공유 기능을 제공할 수도 있습니다. 예를 들면 함께 그리는 기능을 제공한다면 사용자가 그리는 내용에 대한 정보가 저장될 거예요.
GroupSession
GroupSession은 공유 기능에 참여하는 그룹을 나타냅니다. 그룹의 참가자와 같은 값들에 대한 접근을 제공하며 프레임워크에는 GroupSession과 함께 사용해서 장치 간 데이터를 주고받을 수 있는 API도 있습니다.
GroupSession은 많은 데이터를 교환하기 위한 것은 아니라고 합니다. GroupSession을 통해 노래를 함께 듣는 경우 노래를 직접적으로 주고받지는 않는다고 합니다. GroupSession은 그런 작업이 아닌 AVFoundation에서 재생, 일시정지, 탐색과 같은 이벤트를 주고받아서 그룹원의 콘텐츠를 동기화 상태로 유지하기 위해 사용한다고 합니다.
GroupSession에서 제공하는 통신 매체는 end-to-end 암호화가 되기 때문에 기기별 앱 외에는 이 채널을 통해 교환되는 데이터를 볼 수도 없다고 합니다.
Initiating an activity
실제로 동작되는 상황을 세부적으로 살펴보겠습니다.
위와 같이 두 개의 아이폰이 있고 왼쪽은 Bhaskar, 오른쪽은 Pierre라는 사람의 폰입니다. 둘은 FaceTime 통화를 하고 있고 "Awesome App"이라는 Group Activity를 사용하여 공유 기능을 제공하는 앱을 사용하고 있다고 합니다. 왼쪽 폰에서 activity를 시작한다고 가정해볼게요.
앱이 가장 먼저 해야 할 일은 Group Activity 프로토콜을 준수하는 객체를 만드는 일입니다. 위 그림에서는 AwesomeActivity라는 이름의 객체가 생성되었네요. 이 객체는 앞에서 알아봤듯이 공유 활동에 대한 정보가 포함되어있습니다. 재생할 콘텐츠에 대한 정보나 함께 그리는 기능을 제공하는 앱의 경우 무엇을 그릴지에 대한 정보가 있을 수 있겠네요.
앱이 activity를 생성한 뒤 할 일은 prepareForActivation을 호출하는 작업입니다. 이를 호출하면 사용자가 activity를 시작할지 물어보는 메시지가 표시되고 사용자 동의를 얻어야 activity를 시작할 수 있다고 합니다. 애플 제품에서 사용자 권한을 얻는 여러 작업들처럼 위 단계는 필수라고 하네요.
만약 사용자가 권한을 앱에게 줬다면 앱은 activity 객체의 activate를 호출하고 앱이 공유 기능을 시작할 것이라는 것을 시스템에 알린다고 합니다.
Observing a session
그럼 다음으로 Observing session에 대해 알아보도록 하겠습니다.
위 상태는 방금 전 예에서, 마지막에 언급됐던 activate를 호출한 상태입니다. 이 상태에서 앱은 GroupSession 클래스의 AsyncSequence를 통해 incoming session을 반복해야 합니다.
그런 뒤 다음 session이 있는 경우 공유 경험에 대한 GroupSession 객체가 앱에 전달됩니다. 이는 앱을 실행하는 기기나 session을 수신하는 원격 기기에서든 앱이 취하는 동일한 단계입니다.
Group Session의 시작 및 observing에 대한 자세한 내용은 아래 영상을 보라고 합니다.
Joining a session
여기까지 하면 앱이 session에 전달되었기 때문에 session에 참여하기 전에 앱의 설정이 필요합니다.
Session에 참여하기 전에 앱을 설정하는 것은 앱의 기능에 따라 다른 설정일 수 있는데요, 예를 들어 함께 그리는 앱과 동영상 공유 앱은 설정할 것들이 다를 거예요. 위 그림은 공유 미디어 기능을 제공하는 예입니다.
앱은 AVPlayer의 AVPlaybackCoordinator를 GroupSession과 연결하여 연결된 AVPlayer가 프레임워크에서 제공하는 통신 채널을 통해 콘텐츠를 동기화할 수 있도록 하는데요, 이 동기화는 AVPlayer에만 사용할 수 있는 것이 아닌 직접 만든 비디오 플레이어에도 사용할 수 있으며 AVDelegatingPlaybackCoordinator를 통해 동기화 지원을 계속해서 받을 수 있다고 합니다.
이렇게 앱 설정을 완료하면 앱이 GroupSession에서 join()을 호출합니다. join()이 호출되면 시스템은 서로 다른 기기에서 실행되는 앱 간 end-to-end 암호화된 채널을 설정합니다. 이 시점에서 앱은 데이터를 동기화하고 사용자가 공유 환경에 참여할 수 있게 됩니다.
직접 공유 환경을 생성하는 경우 앱은 이 채널을 사용하여 데이터를 교환하여 사용자들을 동일한 상태로 유지할 수 있다고 합니다. 또한 미디어를 공유하는 앱에서 사용자가 재생, 일시 정지와 같은 이벤트를 발생시킬 때 AVFoundation에서 이 채널을 사용하여 동기화 상태를 유지한다고 합니다. 앞에서도 한 번 언급됐었는데, 이 채널은 많은 데이터를 교환하는 데 사용되지는 않고 사용자들의 콘텐츠들을 동일한 상태로 유지하기 위한 정보만 교환하는데 사용하라고 하네요.
Posting events
이렇게 하면 앱에 session이 있고 사용자가 공유 기능을 즐길 수 있다고 합니다. 여기서 좀 더 많은 기능을 제공하기 위해 할 수 있는 일은 프레임워크를 사용하여 이벤트를 게시하는 것이라고 하네요.
이벤트를 통해 사용자는 공유 환경에서 무슨 일이 일어나는지 알 수 있다고 합니다. 예를 들어 이벤트를 게시하여 누군가가 트랙을 재생, 일시정지할 때 사용자에게 알릴 수 있다고 합니다. 이벤트를 게시하면 시스템에서 사용자에게 알리는 알림을 표시할 수 있는데, 현재 API에서는 미디어 재생에 대한 이벤트에 대해서만 해당 기능을 제공한다고 합니다. 따라서 AVPlayer, AVDelegatingPlaybackCoordinator를 사용하면 해당 기능을 쉽게 사용할 수 있다고 하네요.
물론 이를 사용하지 않더라도 프레임워크를 사용해서 이벤트를 게시할 수도 있다고 합니다. 이를 위해 이벤트를 게시하는 자세한 방법은 아래 영상을 참고하라고 합니다.
영상을 마무리하며 이번 영상에서 본 내용을 정리하면 아래와 같습니다.
- Group Activities는 FaceTime을 통해 공유 기능을 생성할 수 있는 새로운 프레임워크입니다.
- 프레임워크는 iOS, iPadOS, macOS, tvOS 모두 사용할 수 있습니다.
- 앱이 미디어를 공유하기 위해서 AVFoundation와 통합되었습니다.
- macOS에서 웹을 통한 재생 동기화도 지원합니다.
이렇게 이번 영상은 마무리됩니다.
이번 iOS 15의 새로운 기능 중 가장 기대되는 기능 중 하나로 빨리 나왔으면 좋겠는데.. 아직은 FaceTime에서 사용할 수 없더라고요.
곧 사용할 수 있길 바라고, 해당 프레임워크로 다양한 기능을 개발할 수 있었으면 좋겠습니다.
그럼 오늘 WWDC 영상인 "Meet Group Activities"는 여기까지 정리하도록 하겠습니다.
감사합니다.😀