본문으로 건너뛰기
Version: 7.1

그룹 음성 통화

그룹 음성 통화를 구현하는 예제 코드입니다.

필수 조건​

시작하기 전에 다음 작업을 수행해야 합니다.

그룹 음성 통화 구현 시 고려 사항​

joinConference()를 호출한 다음에는 반환된 PlanetKitConferenceJoinResult의 reason 속성을 확인해야 합니다.

  • reason이 PlanetKitStartFailReason.none인 경우 성공을 의미합니다.
  • 그렇지 않으면 실패를 의미하며 reason에 따라 적절한 조치를 취해야 합니다.

이벤트 대리자 구현​

통화에서 사용될 이벤트 대리자(delegate)를 구현하세요.

  • PlanetKitConferenceDelegate는 그룹 통화의 상태 변경 이벤트를 처리하는 데 사용됩니다.
  • PlanetKitMyMediaStatusDelegate는 로컬 사용자의 미디어 상태 변경 이벤트를 처리하는 데 사용됩니다. 마이크가 음 소거되거나 음 소거 해제되는 경우 또는 오디오 설명이 업데이트되는 경우 등 이벤트를 기반으로 로컬 사용자의 UI를 업데이트할 수 있습니다.
extension ConferenceDelegateExample : PlanetKitConferenceDelegate {
func didConnect(_ conference: PlanetKitConference, connected: PlanetKitConferenceConnectedParam) {

// This is called when the call is connected.
// Write your own code here.

}

func didDisconnect(_ conference: PlanetKitConference, disconnected: PlanetKitDisconnectedParam) {

// This is called when the call is disconnected.
// Write your own code here.

}

func peerListDidUpdate(_ conference: PlanetKitConference, updated: PlanetKitConferencePeerListUpdateParam) {

// This is called when the list of peers is updated.
// Write your own code here.

}

//
// Also, you should implement other methods defined in the PlanetKitConferenceDelegate protocol.
//
...
}

extension MyMediaStatusDelegateExample: PlanetKitMyMediaStatusDelegate {
func didMuteMic(_ myMediaStatus: PlanetKitMyMediaStatus) {

// This is called when the local user's audio is muted.
// Write your own code here.

}

func didUnmuteMic(_ myMediaStatus: PlanetKitMyMediaStatus) {

// This is called when the local user's audio is unmuted.
// Write your own code here.

}

func didUpdateAudioDescription(_ myMediaStatus: PlanetKitMyMediaStatus, description: PlanetKitMyAudioDescription) {

// This is called when the local user's audio description is updated.
// Write your own code here.

}

//
// Also, you should implement other methods defined in the PlanetKitMyMediaStatusDelegate protocol.
//
...
}

그룹 통화 입장​

그룹 통화에 입장하기 위한 절차는 다음과 같습니다.

  1. PlanetKitJoinConferenceSettingBuilder를 통해 설정 정보를 만드세요.
  2. PlanetKitConferenceDelegate를 포함하여 PlanetKitConferenceParam을 생성하세요.
  3. PlanetKitManager.shared.joinConference()를 호출하세요.
  4. PlanetKitConferenceJoinResult를 확인하세요.

로컬 사용자의 초기 오디오 상태는 PlanetKitJoinConferenceSettingBuilder의 withInitialMyAudioStateKey()로 설정할 수 있습니다.

  • 초기 오디오 상태의 기본값은 PlanetKitInitialMyAudioState.unmuted입니다.
  • PlanetKitInitialMyAudioState.muted를 전달하여 로컬 사용자의 초기 오디오 상태를 음 소거로 설정하면, 통화 시작 시 마이크가 활성화되지 않고 오디오가 전송되지 않습니다. 통화가 연결된 후 muteMyAudio(false)를 호출하면 로컬 사용자의 오디오를 전송할 수 있습니다.
class ParticipantExample
{
var conference: PlanetKitConference?
var myMediaStatusDelegate: MyMediaStatusDelegateExample
}

...

extension ParticipantExample
{
func joinConferenceExample(myId: String, myServiceId: String, roomId: String, roomServiceId: String, accessToken: String, delegate: PlanetKitConferenceDelegate, initialMyAudioState: PlanetKitInitialMyAudioState) {
let myUserId = PlanetKitUserId(id: myId, serviceId: myServiceId)

let settings = PlanetKitJoinConferenceSettingBuilder()
.withInitialMyAudioStateKey(initialMyAudioState)
.build()
let param = PlanetKitConferenceParam(myUserId: myUserId, roomId: roomId, roomServiceId: roomServiceId, displayName: nil, delegate: delegate, accessToken: accessToken)

let result = PlanetKitManager.shared.joinConference(param: param, settings: settings)

guard result.reason == .none else {
NSLog("Failed reason: result. \(result.reason)")
return
}

// The result.conference instance is a conference instance for calling other APIs from now on.
// You must keep this instance in your own context.
// In this example, the "conference" variable holds the instance.
conference = result.conference
}
}

로컬 사용자에 대한 미디어 상태 이벤트 대리자 설정​

통화가 연결되면 로컬 사용자에 대한 미디어 상태 이벤트 대리자를 설정하세요.

extension ParticipantExample
{
func addMyMediaStatusHandlerExample() {
conference?.myMediaStatus.addHandler(myMediaStatusDelegate) {
// completion callback
}
}
}

각 피어에 대한 피어 컨트롤 생성​

피어 목록이 업데이트되면 새로 추가된 피어에 대해 PlanetKitPeerControl을 생성하고 PlanetKitPeerControlDelegate 객체를 등록하세요. PlanetKitPeerControlDelegate를 사용하여 각 피어의 상태 변경을 처리할 수 있습니다.

class YourPeerView: NSView {

...

var peerControl: PlanetKitPeerControl?
var peerVideoView: PlanetKitMTKView!

func setupPeerControl(for peer: PlanetKitConferencePeer, in conference: PlanetKitConference) {
guard let peerControl = conference.createPeerControl(peer: peer) else {
return
}

peerControl.register(self) { success in
// Write your own code here.
}
self.peerControl = peerControl
}
}

extension YourPeerView: PlanetKitPeerControlDelegate {

func didMuteMic(_ peerControl: PlanetKitPeerControl) {

// This is called when the local user's audio is muted.
// Write your own code here.

}

func didUnmuteMic(_ peerControl: PlanetKitPeerControl) {

// This is called when the local user's audio is unmuted.
// Write your own code here.

}

//
// Also, you should implement other methods defined in the PlanetKitPeerControlDelegate protocol.
//
...
}

그룹 통화 퇴장​

그룹 통화에서 퇴장하려면 leaveConference()를 호출하세요.

extension ParticipantExample
{
func leaveConferenceExample() {
conference?.leaveConference()
}
}

관련 예제 코드​

관련 문서​