본문으로 건너뛰기
Version: 6.1

그룹 영상 통화 시작하기

PlanetKit을 사용하면 1대1 통화 또는 그룹 통화를 위한 음성 및 영상 통화 기능을 앱에 연동할 수 있습니다. 이 가이드에서는 iOS 앱에서 그룹 영상 통화 구현을 시작하는 방법을 설명합니다.

Note

더욱 빠른 개발을 위해 빠른 시작을 기반으로 앱을 구현할 수 있습니다.

필수 조건

프로젝트 생성

Xcode를 열고 아래와 같이 새 프로젝트를 만드세요.

  1. [Welcome to Xcode] 창에서 [Create a new Xcode Project]를 클릭하세요.
  2. [iOS] 탭에서 [App]을 선택하고 [Next]를 클릭하세요.
  3. 프로젝트 생성 창에서 아래와 같이 설정하세요.
    1. [Product Name] 필드에 제품 이름을 입력하세요.
    2. [Team] 필드에서 개발 팀을 선택하세요.
    3. [Organization Identifier] 필드에 조직 식별자를 입력하세요.
    4. [Interface] 필드에서 [Storyboard]를 선택하세요.
    5. [Next]를 클릭하세요. iOS 프로젝트 생성하기
  4. 프로젝트가 생성될 위치를 선택하고 [Create]를 클릭하세요.

SDK 설치

Swift Package Manager를 통해 SDK를 설치하세요.

  1. Xcode 메뉴 바에서 [File] > [Add Packages...]를 선택하세요.
  2. [Search or Enter Package URL] 필드에 PlanetKit 저장소 URL(https://github.com/line/planet-kit-apple)을 입력하세요.
  3. [Add Package] 버튼을 클릭하세요.

시스템 권한 요청

영상 통화 기능을 활성화하려면 사용자가 앱에 마이크와 카메라 액세스 권한을 부여해야 합니다. 해당 절차가 진행되도록 NSMicrophoneUsageDescriptionNSCameraUsageDescription 키를 앱의 Info.plist 파일에 추가하세요.

info.plist 파일에 권한 키 추가하기

SDK 초기화

PlanetKit API를 호출하려면 먼저 PlanetKit을 초기화해야 합니다. PlanetKitInitialSettingBuilder 객체와 함께 PlanetKitManagerinitialize()를 사용하여 PlanetKit을 초기화하세요.

initialize()를 호출할 때 PlanetKitInitialSettingBuilder 객체에 서버 URL(planet_base_url)을 설정해야 합니다. 사용 중인 개발 환경에 따라 적절한 planet_base_url을 사용하세요.

// AppDelegate.swift

// Import PlanetKit SDK
import PlanetKit

PlanetKitManager.shared.initialize(initialSettings: PlanetKitInitialSettingBuilder()
.withSetKitServerKey(serverUrl: planet_base_url)
.build())
Note

앱에서 initialize() 메서드를 최초에 한 번 호출해야 합니다. UIApplicationDelegate를 채택하고 준수하는 AppDelegateapplication(_:didFinishLaunchingWithOptions:) 메서드에서 SDK를 초기화하는 것이 좋습니다.

액세스 토큰 획득

클라이언트 앱에서 앱 서버에 액세스 토큰 생성을 요청해 받으세요.

Note

joinConference()를 호출할 때마다 새로운 액세스 토큰을 받아서 사용해야 합니다.

그룹 영상 통화 참여

그룹 영상 통화에 참여하려면 아래 인자와 함께 PlanetKitManagerjoinConference()를 호출하세요.

  • 다음 속성을 포함하는 PlanetKitConferenceParam 객체
    • myUserId: 로컬 사용자의 사용자 ID
    • roomId: 방 ID
    • roomServiceId: 방의 서비스 ID
    • delegate: PlanetKitConferenceDelegate를 채택하고 준수하는 이벤트 대리자(delegate)
    • mediaType: 영상 통화를 위해 .audiovideo로 설정
    • accessToken: 액세스 토큰
  • 특정 CallKit 유형이 지정된 PlanetKitCallKitSetting을 사용하여 생성한 그룹 통화 입장용 설정
import PlanetKit

class YourClass {
func joinConference() {
let callKitSetting = PlanetKitCallKitSetting(type: .none, param: nil)
var settingsBuilder = PlanetKitJoinConferenceSettingBuilder().withCallKitSettingsKey(setting: callKitSetting)
let joinConferenceSettings = try! settingsBuilder.build()

let param = PlanetKitConferenceParam(myUserId: myUserId, roomId: roomId, roomServiceId: serviceId, displayName: nil, delegate: self, accessToken: accessToken)
param.mediaType = .audiovideo
let result = PlanetKitManager.shared.joinConference(param: param, settings: joinConferenceSettings)

if (result.reason == PlanetKitStartFailReason.none && result.conference != null) {
// The "result.conference" instance is the main instance to call APIs from now on.
// You must keep it to control this call.
}
else {
// Handle an error by referring to result.reason.
}
}
}

extension YourClass: 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.
}

func peersVideoDidUpdate(_ conference: PlanetKitConference, updated: PlanetKitConferenceVideoUpdateParam) {

// This is called when the video of one or more peers is updated.
// Write your own code here.

}
}
Note

사용자가 클라이언트 앱에서 그룹 통화 방에 입장하려면 방 ID가 필요하므로, 애플리케이션에서 정의한 통신 채널을 통해 방 ID를 다른 사용자와 공유해야 합니다.

로컬 사용자를 위한 비디오 뷰 추가

로컬 사용자를 위한 비디오 뷰를 추가하려면 PlanetKitMTKView(myVideoView)를 생성하고 로컬 뷰에 하위 뷰로 추가한 다음 startPreview(delegate:)를 사용하여 카메라 미리보기의 비디오 스트림 대리자로 설정하세요.

class YourViewController: UIViewController {
...

private var myVideoView: PlanetKitMTKView = {
PlanetKitMTKView(frame: .zero, device: nil)
}()

override func viewDidLoad() {
super.viewDidLoad()

view.addSubview(myVideoView)
PlanetKitCameraManager.shared.startPreview(delegate: myVideoView)
}

override func viewDidDisappear() {
super.viewDidDisappear()

PlanetKitCameraManager.shared.stopPreview(delegate: myVideoView)
}
}

피어를 위한 비디오 뷰 추가

피어를 위한 비디오 뷰를 추가하려면 PlanetKitMTKView(peerVideoView)를 생성하고 피어 뷰에 하위 뷰로 추가하세요.

class YourViewController: UIViewController {
...

private var peerVideoView: PlanetKitMTKView = {
PlanetKitMTKView(frame: .zero, device: nil)
}()

override func viewDidLoad() {
super.viewDidLoad()

view.addSubview(peerVideoView)
}
}

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

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

class YourViewController: UIViewController {
...
private var peerControl: PlanetKitPeerControl?

private func showPeerVideo(_ peerId: String) {
guard let peer = conference.getPeer(peerId: PlanetKitUserId(id: peerId, serviceId: serviceId)) else {
// Handle an error by getting a peer instance.
return
}
guard let peerControl = conference.createPeerControl(peer: peer) else {
// Handle an error by creating peer control.
return
}
self.peerControl = peerControl

peerControl.register(self) { success in
guard success else {
// Handle an error by registering peer control.
return
}
peerControl.startVideo(maxResolution: .recommended, delegate: self.peerVideoView) { success in
if !success {
// Handle an error by starting video.
}
}
}
}
}

다음 단계

아래 문서를 참조해 PlanetKit에서 제공하는 다양한 기능과 각 기능의 사용 방법을 자세히 살펴보세요.

  • 통화 흐름: 통화 유형별 통화 흐름을 살펴보세요.
  • 서브그룹: 여러 개의 하위 그룹이 있는 방이나 통역 방과 같은 고급 기능을 구현할 수 있는 서브그룹 기능을 살펴보세요.
  • 확장 기능: 화면 공유, 데이터 세션 등 다양한 확장 기능을 살펴보세요.
  • 예제 코드: 앱을 구현하는 데 참고할 수 있는 예제 코드를 확인하세요.
  • 참조 문서: API 레퍼런스, API 변경 내역, 릴리스 노트를 확인하세요.