[iOS] Group Activities를 활용한 실시간 자료공유

Updated:

Custom experiences with Group Activities

  • 그룹 액티비티는 디바이스들을 통해 사용자들간에 미디어 경험을 공유할 수 있도록 해준다.

  • 그룹 액티비티 API의 가장 핵심 기능중 하나는 공통적으로 유저들이 서로 같이 실시간으로 공유 할 수 있게 하는 것이다.

  • 그룹 액티비티를 적용하는 두가지 방법
    • Activity creation
    • Session management
  • Activity creation

    1

    • 액티비티를 활성화하여 액티비티를 설정한다. 미디어 그룹 액티비티와는 다르게, 커스텀 액티비티만 이 설정을 진행한다.
    • 액티비티를 설정할때, 유저를 대상으로 무엇을 공유하게 할지 깊이 생각해봐야 한다.
  • Session Management

    2

    • 액티비티 그룹을 사용하여 커스텀 데이터를 주고받도록 한다.
    • 세가지 단계
      1. Receive session
      2. Preparing for playback —> Configure session : 커스텀 데이터를 주고받을수 있도록 하는 단계
      3. Join session
    • GroupSessionMessenger: GroupSession 내에서 유저들간에 raw 데이터나 구조화된 데이터(구조체 or 클래스)를 주고받을수 있는 API를 제공함.

GroupActivity Capability 생성

3

GroupActivity생성을 위해서는 Signing & capabilities - All 탭에서 +capablity 를 클릭후, “Group Activities” 를 클릭한다.

GroupActivity 객체 생성

4

GroupActivity 객체를 만들기 위해서 GroupActivity 프로토콜을 채택한다. 그리고 필수로 요구되는 metadata 를 설정해준다. 여기서 중요한 것은 커스텀 액티비티로 생성하려는 것이기 때문에 type.generic 으로 해준다.

GroupActivity 객체를 활성화시키기(activate)

위에서 만든 DrawTogether GroupActivity 객체를 활성화시키려면 다음과 같은 코드를 작성한다.

DrawTogether().activate()

GroupSession 가져오기

5

GroupSession Join 하기

위에서 가져온 GroupSession Join을 다음과 같은 코드로 실행할 수 있다.

session.join()

데이터 송수신 하기

  • 위에서 만든 GroupSession을 파리미터로 GroupSessionMessenger 객체를 만들어서 송수신한다.
  • 특정 데이터를 보내기 위해서 struct 타입의 데이터를 만들어 줄 수 있다.

6

데이터 송신시에 발생하는 에러는 올바르게 처리해줘야 한다.

  • GroupSessionMessenger는 선입선출로서 여러 유저들로부터 가장 먼저 온 데이터를 우선적으로 처리한다.
  • send API 사용시 메시지의 크기가 너무 크면 에러가 던져진다.
  • GroupSessionMessenger 는 이미지나 영상같은 큰 데이터같은 데이터 송수신에는 적합하지 않다.
  • 메시지를 빠른 시간안에 연속적으로 송신하게 되면 에러가 던져질 수 있다.

Late-joiners 처리

Late-joiners란 두개 이상의 디바이스들이 이미 Group Session에 join 된 상태에서 도중에 하나의 디바이스가 join을 한 디바이스 혹은 유저를 말한다.

7

두 디바이스가 이미 join 중에 다른 하나의 디바이스가 join하게 되면 다음과 같이 이전의 두 디바이스간에 전송된 최신 데이터를 받아오지 못하는 문제가 발생한다.

8

이를 해결하기 위해 중간에 한 디바이스가 join하게 되면 다른 기존의 두 디바이스들은 활성된 디바이스 프로퍼티들의 신호를 관찰하고 있다가 해당 신호가 잡히면 최근 데이터를 중간에 join한 디바이스에게 보낸다.

9

이를 코드로 옮기면 다음과 같다. 우선 최신 캔버스 데이터를 중간에 join한 디바이스에게 보내야 하기 때문에 이를 위한 구조체를 만든다.

10

그리고 해당하는 최신 데이터를 수신하는 코드를 작성한다.

11


12

마지막으로 중간에 join하는 새 디바이스에게만 catch-up 메시지를 보내도록 한다.

13

Changing Activity

지금까지 Group Session을 이용하여 특정 activity를 실행하기 위한 기본 설정을 마쳤다.

한가지 생각해보아야 할 것은 드로잉 캔버스를 변경한다던가 시청중인 영화를 변경하는 등의 activity를 완전히 변경하기 위해 무엇을 해야 할 것인가 이다.

14

두가지 방법이 존재한다.

  • New session: 애초에 새로운 Group Session을 생성하는 방법
    • GroupActivity.prepareForActivation() : Group Session을 시작했던 같은 API를 호출함으로 콘텐츠를 변경한다.
    • Group Session상에서의 입장과 퇴장을 깔끔하게 처리하기 때문에 사용자들간의 일정한 상태 유지에 좋다.
    • 유저가 새로운 기록이나 영상을 찾는 등, 기존 activity를 종료하고 새로운 activity를 시작하는데 용이하다.
    • 시스템에게 변경사항을 알려주고, 시스템은 이를 유저에게 알린다.
    • GroupActivity.prepareForActivation() 를 호출하면 마치 처음 Group Session을 시작하는 것처럼 새로운 Group Session을 받고 시작한다.
  • Updating activity: 현재 Group Session의 Activity를 업데이트 해주는 방법
    • 하나의 음원이 재생되고 다른 음원이 재생되는 것처럼, 여러 애플리케이션이 있고 그 애플리케이션들 간의 이동 혹은 전환을 위해 사용한다.
    • GroupSession.activity = newActivity 을 사용하여 새로운 액티비티로 전환한다.

GroupState observation

GroupSession을 시작하면 아래 그림과 같이 UI를 변경하려면 어떻해야 할까?

15

GroupStateObserver.isEligibleForGroupSession 을 사용하면 디바이스가 Group Session에 참여가능한지 여부를 확인할 수 있다.

16

[출처]: WWDC 강연: Build custom experiences with Group Activities

Categories: ,

Updated:

Leave a comment