1대1 음성 통화
1대1 음성 통화를 구현하는 예제 코드입니다.
필수 조건
시작하기 전에 다음 작업을 수행해야 합니다.
- PlanetKit을 초기화하세요.
- 적절한 액세스 토큰을 획득하세요.
- 1대1 통화 흐름에서 전반적인 API 사용 과정을 확인하세요.
1대1 음성 통화 구현 시 고려 사항
착신자 측에서 통화 알림을 받으려면, 알림용 시스템을 구현하거나 APNs(Apple Push Notification service) 또는 FCM(Firebase Cloud Messaging) 같은 외부 푸시 알림 시스템을 연동해야 합니다.
또한 착신자에게 어떤 정보를 전달해야 하는지도 알아야 합니다. 앱 서버의 역할에서 애플리케이션이 전달해야 하는 데이터인 cc_param
에 관해 볼 수 있습니다.
makeCall()
또는 verifyCall()
을 호출한 다음에는 반환된 PlanetKitMakeCallResult
또는 PlanetKitVerifyCallResult
의 reason
속성을 확인해야 합니다.
reason
이PlanetKitStartFailReason.NONE
인 경우 성공을 의미합니다.- 그렇지 않으면 실패를 의미하며
reason
에 따라 적절한 조치를 취해야 합니다.
장치 권한 요청
Dart permission_handler 패키지를 사용하여 전화 및 마이크 권한을 요청하세요.
import 'package:permission_handler/permission_handler.dart';
final status = await [Permission.microphone, Permission.phone, Permission.bluetoothConnect].request();
변수 준비
주요 속성 및 이벤트 핸들러에 대한 변수를 준비합니다.
PlanetKitCallEventHandler
는 1대1 통화의 상태 변경 이벤트를 처리하는 데 사용됩니다. 자세한 내용은 1대1 통화 흐름을 참조하세요.PlanetKitMyMediaStatusHandler
는 로컬 사용자의 미디어 상태 변경 이벤트를 처리하는 데 사용됩니다. 마이크가 음 소거되거나 음 소거 해제되는 경우, 또는 오디오 설명이 업데이트되는 경우 등 이벤트를 기반으로 로컬 사용자의 UI를 업데이트할 수 있습니다.
final String _myUserId = "test user id";
final String _serviceId = "test service id";
PlanetKitCall? _call;
final _eventHandler = PlanetKitCallEventHandler(
onWaitConnected: (call) => print("wait connected"),
onVerified: (call, peerUseResponderPreparation) => print("verified"),
onConnected: (call, isInResponderPreparation, shouldFinishPreparation) => print("connected"),
onDisconnected: (call, reason, source, byRemote) => print("disconnected $reason"));
final _myMediaStatusHandler = PlanetKitMyMediaStatusHandler(
onMicMute: (status) => print("mic muted"),
onMicUnmute: (status) => print("mic unmuted"),
onAudioDescriptionUpdate: (status, averageVolumeLevel) => print("audio description updated"));
통화 생성(발신 측)
통화를 생성하려면 PlanetKitMakeCallParamBuilder()
를 사용해 PlanetKitMakeCallParam
를 만들어 이를 인자로 PlanetKitManager.instance.makeCall()
을 호출하세요.
Future<bool> makeCall(String peerId, String accessToken) async {
final builder = PlanetKitMakeCallParamBuilder()
.setMyUserId(_myUserId)
.setMyServiceId(_serviceId)
.setPeerUserId(peerId)
.setPeerServiceId(_serviceId)
.setAccessToken(accessToken);
PlanetKitMakeCallParam? param;
try {
param = builder.build();
} catch (error) {
print("failed to build make call param $error");
return false;
}
final result = await PlanetKitManager.instance.makeCall(param, _eventHandler);
if (result.reason != PlanetKitStartFailReason.none) {
print("make call failed. reason: $result.reason");
return false;
}
// Store call instance and set MyMediaStatusHandler.
_call = result.call;
_call?.myMediaStatus.setHandler(_myMediaStatusHandler);
return true;
}
통화 수신(착신 측)
앱 서버로부터 푸시 메시지를 받으면 메시지로부터 cc_param
을 파싱하여 ccParam
을 생성해야 합니다. 이 데이터는 통화를 수신할 때 전달해야 하는 필수 인자입니다.
통화를 수신하려면 적절한 PlanetKitVerifyCallParam
과 함께 PlanetKitManager.instance.verifyCall()
을 호출하세요. PlanetKitVerifyCallParam
을 만들려면 PlanetKitVerifyCallParamBuilder()
를 사용하세요.
Future<bool> verifyCall(String ccParamString) async {
final ccParam = await PlanetKitCcParam.createCcParam(ccParamString);
if (ccParam == null) {
print("failed to create ccparam string $ccParamString");
return false;
}
final builder = PlanetKitVerifyCallParamBuilder()
.setMyUserId(_myUserId)
.setMyServiceId(_serviceId)
.setCcParam(ccParam);
PlanetKitVerifyCallParam? param;
try {
param = builder.build();
} catch (error) {
print("failed to build verify call param $error");
return false;
}
final result =
await PlanetKitManager.instance.verifyCall(param, _eventHandler);
if (result.reason != PlanetKitStartFailReason.none) {
print("make call result $result.reason");
return false;
}
// Store call instance and set MyMediaStatusHandler.
_call = result.call;
_call?.myMediaStatus.setHandler(_myMediaStatusHandler);
return true;
}
통화 응답(착신 측)
일반적으로 통화를 수신한 후 통화를 받을 것인지 아닌지 결정할 시간이 필요합니다. 통화에 응답하려면 PlanetKitCall.acceptCall()
을 호출하세요.
_call
변수는 verifyCall()
에서 검증을 마친 PlanetKit
인스턴스입니다.
Future<void> acceptCall() async {
return await _call?.acceptCall() ?? false;
}
통화 종료
통화를 종료하려면 endCall()
을 호출하세요.
Future<bool> endCall() async {
return await _call?.endCall() ?? false;
}
CallKit 연동을 위한 추가 구현(선택 사항)
이 단계는 iOS 애플리케이션에만 적용됩니다.
CallKit 프레임워크를 사용하는 경우 PlanetKitMakeCallParam
및 PlanetKitVerifyCallParam
에서 callKitType
을 PlanetKitCallKitType.user
로 설정해야 합니다.
그런 다음 CXProviderDelegate.provider(_ provider: CXProvider, didActivate audioSession: AVAudioSession)
에서 PlanetKitCall.notifyCallKitAudioActivation()
을 호출하여 PlanetKit에서 오디오가 활성화되도록 해야 합니다.