그룹 음성 통화
그룹 음성 통화를 구현하는 예제 코드입니다.
필수 조건
시작하기 전에 다음 작업을 수행해야 합니다.
- PlanetKit을 초기화하세요.
- 적절한 액세스 토큰을 획득하세요.
- 그룹 통화 흐름에서 전반적인 API 사용 과정을 확인하세요.
그룹 음성 통화 구현 시 고려 사항
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.
//
...
}
그룹 통화 입장
그룹 통화에 입장하기 위한 절차는 다음과 같습니다.
PlanetKitJoinConferenceSettingBuilder
를 통해 설정 정보를 만드세요.PlanetKitConferenceDelegate
를 포함하여PlanetKitConferenceParam
을 생성하세요.PlanetKitManager.shared.joinConference()
를 호출하세요.PlanetKitConferenceJoinResult
를 확인하세요.
class ParticipantExample
{
var conference: PlanetKitConference?
var myMediaStatusDelegate: MyMediaStatusDelegateExample
}
...
extension ParticipantExample
{
func joinConferenceExample(myId: String, myServiceId: String, roomId: String, roomServiceId: String, accessToken: String, delegate: PlanetKitConferenceDelegate) {
let myUserId = PlanetKitUserId(id: myId, serviceId: myServiceId)
let settings = try! PlanetKitJoinConferenceSettingBuilder().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
를 사용하여 각 피어의 상태 변경을 처리할 수 있습니다.
#if os(macOS)
typealias UIView = NSView
#endif
class YourPeerView: UIView {
...
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()
}
}
애플리케이션에서 Apple CallKit 구현
이 단계는 iOS 애플리케이션에만 적용됩니다.
CallKit은 통화 인터페이스를 제공하는 Apple의 프레임워크 중 하나입니다. PlanetKit SDK는 CallKit에 대해 사용자 CallKit 구현 연동, PlanetKit 내부 구현 연동, 연동하지 않음이라는 세 가지 옵션을 지원합니다.
기본적으로 PlanetKit SDK는 CallKit 연동 없이 통화를 생성하거나 수신합니다. 자체 CallKit 구현을 연동하려면 PlanetKit SDK로 통화를 생성하거나 수신할 때 PlanetKitCallKitSetting
의 type
을 user
로 설정해야 합니다.
애플리케이션에서 CallKit을 구현하려면 다음 절차를 따르세요.
-
PlanetKitCallKitSetting
인스턴스를 생성하고PlanetKitCallKitSetting
의type
을user
로 설정하세요. -
PlanetKitJoinConferenceSettingBuilder
의withCallKitSettingsKey()
에 인스턴스를 전달하고 설정 정보를 만드세요.// Code for Step 1 and Step 2
func createJoinConferenceSettingsWithUserCallKitExample() -> [String: Any] {
let callKitSetting = PlanetKitCallKitSetting(type: .user, param: nil)
var settingsBuilder = try! PlanetKitJoinConferenceSettingBuilder().withCallKitSettingsKey(setting: callKitSetting)
let joinConferenceSettings = settingsBuilder.build()
} -
CXProviderDelegate
의provider(_:didActivate:)
에서PlanetKitConference
의notifyCallKitAudioActivation()
을 호출하세요.// Code for Step 3
extension YourCallKitHandler : CXProviderDelegate {
...
func provider(_ provider: CXProvider, didActivate audioSession: AVAudioSession) {
// PlanetKitConference instance created from PlanetKitManager.joinConference()
conference.notifyCallKitAudioActivation()
}
...
}
상세한 정보는 CallKit 문서를 참고하세요.