[swift] CallKit과 VoIP(Internet Protocol)-(IP-)기반 통화

iOS에서 VoIP 통화를 개발하고 싶다면 Apple의 CallKit 프레임워크를 활용하여 구현할 수 있다. CallKit은 앱을 기본 통화 앱처럼 작동하게 하며, iOS의 UI와 기능을 이용하여 전화 기능을 제공하는 프레임워크이다.

CallKit의 기능

CallKit을 이용하면 다음과 같은 기능을 구현할 수 있다:

CallKit의 구현 방법

1. CallKit을 통한 Caller ID 통화 표시

CallKit은 VoIP 통화 시에도 통화 화면을 표시할 수 있는 Caller ID 기능을 제공한다. VoIP 통화 시에는 CallKit 프레임워크를 이용하여 incoming call을 표시할 수 있으며, 사용자는 이를 통해 전화를 받거나 거절할 수 있다.

import CallKit

let provider = CXProvider(configuration: CXProviderConfiguration(localizedName: "내 앱 이름"))
provider.setDelegate(self, queue: nil)

let update = CXCallUpdate()
update.remoteHandle = CXHandle(type: .generic, value: "전화번호")
provider.reportIncomingCall(with: UUID(), update: update, completion: { error in })

2. CallKit을 통한 통화 UI 표시

CallKit을 이용하면 앱의 사용자 인터페이스에 통화 알림을 표시할 수 있다. 이를 통해 사용자는 통화를 받거나 거절할 수 있으며, 통화 상태에 따른 UI 업데이트도 가능하다.

func provider(_ provider: CXProvider, perform action: CXAnswerCallAction) {
    // 통화 받기 동작 수행
    action.fulfill()
}

func provider(_ provider: CXProvider, perform action: CXEndCallAction) {
    // 통화 종료 동작 수행
    action.fulfill()
}

3. CallKit을 통한 통화 기록 저장

CallKit은 통화 기록을 저장하고 편집하는 기능도 제공한다. 이를 통해 사용자는 앱 내에서 통화 기록을 확인하고 관리할 수 있다.

let controller = CXCallObserver()

controller.setDelegate(self, queue: nil)

func callObserver(_ callObserver: CXCallObserver, callChanged call: CXCall) {
    if call.hasEnded {
        // 통화 종료 시 동작 수행
    } else if call.isOutgoing {
        // 아웃고잉 콜 시 동작 수행
    } else if call.isOnHold {
        // 홀드된 콜 시 동작 수행
    }
}

CallKit의 장점

이러한 기능을 활용하여 VoIP 통화를 개발할 때, CallKit을 이용하여 iOS에서 제공하는 기본 통화 기능을 사용자에게 제공할 수 있다.

참고문헌: