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

Windows Phone 8용 데이터 센스 API를 사용하여 데이터 사용량을 조정하는 방법

2014-06-18

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

사용자가 제공된 데이터의 양을 거의 다 사용한 경우 데이터 사용을 줄이고, 제한을 초과한 경우 데이터 사용을 중단하거나 Wi-Fi 연결을 사용할 수 있을 때까지 데이터 전송 작업을 연기하도록 앱을 코딩할 수 있습니다.

데이터 감지 기능을 통해 사용자는 데이터 요금제 제한을 지정할 수 있습니다. 그러면 데이터 감지에서 사용자가 지정한 제한을 기준으로 데이터 사용을 모니터링합니다. 이 정보를 통해 앱은 데이터 사용을 조정하여 사용자가 비용을 절감할 수 있도록 도와줍니다.

중요중요:

통신사에서 휴대폰에 데이터 감지 앱 및 타일을 설치할지 여부는 선택 사항입니다. 따라서 앱 사용자의 휴대폰에 데이터 감지 앱이 설치되어 있지 않을 수 있습니다. 이 앱이 없으면 사용자는 제공된 데이터를 확인할 수 없습니다.

사용자가 제공된 데이터를 알 수 없는 경우 데이터 감지 API를 사용하여 사용자가 Wi-Fi 연결이나 로밍을 사용하는지 여부를 확인할 수 있습니다. 단, 데이터 감지 API를 사용하여 사용자가 제공된 데이터의 양을 거의 다 사용했는지, 또는 이를 초과했는지는 확인할 수 없습니다.

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

데이터 감지 API를 사용하는 앱에는 ID_CAP_NETWORKING 기능이 필요합니다. 이 요구 사항을 앱 매니페스트 파일에 표시합니다. 자세한 내용은 Windows Phone 8의 앱 기능 및 하드웨어 요구 사항을 참조하세요.

다음과 같은 경우 앱에서 사용자의 데이터 사용을 확인하도록 앱을 디자인합니다.

  1. 앱이 시작될 때(즉, Launching 이벤트가 발생할 때)

  2. NetworkInformation.NetworkStatusChanged 이벤트가 발생할 때, 이 이벤트는 다음과 같은 상황에서 발생합니다.

    • 연결 유형이 셀룰러 및 Wi-Fi 간 변경될 때

    • 사용자가 로밍 상태로 전환되거나 로밍 상태에서 해제된 경우

    • ApproachingDataLimit 또는 OverDataLimittrue인 경우

  3. 비활성화나 삭제 표시 지정으로 인한 일시 중지 후 앱이 다시 활성화된 경우(즉, Activated 이벤트가 발생한 경우)

  4. 경우에 따라 대량의 데이터를 전송하는 실행 기간이 긴 작업 전

일반적으로 Windows.Networking.Connectivity 네임스페이스에서 다음과 같은 클래스, 메서드 및 속성을 사용하여 앱에서 데이터 사용을 감소, 중단 또는 연기해야 하는지 여부를 확인합니다. 이 항목의 코드 샘플은 이러한 개체를 사용하는 방법을 보여 줍니다.

  1. NetworkInformation 클래스의 정적 GetInternetConnectionProfile 메서드를 호출하여 ConnectionProfile을 검색합니다.

  2. 현재 ConnectionProfile과 연관된 NetworkAdapterIanaInterfaceType 속성을 확인합니다.

    휴대폰에서 무료 Wi-Fi 연결을 사용하는 경우 앱에서 데이터 사용을 제한할 필요가 없습니다. 그렇지 않으면 다음 단계를 계속합니다.

  3. 해당 GetConnectionCost 메서드를 호출하여 현재 ConnectionProfile 클래스와 연관된 ConnectionCost 클래스의 NetworkCostType 속성을 확인합니다. 사용 가능한 값은 다음과 같이 NetworkCostType 열거의 멤버입니다.

    • 알 수 없음

    • 무제한

    • 수정됨

    • 변수

    사용자에게 제공된 데이터가 Unrestricted인 경우 앱에서 데이터의 사용을 제한할 필요가 없습니다. 그렇지 않으면 다음 단계를 계속합니다.

  4. 현재 ConnectionProfile 클래스와 연관된 ConnectionCost 클래스의 다른 세 개의 속성을 확인하여 사용자 제공 데이터에 대해 다음 속성 중 하나가 true로 설정되었는지 확인합니다.

    이러한 값 중 하나가 true로 설정된 경우 앱에서 데이터 사용을 줄이거나 없앨 수 있습니다.

    사용자가 아직 제공 데이터를 지정하지 않았고 NetworkCostTypeUnknown인 경우 ApproachingDataLimitOverDataLimit의 값은 false입니다. 데이터 사용 비용을 알 수 없는 경우 앱에 대해 최상의 동작을 선택해야 합니다.

    Roaming 속성은 NetworkCostTypeUnknown인 경우에도 정확한 값을 반환합니다.

다음 표에는 앱에서 데이터 사용을 조정하여 사용자의 데이터 비용을 줄일 수 있는 방법에 대한 제안 사항이 나와 있습니다.

NetworkCostType

ConnectionCost

사용 가능한 데이터 사용

예제

무제한

해당 없음

제한이 없습니다.

고화질 동영상을 스트림합니다.

고해상도 사진을 다운로드합니다.

이메일 첨부 파일을 가져옵니다.

Fixed 또는 Variable

다음 세 속성은 모두 false입니다.

제한이 없습니다.

고화질 동영상을 스트림합니다.

고해상도 사진을 다운로드합니다.

이메일 첨부 파일을 가져옵니다.

Fixed 또는 Variable

또는

알 수 없음

NetworkCostTypeFixed 또는 Variable이면 ApproachingDataLimittrue입니다.

NetworkCostTypeUnknown이면 해당되지 않습니다.

적은 양의 데이터를 전송합니다.

재정의 옵션을 제공합니다.

저화질 동영상을 스트림합니다.

저해상도 사진을 다운로드합니다.

이메일 머리글만 가져옵니다.

데이터를 전송하는 작업을 연기합니다.

Fixed 또는 Variable

OverDataLimit 또는 Roamingtrue입니다.

데이터를 전송하지 않습니다.

재정의 옵션을 제공합니다.

동영상 다운로드를 중지합니다.

사진 다운로드를 중지합니다.

이메일을 가져오지 않습니다.

데이터를 전송하는 작업을 연기합니다.

데이터 사용을 감소, 중단 또는 연기하도록 앱을 작성할 경우 사용자에게 여기에 제안된 줄어드는 사용 수준을 재정의하는 옵션을 제공하는 것이 좋습니다. 단, 반복되는 프롬프트는 최상의 솔루션의 요소가 아닐 수 있습니다. 사용자의 작업 중단을 최소화하려면 반복 프롬프트를 무시하는 옵션을 사용자에게 제공하는 앱 수준 설정을 만들면 됩니다. 예를 들어 Prompt to override reduced data usage 설정을 만들 수 있으며, 이러한 설정은 Always override, Prompt to overrideNever override와 같은 값을 포함합니다.

참고참고:

네트워크 유형을 셀룰러에서 Wi-Fi로 또는 Wi-Fi에서 셀룰러로 변경하여 데이터 감지 코드를 테스트하는 데 있어 시뮬레이션 대시보드를 사용할 수 없습니다. 시뮬레이션 대시보드는 데이터 감지 API에서 사용하는 속성 및 여기에 설명된 속성 값을 변경하지 않습니다. 시뮬레이션 대시보드의 네트워크 시뮬레이션에 대한 자세한 내용은 Windows Phone의 저대역폭 연결 또는 불량 신호를 시뮬레이션하는 방법을 참조하세요.

휴대폰에 연결 정보가 포함된 Wi-Fi 연결이 사용 가능해지면 휴대폰이 자동으로 셀룰러 연결에서 Wi-Fi 연결로 전환됩니다. Wi-Fi 연결이 사용 가능해지면 연결 끓기 및 재연결을 위한 코드를 작성할 필요가 없습니다.

다음 코드 샘플은 사용자가 지정한 제공 데이터를 기준으로 데이터 사용 수준을 조정하는 방법을 보여 줍니다.


using Windows.Networking.Connectivity;
…

namespace DataSenseSample
{
    public partial class MainPage : PhoneApplicationPage
    {

        bool m_bDoNotSendData = false;
        bool m_bSendLowResolutionImage = false;

        private const int IANA_INTERFACE_TYPE_WIFI = 71;

        NetworkStatusChangedEventHandler networkStatusCallback;

        // Constructor.
        public MainPage()
        {
            InitializeComponent();

            // Handle the NetworkStatusChanged event.
            networkStatusCallback = new NetworkStatusChangedEventHandler(OnNetworkStatusChange);
            UpdateNetworkInformation();

        }

        void UpdateNetworkInformation()
        {
            // Get current Internet Connection Profile.
            ConnectionProfile internetConnectionProfile = Windows.Networking.Connectivity.NetworkInformation.GetInternetConnectionProfile();
           
            // Check the connection details.
            if (internetConnectionProfile.NetworkAdapter.IanaInterfaceType != IANA_INTERFACE_TYPE_WIFI)
            {
                // Connection is not a Wi-Fi connection. 
                if (internetConnectionProfile.GetConnectionCost().Roaming)
                {
                    // User is roaming. Don't send data out.
                    m_bDoNotSendData = true;
                }

                if (internetConnectionProfile.GetConnectionCost().ApproachingDataLimit)
                {
                    // User is approaching data limit. Send low-resolution images.
                    m_bSendLowResolutionImage = true;
                }

                if (internetConnectionProfile.GetConnectionCost().OverDataLimit)
                {
                    // User is over data limit. Don't send data out.
                    m_bDoNotSendData = true;
                }
            }
            else
            {   
                //Connection is a Wi-Fi connection. Data restrictions are not necessary.                        
                m_bDoNotSendData = false;
                m_bSendLowResolutionImage = false;
            }

            // Optionally, report the current values in a TextBox control.
            string cost = string.Empty;
            switch (internetConnectionProfile.GetConnectionCost().NetworkCostType)
            {
                case NetworkCostType.Unrestricted:
                    cost += "Cost: Unrestricted";
                    break;
                case NetworkCostType.Fixed:
                    cost += "Cost: Fixed";
                    break;
                case NetworkCostType.Variable:
                    cost += "Cost: Variable";
                    break;
                case NetworkCostType.Unknown:
                    cost += "Cost: Unknown";
                    break;
                default:
                    cost += "Cost: Error";
                    break;
            }
            cost += "\n";
            cost += "Roaming: " + internetConnectionProfile.GetConnectionCost().Roaming + "\n";
            cost += "Over Data Limit: " + internetConnectionProfile.GetConnectionCost().OverDataLimit + "\n";
            cost += "Approaching Data Limit : " + internetConnectionProfile.GetConnectionCost().ApproachingDataLimit + "\n";

            NetworkStatus.Text = cost;
        }

        async void OnNetworkStatusChange(object sender)
        {
            UpdateNetworkInformation();
        }


    }
}

표시: