모범 사례: Azure Communication Services 통화 SDK
이 문서에서는 SDK를 호출하는 Azure Communication Services와 관련된 모범 사례에 대한 정보를 제공합니다.
Azure Communication Services Calling Web SDK에 대한 모범 사례
이 섹션에서는 음성 및 영상 통화를 위한 Azure Communication Services 통화 웹(JavaScript) SDK와 관련된 모범 사례에 대한 정보를 제공합니다.
통화가 진행 중일 때 마이크를 연결하거나 디바이스 관리자에서 마이크 사용
Azure Communication Services 통화가 시작될 때 마이크를 사용할 수 없지만 나중에 마이크를 사용할 수 있게 되면 변경으로 인해 noMicrophoneDevicesEnumerated
진단 이벤트가 발생합니다. 해당 이벤트가 발생하면 애플리케이션은 askDevicePermission
을 호출하여 사용자 동의를 가져와 디바이스를 열거해야 합니다. 그러면 사용자는 마이크를 음소거하거나 음소거 해제할 수 있습니다.
VideoStreamRendererView 삭제
Communication Services 애플리케이션은 더 이상 필요하지 않을 때 VideoStreamRendererView
또는 상위 VideoStreamRenderer
인스턴스를 삭제해야 합니다.
onbeforeunload 이벤트에서 통화 중단
애플리케이션은 onbeforeunload
이벤트가 발생할 때 call.hangup
을 호출해야 합니다.
여러 탭에서 여러 통화 처리
사용자의 애플리케이션은 모바일 디바이스에서 여러 브라우저 탭에서 동시에 통화에 연결되면 안 됩니다. 이러한 상황은 디바이스의 마이크와 카메라에 대한 리소스 할당으로 인해 정의되지 않은 동작이 발생할 수 있습니다. 개발자는 새로운 통화를 시작하기 전에 백그라운드에서 통화가 완료되면 항상 통화를 끊는 것이 좋습니다.
전화가 오면 OS가 통화를 음소거하도록 처리
Azure Communication Services 통화(iOS와 Android 모두) 중에 전화가 오거나 음성 도우미가 활성화되면 OS가 자동으로 사용자의 마이크와 카메라를 음소거합니다. Android에서는 전화 통화가 종료된 후 자동으로 통화 음소거가 해제되고 동영상이 다시 시작됩니다. iOS에서는 동영상 음소거를 해제하고 다시 시작하려면 사용자 작업이 필요합니다.
microphoneMuteUnexpectedly
의 품질 이벤트를 사용하면 마이크가 예기치 않게 음소거되었다는 알림을 받을 수 있습니다. 통화에 제대로 다시 참가하려면 SDK 1.2.3-beta.1 이상을 사용해야 합니다.
const latestMediaDiagnostic = call.api(SDK.Features.Diagnostics).media.getLatest();
const isIosSafari = (getOS() === OSName.ios) && (getPlatformName() === BrowserName.safari);
if (isIosSafari && latestMediaDiagnostic.microphoneMuteUnexpectedly && latestMediaDiagnostic.microphoneMuteUnexpectedly.value) {
// received a QualityEvent on iOS that the microphone was unexpectedly muted - notify user to unmute their microphone and to start their video stream
}
애플리케이션은 call.startVideo(localVideoStream);
을 호출하여 동영상 스트림을 시작하고 this.currentCall.unmute();
를 사용하여 오디오 음소거를 해제해야 합니다.
디바이스 관리
Azure Communication Services SDK를 사용하여 디바이스 및 미디어 작업을 관리할 수 있습니다.
애플리케이션은 SDK 외부에서 스트리밍을 획득하기 위해 getUserMedia
또는 getDisplayMedia
와 같은 기본 브라우저 API를 사용해서는 안 됩니다. 그렇게 하면 Communication Services SDK를 통해 DeviceManager
또는 기타 디바이스 관리 API를 사용하기 전에 미디어 스트림을 수동으로 삭제해야 합니다.
디바이스 권한 요청
SDK를 사용하여 디바이스 권한을 요청할 수 있습니다. 애플리케이션은 DeviceManager.askDevicePermission
을 사용하여 오디오 및/또는 동영상 디바이스에 대한 액세스를 요청해야 합니다.
사용자가 액세스를 거부하면 DeviceManager.askDevicePermission
은 페이지가 새로 고쳐진 후에도 후속 통화에서 특정 디바이스 유형(오디오 또는 동영상)에 대해 false
를 반환합니다. 이 시나리오에서 사용자의 애플리케이션은 다음과 같아야 합니다.
- 사용자가 이전에 액세스를 거부했음을 검색합니다.
- 사용자에게 특정 디바이스 유형에 대한 액세스를 수동으로 다시 설정하거나 명시적으로 부여하도록 지시합니다.
다른 프로세스가 사용 중인 카메라의 동작 관리
Windows Chrome 및 Windows Microsoft Edge의 경우: 동영상을 켠 상태에서 통화를 시작하거나, 통화에 참가 또는 수락하고 웹 SDK가 실행되는 브라우저가 아닌 다른 프로세스에서 카메라 디바이스를 사용하는 경우 통화는 오디오만 재생되고 동영상은 재생되지 않습니다. 카메라가 시작되지 않았기 때문에
cameraStartFailed
사용자 대상 진단 플래그가 발생합니다.통화 중에 동영상을 켜는 경우에도 동일한 상황이 적용됩니다. 다른 프로세스에서 카메라를 끄면 해당 프로세스에서 카메라 디바이스가 해제되고, 그런 다음 통화에서 다시 동영상을 시작할 수 있습니다. 그러면 통화 중에 동영상이 켜지고, 원격 참석자가 동영상을 볼 수 있게 됩니다.
이 문제는 해당 OS에서 프로세스와 스레드가 카메라 디바이스를 공유할 수 있으므로 macOS Chrome이나 macOS Safari에서는 발생하지 않습니다.
모바일 디바이스: ProcessB가 카메라 디바이스를 사용하는 동안 ProcessA가 카메라 디바이스를 요청하면, ProcessA는 카메라 디바이스를 넘겨받고 ProcessB는 카메라 디바이스 사용을 중단합니다.
iOS Safari: 동일한 탭이나 여러 탭에 있는 여러 통화 클라이언트의 카메라를 켤 수 없습니다. 통화 클라이언트가 카메라를 사용하면 이전 통화 클라이언트에서 사용 중인 해당 카메라를 넘겨받습니다. 이전 통화 클라이언트는
cameraStoppedUnexpectedly
사용자 대상 진단 플래그를 가져옵니다.
화면 공유 관리
애플리케이션을 닫아도 공유가 중단되지 않음
예를 들어, Chromium에서 Microsoft Teams 애플리케이션의 화면을 공유한다고 가정해 보겠습니다. 그런 다음 Teams 애플리케이션에서 X" 단추를 선택하여 닫습니다. 창은 닫혀 있지만 Teams 애플리케이션은 백그라운드에서 계속 실행됩니다. 해당 아이콘이 여전히 바탕 화면 작업 표시줄에 나타납니다. Teams 애플리케이션이 계속 실행 중이므로 원격 참여자와 화면이 계속 공유됩니다.
애플리케이션의 화면 공유를 중지하려면 다음 작업 중 하나를 수행해야 합니다.
- 바탕 화면 작업 표시줄에서 애플리케이션 아이콘을 마우스 오른쪽 단추로 클릭한 다음 종료를 선택합니다.
- 브라우저에서 공유 중지 단추를 선택합니다.
- SDK의
Call.stopScreenSharing()
API 작업을 호출합니다.
Safari는 전체 화면 공유만 가능
Safari에서는 전체 화면에 대한 화면 공유만 허용됩니다. 이러한 동작은 전체 화면, 특정 데스크톱 앱 또는 특정 브라우저 탭의 화면을 공유할 수 있는 Chromium과는 다릅니다.
macOS에서 화면 공유 권한을 부여할 수 있음
macOS Safari 또는 macOS Chrome에서 화면을 공유하려면 OS 메뉴에서 브라우저에 필요한 권한을 부여합니다. 시스템 환경 설정>보안 및 개인 정보 보호>화면 기록.
Azure Communication Services 통화 네이티브 SDK에 대한 모범 사례
이 섹션에서는 음성 및 영상 통화를 위한 Azure Communication Services Calling Native SDK와 관련된 모범 사례에 대한 정보를 제공합니다.
지원되는 플랫폼
통화 네이티브 SDK의 최적 기능을 보장하기 위한 최소 OS 플랫폼 요구 사항은 다음과 같습니다.
앱 요청에 대한 디바이스 권한 확인
통화 네이티브 SDK를 사용하여 전화를 걸거나 받으려면 소비자는 각 플랫폼이 디바이스 리소스에 액세스할 수 있도록 권한을 부여해야 합니다. 개발자는 사용자에게 액세스 권한을 묻고 권한이 사용하도록 설정되어 있는지 확인해야 합니다. 소비자는 이러한 액세스 권한을 권한 부여하므로 현재 필요한 권한이 있는지 확인합니다.
로그 구성
로그 파일 검색에 대한 자습서에 설명된 대로 로깅을 구현하는 것이 그 어느 때보다 중요합니다. 자세한 로그는 최소 SDK 기준을 충족하는 디바이스 모델이나 OS 버전과 관련된 문제를 진단하는 데 도움이 됩니다. 개발자에게는 Logs API를 사용하여 로그를 구성하는 것이 좋습니다. 로그가 없으면 Microsoft 지원 팀은 통화에 대한 디버깅 및 문제 해결을 도울 수 없습니다.
CallID 추적
CallID
는 통화의 고유 ID입니다. 단일 통화 중에 연결되는 모든 참가자와 엔드포인트의 상관 관계가 있는 이벤트를 식별합니다. 대부분의 경우, 이를 사용하여 로그를 검토합니다. Microsoft 지원 팀에서는 통화 문제 해결에 도움을 요청합니다.
앱에서 구성한 원격 분석에서 CallID
값을 추적해야 합니다. 각 플랫폼에 대한 값을 검색하는 방법을 알아보려면 문제 해결 가이드의 지침을 따릅니다.
사용자 대상 진단 및 미디어 품질 통계 구독
Azure Communication Services의 다음 기능을 사용하면 사용자 환경을 개선하는 데 도움이 됩니다.
- 사용자 대상 진단: 통화 속성을 검사하여 고객에게 영향을 미치는 문제의 원인을 파악합니다.
- 미디어 품질 통계: 수신 및 발신 통화 메트릭에 대한 낮은 수준의 오디오, 동영상 및 화면 공유 품질 메트릭을 조사합니다. 통화가 끝난 후 데이터를 수집하여 파이프라인 수집으로 보내는 것이 좋습니다.
오류 처리 관리
통화 또는 구현 중에 오류가 발생하면 해당 메서드는 오류 코드가 포함된 오류 개체를 반환합니다. 적절한 오류 처리와 경고 표시를 위해서는 이러한 오류 개체를 사용해야 합니다. 통화 상태는 통화 실패 원인을 식별하는 데 도움이 되는 오류 코드도 반환합니다. 문제를 해결하려면 문제 해결 가이드를 참조하세요.
동영상 스트림 관리
UI가 더 이상 동영상을 표시하지 않으면 VideoStreamRendererView
를 삭제해야 합니다. VideoStreamType
을 사용하여 스트림 형식을 확인합니다.
일반 메모리 관리 수행
리소스 미리 할당. 요청 시가 아닌 앱 시작 단계에서 통화 클라이언트와 필요한 리소스를 초기화합니다. 이 방식은 통화 시작 시 대기 시간을 줄여줍니다.
올바르게 삭제. 시스템 리소스를 확보하고 메모리 누수를 방지하려면 사용 후 모든 통화 개체를 삭제합니다. 메모리 누수를 일으킬 수 있는 이벤트 구독을 취소합니다.
프로세스가 카메라 또는 마이크에 액세스하는 방식 고려
모바일 디바이스에서 여러 프로세스가 동시에 카메라나 마이크에 액세스하려고 하면, 먼저 액세스를 요청한 프로세스가 디바이스를 제어하게 됩니다. 결과적으로 두 번째 프로세스는 즉시 해당 정보에 액세스할 수 없게 됩니다.
라이브러리 크기 최적화
소프트웨어 개발에서 라이브러리 크기를 최적화하는 것은 다음과 같은 이유로 매우 중요합니다. 특히 애플리케이션이 더욱 복잡해지고 리소스 집약적이 되기 때문입니다.
애플리케이션 성능: 라이브러리가 작을수록 애플리케이션이 로드, 구문 분석, 실행해야 하는 코드 양이 줄어듭니다. 이러한 감소는 특히 리소스가 제한된 디바이스에서 애플리케이션의 작동 시간과 전반적인 성능을 크게 향상시킬 수 있습니다.
메모리 사용량: 라이브러리 크기를 최소화하면 애플리케이션의 런타임 메모리 공간을 줄일 수 있습니다. 이러한 감소는 메모리가 종종 제한되는 모바일 디바이스에 중요합니다. 메모리 사용량이 낮을수록 시스템 크래시가 줄어들고 멀티태스킹 성능이 향상됩니다.
자세한 내용은 다음을 참조하세요.