방법: Windows Phone의 원시 알림 보내기 및 받기

2012-02-09

이 항목에서는 Microsoft 푸시 알림 서비스로 원시 알림을 보내는 데 필요한 단계 및 Windows Phone 에서 실행 중인 응용프로그램에서 이 알림을 받는 방법에 대해 설명합니다. Windows Phone의 푸시 알림 개요에서는 원시 알림에 대한 정보 및 토스트 알림의 용도에 대한 정보를 소개합니다.

전체 샘플은 Windows Phone용 코드 샘플에서 찾을 수 있습니다.

중요중요:

이 항목 중에 웹 서버에서 실행 중인 ASP.NET 웹 페이지에서 원시 알림을 보내는 섹션의 경우 Visual Studio 의 정식 버전 또는 무료 Microsoft Visual Web Developer 2010 Express가 필요합니다.

이 섹션에서는 푸시 알림 채널을 만들고 원시 알림 이벤트를 처리하는 Windows Phone 에서 실행되는 응용프로그램을 만듭니다.

중요중요:

편의상, 여기서는 토스트 알림 URI를 복사하여 알림을 보내는 웹 페이지에 붙여 넣습니다. 일반적으로 이 URI는 응용프로그램용으로 만든 웹 서비스로 전달됩니다.

원시 알림을 수신할 푸시 클라이언트를 만들려면

  1. Visual Studio 를 열고 새 응용프로그램을 만듭니다. Silverlight for Windows Phone C# 범주 아래에 있는 Windows Phone 응용프로그램 템플릿을 사용해야 합니다.

  2. 프로젝트 이름을 RawNotificationClient로 지정합니다.

  3. 파일의 맨 위에 다음 using 지시문을 추가합니다.

    
    using Microsoft.Phone.Notification;
    
    
    
  4. MainPage 생성자를 다음 코드로 바꿉니다. 이 코드는 원시 알림 채널이 응용프로그램의 이전 인스턴스에 이미 설정되어 있는지 여부를 확인합니다. 알림 채널이 있으면 알림 이벤트에 연결합니다. 알림 채널이 없으면 알림 채널을 만들어 알림 이벤트에 연결합니다.

    
            public MainPage()
            {
                /// Holds the push channel that is created or found.
                HttpNotificationChannel pushChannel;
    
                // The name of our push channel.
                string channelName = "RawSampleChannel";
    
                InitializeComponent();
    
                // Try to find the push channel.
                pushChannel = HttpNotificationChannel.Find(channelName);
    
                // If the channel was not found, then create a new connection to the push service.
                if (pushChannel == null)
                {
                    pushChannel = new HttpNotificationChannel(channelName);
    
                    // Register for all the events before attempting to open the channel.
                    pushChannel.ChannelUriUpdated += new EventHandler<NotificationChannelUriEventArgs>(PushChannel_ChannelUriUpdated);
                    pushChannel.ErrorOccurred += new EventHandler<NotificationChannelErrorEventArgs>(PushChannel_ErrorOccurred);
                    pushChannel.HttpNotificationReceived += new EventHandler<HttpNotificationEventArgs>(PushChannel_HttpNotificationReceived);
    
                    pushChannel.Open();
    
                }
                else
                {
                    // The channel was already open, so just register for all the events.
                    pushChannel.ChannelUriUpdated += new EventHandler<NotificationChannelUriEventArgs>(PushChannel_ChannelUriUpdated);
                    pushChannel.ErrorOccurred += new EventHandler<NotificationChannelErrorEventArgs>(PushChannel_ErrorOccurred);
                    pushChannel.HttpNotificationReceived += new EventHandler<HttpNotificationEventArgs>(PushChannel_HttpNotificationReceived);
    
                    // Display the URI for testing purposes. Normally, the URI would be passed back to your web service at this point.
                    System.Diagnostics.Debug.WriteLine(pushChannel.ChannelUri.ToString());
                    MessageBox.Show(String.Format("Channel Uri is {0}",
                        pushChannel.ChannelUri.ToString()));
    
                }
            }
    
    
    
    
  5. 다음으로 이벤트 처리기에 대한 코드를 추가합니다. 첫 이벤트 처리기는 ChannelUriUpdated 이벤트에 대한 것입니다. 편의상, 채널 URI가 여기에 표시되지만 일반적으로 이 URI는 웹 서비스로 다시 보내집니다.

            void PushChannel_ChannelUriUpdated(object sender, NotificationChannelUriEventArgs e)
            {
    
                Dispatcher.BeginInvoke(() =>
                {
                    // Display the new URI for testing purposes. Normally, the URI would be passed back to your web service at this point.
                    System.Diagnostics.Debug.WriteLine(e.ChannelUri.ToString());
                    MessageBox.Show(String.Format("Channel Uri is {0}",
                        e.ChannelUri.ToString()));
                    
                });
            }
    
    
  6. 다음 이벤트 처리기는 오류 처리용입니다. 데이터 연결은 휴대폰의 위치 및 서비스에 따라 달라질 수 있으므로 코드는 알림 오류를 적절하게 처리해야 합니다.

            void PushChannel_ErrorOccurred(object sender, NotificationChannelErrorEventArgs e)
            {
                // Error handling logic for your particular application would be here.
                Dispatcher.BeginInvoke(() =>
                    MessageBox.Show(String.Format("A push notification {0} error occurred.  {1} ({2}) {3}",
                        e.ErrorType, e.Message, e.ErrorCode, e.ErrorAdditionalData))
                        );
            }
    
    
  7. 마지막 이벤트 처리기는 원시 알림을 수신하기 위한 것입니다. 이 데이터의 사용은 전적으로 응용프로그램에 따릅니다.

               void PushChannel_HttpNotificationReceived(object sender, HttpNotificationEventArgs e)
            {
                string message;
    
                using (System.IO.StreamReader reader = new System.IO.StreamReader(e.Notification.Body))
                {
                    message = reader.ReadToEnd();
                }
    
    
                Dispatcher.BeginInvoke(() =>
                    MessageBox.Show(String.Format("Received Notification {0}:\n{1}",
                        DateTime.Now.ToShortTimeString(), message))
                        );
            }
    
    

이제 Windows Phone 푸시 클라이언트 코드가 완성되었습니다. 알림을 보내는 웹 페이지가 완성된 후 이 코드를 실행합니다.

이 섹션에서는 단말기에 푸시 채널이 만들어질 때 반환되는 URI를 사용하여 원시 알림을 보내는 ASP.NET 웹 페이지를 만듭니다.

ASP.NET 프로젝트를 만들려면 Visual Studio 정식 버전 또는 무료 Microsoft Visual Web Developer 2010 Express가 필요합니다.

원시 알림을 보낼 ASP.NET 페이지를 만들려면

  1. Visual Studio 의 다른 인스턴스를 열고 새 응용프로그램을 만듭니다. Web C# 범주 아래에 있는 ASP.NET Empty Web Application 템플릿을 사용해야 합니다.

  2. 프로젝트 이름을 SendRaw로 지정합니다.

  3. SendRaw 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 추가를 클릭한 다음 새 항목…, 웹 폼을 차례로 선택하여 프로젝트에 새 웹 폼을 추가합니다.

  4. 폼의 이름을 SendRaw로 지정하고 추가 버튼을 클릭합니다.

  5. 솔루션 탐색기에서 SendRaw.aspx를 마우스 오른쪽 버튼으로 클릭하고 시작 페이지로 설정을 선택하여 SendRaw를 시작 페이지로 만듭니다.

  6. 다음 단계는 다음 컨트롤을 SendRaw.aspx 웹 폼에 추가하는 것입니다.

    컨트롤 형식

    컨트롤 ID

    컨트롤 텍스트

    TextBox

    TextBoxUri

    URI 입력:

    TextBox

    TextBoxValue1

    값 1 입력:

    TextBox

    TextBoxValue2

    값 2 입력:

    Button

    ButtonSendRaw

    원시 알림 보내기

    TextBox

    TextBoxResponse

    응답:

    Send Raw 버튼에 ButtonSendRaw_Click 이벤트 처리기가 생깁니다. SendRaw.aspx의 콘텐츠를 다음 코드로 바꾸어 해당 컨트롤을 만듭니다.

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="SendRaw.aspx.cs" Inherits="SendRaw.SendRaw" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head id="Head1" runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
        
            <br />
            Enter URI:</div>
        <asp:TextBox ID="TextBoxUri" runat="server" Width="666px"></asp:TextBox>
        <br />
        <br />
        Enter Value 1:<br />
        <asp:TextBox ID="TextBoxValue1" runat="server"></asp:TextBox>
        <br />
        <br />
        Enter Value 2:<br />
        <asp:TextBox ID="TextBoxValue2" runat="server"></asp:TextBox>
        <br />
        <br />
        <br />
        <asp:Button ID="ButtonSendRaw" runat="server" onclick="ButtonSendRaw_Click" 
            Text="Send Raw Notification" />
        <br />
        <br />
        Response:<br />
        <asp:TextBox ID="TextBoxResponse" runat="server" Height="78px" Width="199px"></asp:TextBox>
        </form>
    </body>
    </html>
    
    
    
  7. 다음 using 지시문을 SendRaw.aspx.cs 파일의 맨 위에 추가합니다.

    
    using System.Net;
    using System.IO;
    using System.Text;
    
    
  8. ButtonSendRaw_Click 이벤트 처리기에 대한 코드를 추가합니다. 이 코드는 첫 번째 TextBox에 입력된 URI를 가져와 토스트 알림 메시지를 구성한 다음 이를 Microsoft 푸시 알림 서비스에 게시합니다.

                 protected void ButtonSendRaw_Click(object sender, EventArgs e)
            {
                try
                {
                    // Get the URI that the Microsoft Push Notification Service returns to the push client when creating a notification channel.
                    // Normally, a web service would listen for URIs coming from the web client and maintain a list of URIs to send
                    // notifications out to.
                    string subscriptionUri = TextBoxUri.Text.ToString();
    
    
                    HttpWebRequest sendNotificationRequest = (HttpWebRequest)WebRequest.Create(subscriptionUri);
    
                    // Create an HTTPWebRequest that posts the raw notification to the Microsoft Push Notification Service.
                    // HTTP POST is the only method allowed to send the notification.
                    sendNotificationRequest.Method = "POST";
    
                    // Create the raw message.
                    string rawMessage = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
                    "<root>" +
                        "<Value1>" + TextBoxValue1.Text.ToString() + "<Value1>" +
                        "<Value2>" + TextBoxValue2.Text.ToString() + "<Value2>" +
                    "</root>";
    
                    // Set the notification payload to send.
                    byte[] notificationMessage = Encoding.Default.GetBytes(rawMessage);
    
                    // Set the web request content length.
                    sendNotificationRequest.ContentLength = notificationMessage.Length;
                    sendNotificationRequest.ContentType = "text/xml";
                    sendNotificationRequest.Headers.Add("X-NotificationClass", "3");
    
    
                    using (Stream requestStream = sendNotificationRequest.GetRequestStream())
                    {
                        requestStream.Write(notificationMessage, 0, notificationMessage.Length);
                    }
    
                    // Send the notification and get the response.
                    HttpWebResponse response = (HttpWebResponse)sendNotificationRequest.GetResponse();
                    string notificationStatus = response.Headers["X-NotificationStatus"];
                    string notificationChannelStatus = response.Headers["X-SubscriptionStatus"];
                    string deviceConnectionStatus = response.Headers["X-DeviceConnectionStatus"];
    
                    // Display the response from the Microsoft Push Notification Service.  
                    // Normally, error handling code would be here. In the real world, because data connections are not always available,
                    // notifications may need to be throttled back if the device cannot be reached.
                    TextBoxResponse.Text = notificationStatus + " | " + deviceConnectionStatus + " | " + notificationChannelStatus;
                }
                catch (Exception ex)
                {
                    TextBoxResponse.Text = "Exception caught sending update: " + ex.ToString();
                }
    
            }
    
    
    

샘플을 실행하려면 먼저 푸시 클라이언트 코드를 실행하여 채널을 만들고 URI를 가져옵니다. 그런 다음 웹 페이지에서 이 URI를 사용하여 원시 알림을 보냅니다.

샘플을 실행하려면

  1. RawNotificationClient 프로젝트로 돌아가 이 프로젝트를 실행합니다. Windows Phone 에뮬레이터가 초기화되고 응용프로그램이 시작됩니다. 1-2초 후 응용프로그램에 푸시 채널 URI가 포함된 메시지가 표시됩니다. 또한 이 URI는 Visual Studio 디버거 출력 창에도 표시됩니다.

    AP_Push_OutputWindow
    팁팁:

    Windows Phone용 Visual Studio 2010 Express 에서 기본 설정은 디버깅 세션 중에 출력 창을 표시하지 않는 것입니다. 디버그 메뉴로 이동하여 Windows, 출력을 차례로 선택하면 출력 창을 표시할 수 있습니다. 창을 스크롤하여 URI를 찾습니다.

  2. 이제 알림 채널이 만들어졌습니다. Visual Studio 디버거 출력 창에서 클립보드로 URI를 복사합니다.

  3. SendRaw 프로젝트로 전환하고 이 프로젝트를 실행합니다.

  4. URI 입력란에 이전 프로젝트에서 복사한 URI를 붙여 넣습니다.

  5. 원시 알림 데이터에 대한 몇몇 값을 입력합니다. 원시 보내기 버튼을 클릭합니다.

    AP_Push_SendRaw
  6. 에뮬레이터에서 실행 중인 Windows Phone 에서 원시 알림이 수신됩니다. 응용프로그램이 실행 중인 경우에만 알림이 수신됩니다.

    AP_Push_RawEvent

지금까지 ASP.NET 페이지로부터 Windows Phone 에서 실행 중인 응용프로그램에 원시 데이터를 전달하는 방법을 알아보았습니다.

표시: