그룹통화 만들기(iOS)

그룹통화란?

다수의 참여자가 통화에 참여하는 서비스를 위한 기능입니다. 참여자는 앱을 이용하는 나와 그 외 참여자로 구분할 수 있습니다. 아래에서는 나와 참여자로 줄여서 표시합니다. 한 회기의 그룹통화는 RemonConference 클래스의 인스턴스로 대표됩니다. 나는 통화 연결, 참여자들의 입장/퇴장 알림 등 대부분의 일을 RemonConference 객체에게 위임합니다.

RemonConference

iOS SDK 2.7.0이상
그룹통화를 위해 RemonConference 객체를 생성하고, 설정을 진행합니다. RemonConference 클래스는 그룹통화를 위해 아래 메소드를 제공합니다.
1
create( roomName:String, config:RemonConfig, callback:OnConferenceEventCallback )
2
leave()
Copied!
RemonConference 클래스는 콜백으로 사용하기 위해 아래 메소드를 제공합니다. 이하 콜백용 메소드라고 합니다. 콜백용 메소드는 위에서 언급한 메소드의 콜백으로만 호출하며, 일반적인 메소드처럼 호출하지 않습니다.
1
// create 메소드의 콜백용 메소드
2
.on( eventName:"onRoomCreate") { participant in
3
}.on( eventName:"onUserJoined") { participant in
4
}.on( eventName:"onUserStreamConnected") { participant in
5
}.on( eventName:"onUserLeft") { participant in
6
}.close {
7
}.error { error in
8
}
9
10
// participant 의 콜백용 메소드
11
.on(event:"onComplete") { participant in
12
}.on(event:"onClose") { participant in
13
}.on(evennt:"onError") { error in
14
}
Copied!

레이아웃 작업

그룹통화 화면을 나의 영상 한 개와 그룹 참여자의 영상 여러 개로 구성합니다. 레이아웃에 영상을 표시할 view를 만들고 인덱스를 지정하여 참여자의 영상을 원하는 위치에 표시할 수 있도록 합니다.
XCode 스토리보드

레이아웃 초기화

레이아웃을 바인딩하고, 각 view를 배열에 담아 index 로 접근이 가능하도록 설정합니다.
1
@IBOutlet var viewArray: [UIView]!
2
var availableViews:[Bool]?
Copied!
뷰들을 배열에 추가

RemonConference 객체 생성

RemonConference 객체를 생성하고, 나의 영상을 송출하기 위한 설정을 합니다.
1
// 뷰를 설정하기 위한 배열 : 서버스에 맞게 구
2
availableViews = [Bool](repeating: false, count: self.viewArray.count)
3
4
var remonConference = RemonConference()
5
6
// config
7
let config = RemonConfig()
8
config.serviceId = "콘솔을 통해 발급 받은 Service Id"
9
config.key = "콘솔을 통해 발급 받은 Secret Key"
10
11
12
remonConference.create( "방이름", config: config) {
13
participant in
14
15
// 마스터유저가 전달됩니다. (iOS의 경우 Builder 를 제공하지 않습니다)
16
// 객체 생성은 RemonConference에서 이루어지므로 전달된 객체에 설정만을 제공합니다.
17
participant.localView( surfaceRendererArray[0] )
18
19
}.close {
20
// 마스터 유저가 종료된 경우 호출됩니다.
21
// 송출이 중단되면 그룹통화에서 끊어진 것이므로, 다른 유저와의 연결도 모두 끊어집니다.
22
}.error {
23
error in
24
// 마스터 유저가 연결된 채널에서 에러 발생 시 호출됩니다.
25
}
Copied!

그룹통화 콜백

create 메소드로 그룹통화에 입장한 뒤 on() 메쏘드로 콜백을 등록할 수 있습니다.모든 참여자가 퇴장하면 이 이름의 그룹통화는 소멸됩니다. 새 참여자가 그룹통화에 입장하면 연결된 on 메소드의 콜백이 호출됩니다. on 메소드 콜백에서 RemonParticipant 객체가 제공되므로, 해당 정보를 사용해 설정을 진행합니다.
1
remonConference.create( "방이름", config: config) {
2
participant in
3
}.on( "onRoomCreated" ) {
4
participant in
5
// 마스터 유저가 접속된 이후에 호출(실제 송출 시작)
6
// TODO: 실제 유저 정보는 각 서비스에서 관리하므로, 서비스에서 채널과 실제 유저 매핑 작업 진행
7
// tag 객체에 holder 형태로 객체를 지정해 사용할 수 있습니다.
8
// 예제에서는 뷰 할당을 위해 단순히 view의 index를 저장합니다.
9
participant.tag = 0
10
11
// 뷰 설정용
12
availableViews?[0] = true
13
}.on( "onUserJoined" ) {
14
participant in
15
Log.d( TAG, "Joined new user" )
16
// 그룹통화에 새로운 참여자가 입장했을 때 호출됩니다.
17
// 새로운 참여자의 RemonParticipant 객체가 전달됩니다.
18
19
// 뷰 리스트에서 비어있는 뷰를 얻어와 설정합니다.
20
if let index = self?.getAvailableView() {
21
participant.localView = nil
22
participant.remoteView = self?.viewArray[index]
23
participant.tag = index
24
}
25
}.on( "onUserStreamConnected" ) {
26
participant in
27
28
}.on( "onUserLeft" ) {
29
participant in
30
31
// 다른 사용자가 퇴장한 경우
32
// participant.id 와 participant.tag 를 참조해 어떤 사용자가 퇴장했는지 확인후 퇴장 처리를 합니다.
33
if let index = participant.tag as? Int {
34
self?.availableViews?[index] = false
35
}
36
}
37
38
39
// 비어있는 뷰 검색 함수 : 각 서비스에 맞게 구성합니다.
40
func getAvailableView() ->Int {
41
if let views = self.availableViews {
42
for i in 0 ... views.count {
43
if views[i] == false {
44
self.availableViews?[i] = true
45
return i
46
}
47
}
48
}
49
50
return 0
51
}
Copied!

그룹통화 종료

그룹통화에서 퇴장하면 나와 그룹통화의 연결이 종료됩니다. 나와 참여자들 간의 연결도 종료됩니다.
1
remonConference.leave()
Copied!

RemonParticipant

각 참여자들과의 연결은 RemonConference 내부의 RemonParticipant 객체를 통해 이루어집니다. RemonParticipant 객체는 RemonClient를 상속받은 객체이므로, 공통적인 기능은 RemonCall, RemonCast 와 동일합니다. 각 이벤트마다 RemonParticipant 객체가 전달되므로 각 연결은 해당 객체를 통해 제어할 수 있으며, 마스터 객체의 경우 RemonConference 객체에서 얻어올 수 있습니다.
1
// 마스터 유저 얻기
2
var participant:RemonParticipant = remonConference.me
Copied!
RemonParticipant 객체는 RemonClient를 상속받은 객체입니다. onCreate, onClose, onError 콜백은 on으로 재정의되어 RemonConference에서 관리, 사용되고 있으므로, 해당 콜백을 변경하지 마시기 바랍니다.
Last modified 1yr ago