정보
요청한 주제가 아래에 표시됩니다. 그러나 이 주제는 이 라이브러리에 포함되지 않습니다.

Windows Phone 8용 VoIP 앱

2014-06-18

적용 대상: Windows Phone 8 및 Windows Phone Silverlight 8.1만

 

Windows Phone 8 에서는 VoIP(Voice over IP)를 구현하고, 사용자가 휴대폰의 네트워크 연결을 통해 화상 통화나 음성 통화를 할 수 있도록 해 주는 앱을 만들 수 있습니다. 사용자가 여러분의 VoIP 앱을 설치하면 앱이 다른 앱처럼 사용자의 앱 목록에 표시됩니다. 하지만 수신 전화가 VoIP 앱으로 도착하면 기본 제공 전화 환경이 표시되고 VoIP 앱이 휴대폰에 통합된 채 표시됩니다.

참고참고:

VoIP를 사용하려면 앱 매니페스트에서 ID_CAP_VOIP 기능을 설정해야 합니다. 이 기능을 설정하지 않을 경우 앱이 제대로 작동하지 않을 수 있습니다. 자세한 내용은 Windows Phone 8의 앱 기능 및 하드웨어 요구 사항을 참조하세요.

새 프로젝트를 시작하기 전에 모든 Windows Phone 앱과 함께 적용 가능한 인증 요구 사항을 검토해야 합니다. VoIP 앱 관련 요구 사항에 대해서는 Windows Phone의 특정 앱 유형에 대한 추가 요구 사항을 참조하세요.

이 항목에는 다음 단원이 포함되어 있습니다.

 

Windows Phone VoIP 앱은 두 개의 프로세스 중 하나에서 실행되는 몇 개의 구성 요소와 모든 프로세스의 외부에서 실행되는 한 구성 요소로 되어 있습니다. 첫 번째 프로세스는 앱 UI를 표시하는 포그라운드 프로세스입니다. 두 번째 프로세스는 전화 걸기, 연결, 수신 통화 및 발신 통화 관리 등 대부분의 작업을 하는 백그라운드 프로세스입니다. 다음 다이어그램에서는 VoIP 앱의 구성 요소를 보여 줍니다.

VoIP app architecture

다음 목록에는 각 VoIP 앱 구성 요소의 요약 설명이 나와 있습니다.

  • 포그라운드 앱

    앱을 위한 UI를 제공하는 구성 요소입니다. 다른 Windows Phone 앱처럼 휴대폰 앱 목록에 나타나며 시작 화면에 앱 타일로 고정할 수 있습니다. 이 구성 요소는 다른 모든 앱처럼 마찬가지로 포그라운드 프로세스로 실행됩니다. 이 포그라운드 앱은 UI 제공 이외에 수신 통화가 도착하는 푸시 알림 채널도 설정합니다. 또한 백그라운드 프로세스를 시작하고, 통화를 끝내도록 요청하는 것처럼, out-of-process 서버를 사용하여 백그라운드에서 구성 요소에 명령을 전달합니다.

  • Out-of-Process 서버

    포그라운드 앱과 백그라운드 구성 요소가 프로세스 간에 통신하는 데 사용하는 서버입니다.

  • 백그라운드 에이전트

    VoIP 앱이 사용하는 네 개의 백그라운드 에이전트입니다. 이 에이전트는 관리 코드를 사용하여 작성되고 실행되어 VoIP 통화의 새로운 단계가 시작되었음을 나타냅니다. 일반적으로 이 에이전트는 코드를 매우 적게 사용하며, 호출의 상태를 대부분의 작업을 수행하는 다음 구성 요소들 중 하나로 전달합니다.

    • VoipHttpIncomingCallTask. 푸시 알림 채널에서 새로운 수신 전화가 도착하면 실행됩니다. Windows Phone Runtime 어셈블리에 새로운 호출을 작성해야 함을 알려 줍니다.

    • VoipForegroundLifetimeAgent. 앱이 포그라운드에 있는 한 포그라운드 앱으로 시작되어 실행됩니다. 백그라운드 프로세스를 부트스트랩하며, 신속히 전화를 걸도록 프로세스를 활성 상태로 유지합니다.

    • VoipCallInProgressAgent. 통화가 활성화되면 시작됩니다. 오디오 및 동영상을 인코딩 및 디코딩할 수 있도록 더 많은 CPU 사이클을 할당했다는 신호를 앱에 보냅니다.

    • VoipKeepAliveTask. 포그라운드 앱이 실행 중인지 여부에 상관없이 주기적으로 실행되며, 기본 주기는 6시간입니다. 앱이 VoIP 서비스에 대한 ping을 수행하여 앱이 여전히 단말기에 설치되어 있음을 나타낼 수 있도록 합니다. 사용자가 이 앱을 제거하면 이 에이전트는 더 이상 실행되지 않고, 서비스는 앱의 푸시 알림 채널에서 수신 전화를 보내지 않음을 알 수 있습니다.

  • Windows Phone Runtime 어셈블리

    VoipCallCoordinatorVoipPhoneCall 개체를 사용하여 VoIP 통화를 연결 및 관리하는 작업의 대부분을 수행하는 어셈블리입니다. 관리 어셈블리가 아니라 Windows Phone Runtime 어셈블리이므로 네이티브 API를 호출하여 오디오 및 동영상 처리에 사용할 수 있습니다.

  • 네이티브 핵심 어셈블리

    많은 VoIP 앱 개발자들이 여러 플랫폼을 지원하며, 종종 C 또는 C++로 작성된 핵심 라이브러리를 가지고 있습니다. Windows Phone VoIP 앱에서 라이브러리를 사용하여 코드 재사용을 지원하고 앱 개발을 가속할 수 있습니다.

  • VoIP 클라우드 서비스

    원격으로 실행되는 VoIP 서비스입니다.

  1. 사용자가 처음 VoIP 앱을 시작하면 푸시 알림 채널이 만들어집니다. 푸시 알림 채널 설정에 대한 자세한 내용은 Windows Phone 8의 푸시 알림을 참조하세요.

  2. 새 수신 전화를 시작하기 위해, VoIP 클라우드 서비스에서는 푸시 알림을 앱의 푸시 알림 채널을 위한 URI에 보냅니다.

  3. 운영 체제는 앱의 VoipHttpIncomingCallTask 에이전트를 시작합니다.

    수신 전화 에이전트가 실행 중일 때:

    1. 수신 전화 에이전트가 아직 앱의 Windows Phone Runtime 어셈블리를 로드하지 않은 경우 로드합니다.

    2. 수신 전화 에이전트는 MessageBody 속성에서 푸시 알림 페이로드를 가져온 다음 Windows Phone Runtime 어셈블리로 전달하여 OnIncomingCallReceived 같은 이름의 사용자 지정 메서드를 호출합니다.

    3. OnIncomingCallReceived에서 Windows Phone Runtime 어셈블리 VoipCallCoordinator.RequestNewIncomingCall은 발신자 측 이름과 발신자 연락처 사진의 URI와 같은 푸시 알림 페이로드에서 정보를 전달합니다. 이 정보로 휴대폰에 기본 제공 휴대폰 UI가 표시됩니다.

    4. VoipCallCoordinator.RequestNewIncomingCall 메서드는 요청된 호출을 나타내는 VoipPhoneCall 개체를 반환합니다. 작성한 Windows Phone Runtime 어셈블리는 다른 메서드에서 사용할 수 있도록 이 개체를 저장한 다음 호출 개체의 AnswerRequestedRejectRequested 이벤트용 처리기를 등록해야 합니다.

    5. AnswerRequested 이벤트 처리기에서, 호출에 대한 청구가 시작되어야 함을 나타내는 등의 새로운 호출이 시작되었다는 것을 알려 주는 클라우드 서비스에 접속할 수 있습니다. 그런 다음 NotifyCallActive를 호출하여 시스템에게 지금 호출이 활성화 상태임을 알려야 합니다.

    6. RejectRequested 이벤트 처리기를 호출하는 경우, 호출이 거부되었음을 알고, VoIP 백그라운드 에이전트들 중 하나가 여전히 실행되고 있지 않다고 가정하고 운영 체제가 프로세스를 종료하기 전에 10초 동안 모든 리소스를 지웁니다.

  4. NotifyCallActive를 호출하면 VoipCallInProgressAgent가 시작됩니다. 이 에이전트가 실행되면 백그라운드 프로세스가 오디오 인코딩 및 디코딩를 위한 CPU를 더 많이 할당 받았다는 것입니다. VoipCallInProgressAgent가 실행 중인 동안 다음 작업을 수행하세요.

    1. 아직 Windows Phone Runtime 어셈블리를 로드하지 않은 경우 로드합니다.

    2. Windows Phone Runtime 어셈블리에서 이 작업을 아직 수행하지 않았다면 MuteRequested, UnmuteRequestedAudioEndpointChanged 이벤트용 처리기를 등록합니다.

    3. 수신 전화 에이전트를 실행하는 동안 저장한 VoipPhoneCall 개체의 .EndRequested, HoldRequested, ResumeRequested 이벤트에 대한 이벤트 처리기를 등록합니다. 원하는 경우 개체를 먼저 만들면 모든 VoipPhoneCall 이벤트에 대해 등록할 수 있습니다.

    4. 들어오는 동영상 스트림을 포그라운드 앱의 MediaElement에 후크합니다. 동영상 스트림 설정에 대한 연습은 Windows Phone 8의 VoIP 호출에 대해 동영상 스트리밍을 구현하는 방법을 참조하세요.

    5. Windows Phone Runtime 어셈블리에서 HoldRequested 또는 ResumeRequested와 같은 통화 중에 변경 사항 이벤트가 수신되면 동영상 스트림을 일시 중단하거나 다시 시작하는 등의 적절한 조치를 취하세요.

    6. 사용자가 통화를 끝내려고 UI의 버튼을 누르면 포그라운드 앱이 Windows Phone Runtime 어셈블리에서 호출 개체를 null로 설정하는 메서드를 호출한 다음 NotifyCallEnded를 호출합니다. 사용자가 다른 VoIP 앱에서 VoIP 통화에 응답하는 경우 또는 사용자가 이미 휴대폰 통화 및 VoIP 통화 중일 때 두 번째 휴대폰 통화에 응답하는 경우처럼 운영 체제에서 통화를 종료하면 발생되는 EndRequested에서도 이 작업을 수행해야 합니다.

  1. 포그라운드 앱이 시작되면

    1. Launch()를 호출하여 백그라운드 프로세스를 시작합니다. 이것으로 작성자의 앱에 대한 백그라운드 프로세스가 생성되고 VoipForegroundLifetimeAgent 에이전트의 OnLaunched() 메서드가 호출됩니다. 포그라운드 수명 에이전트는 앱이 포그라운드로 실행되는 한 계속 활성화되어 있게 됩니다.

    2. VoipForegroundLifetimeAgent에서 아직 Windows Phone Runtime 어셈블리를 로드하지 않은 경우 로드하세요.

    3. 사용자 지정 이벤트를 사용하여 포그라운드 앱에 백그라운드 프로세스가 대기 중이고, 모든 어셈블리가 로드되었음을 알립니다. 그런 다음 포그라운드 앱에서 Windows Phone Runtime 어셈블리에 대한 참조를 만듭니다.

  2. 사용자가 통화할 연락처를 선택하고 작성자의 앱에서 통화 버튼을 누르면

    1. MakeOutgoingCall과 같은 Windows Phone Runtime 어셈블리의 사용자 지정 메서드를 호출합니다.

    2. MakeOutgoingCall에서 RequestNewOutgoingCall 메서드를 호출한 다음 통화가 음성만 사용하든지 아니면 음성과 영상을 사용하든지 간에 전화를 받는 사람의 이름이 최소화된 휴대폰 UI에 표시될 수 있도록 이름을 누릅니다.

  3. RequestNewOutgoingCall 메서드는 요청한 통화를 나타내는 VoipPhoneCall 개체를 반환합니다. 작성한 Windows Phone Runtime 어셈블리는 다른 메서드에서 사용할 수 있도록 이 개체를 저장한 다음 호출 개체의 AnswerRequestedRejectRequested 이벤트용 처리기를 등록해야 합니다.

  4. 그런 다음 NotifyCallActive를 호출하여 시스템에게 지금 호출이 활성화 상태임을 알려야 합니다.

  5. VoipCallInProgressAgent가 시작됩니다. 이 에이전트가 실행되면 백그라운드 프로세스가 오디오 인코딩 및 디코딩를 위한 CPU를 더 많이 할당 받았다는 것입니다. VoipCallInProgressAgent가 실행 되는 동안

    1. 아직 Windows Phone Runtime 어셈블리를 로드하지 않은 경우 로드합니다.

    2. Windows Phone Runtime 어셈블리에서 이 작업을 아직 수행하지 않았다면 MuteRequested, UnmuteRequestedAudioEndpointChanged 이벤트용 처리기를 등록합니다.

    3. 수신 전화 에이전트를 실행하는 동안 저장한 VoipPhoneCall 개체의 EndRequested, HoldRequested, ResumeRequested 이벤트에 대한 이벤트 처리기를 등록합니다. 원하는 경우 개체를 먼저 만들면 모든 VoipPhoneCall 이벤트에 대해 등록할 수 있습니다.

    4. 들어오는 동영상 스트림을 포그라운드 앱의 MediaElement에 후크합니다. 동영상 스트림 설정에 대한 연습은 Windows Phone 8의 VoIP 호출에 대해 동영상 스트리밍을 구현하는 방법을 참조하세요.

    5. 사용자가 통화를 끝내려고 UI의 버튼을 누르면 포그라운드 앱이 Windows Phone Runtime 어셈블리에서 호출 개체를 null로 설정하는 메서드를 호출한 다음 NotifyCallEnded를 호출합니다. 사용자가 다른 VoIP 앱에서 VoIP 통화에 응답하는 경우 또는 사용자가 이미 휴대폰 통화 및 VoIP 통화 중일 때 두 번째 휴대폰 통화에 응답하는 경우처럼 운영 체제에서 통화를 종료하면 발생되는 EndRequested에서도 이 작업을 수행해야 합니다.

VoIP API 사용을 보여 주고 루프백 오디오 및 동영상을 사용하여 수신 및 발신 VoIP 통화를 시뮬레이트하는 VoIP 샘플 앱을 보려면 ChatterBox VoIP 샘플 앱을 참조하세요.

표시: