내보내기(0) 인쇄
모두 확장

방법: Windows Phone의 타일 알림 보내기 및 받기

2012-02-09

이 항목에서는 Windows Phone 에서 시작 화면에 고정된 응용프로그램의 타일이 업데이트되도록 Microsoft 푸시 알림 서비스에 타일 알림을 보내는 데 필요한 단계에 대해 설명합니다. 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. 프로젝트 이름을 TileNotificationClient로 지정합니다.

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

    
    using Microsoft.Phone.Notification;
    
    
  4. 타일을 업데이트할 때 사용할 이미지용 그래픽을 두세 개 만듭니다. 예를 들어 Microsoft 그림판을 사용하여 173 x 173 픽셀이고 각각 빨강, 녹색, 파랑 단색인 .jpg 파일 3개를 만듭니다. 이름을 Red.jpg, Green.jpg, Blue.jpg로 지정합니다.

  5. TileNotificationSample 프로젝트 이름을 마우스 오른쪽 버튼으로 클릭하고 추가..., 기존 항목을 차례로 선택하여 프로젝트에 그래픽 파일을 추가합니다. 만든 3개의 이미지를 선택하고 프로젝트에 추가합니다.

  6. 솔루션 탐색기에서 Red.jpg를 선택합니다. 속성 창에서 그래픽이 .xap 파일의 일부로 포함되도록 Build ActionContent로 설정합니다. 나머지 .jpg 파일에 대해서도 이 단계를 반복합니다.

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

    
            public MainPage()
            {
                /// Holds the push channel that is created or found.
                HttpNotificationChannel pushChannel;
    
                // The name of our push channel.
                string channelName = "TileSampleChannel";
    
                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.Open();
    
                    // Bind this new channel for Tile events.
                    pushChannel.BindToShellTile();
    
    
                }
                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);
    
                    // 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()));
    
                }
            }
    
    
    
  8. 다음으로 이벤트 처리기에 대한 코드를 추가합니다. 첫 이벤트 처리기는 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()));
                    
                });
            }
    
    
  9. 다음 이벤트 처리기는 오류 처리용입니다. 데이터 연결은 휴대폰의 위치 및 서비스에 따라 달라질 수 있으므로 코드는 알림 오류를 적절하게 처리해야 합니다.

            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))
                        );
            }
    
    

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

이 섹션에서는 단말기에 푸시 채널이 만들어질 때 반환되는 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. 프로젝트 이름을 SendTile로 지정합니다.

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

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

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

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

    컨트롤 형식

    컨트롤 ID

    컨트롤 텍스트

    TextBox

    TextBoxUri

    URI 입력:

    TextBox

    TextBoxTitle

    제목 입력:

    TextBox

    TextBoxBackgroundImage

    이미지 입력:

    TextBox

    TextBoxCount

    수 입력:

    TextBox

    TextBoxBackTitle

    뒷면 제목 입력:

    TextBox

    TextBoxBackBackgroundImage

    뒷면 배경 이미지 입력:

    TextBox

    TextBoxBackContent

    뒷면 콘텐츠 입력:

    Button

    ButtonSendTile

    타일 알림 보내기:

    TextBox

    TextBoxResponse

    응답:

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

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="SendTile.aspx.cs" Inherits="SendTile.SendTile" %>
    <!-- 
        Copyright (c) 2011 Microsoft Corporation.  All rights reserved.
        Use of this sample source code is subject to the terms of the Microsoft license 
        agreement under which you licensed this sample source code and is provided AS-IS.
        If you did not accept the terms of the license agreement, you are not authorized 
        to use this sample source code.  For the terms of the license, please see the 
        license agreement between you and Microsoft.
    -->
    
    <!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">
    
    <body>
        <form id="form1" runat="server">
        <div>
        
            <br />
            Enter URI:</div>
        <asp:TextBox ID="TextBoxUri" runat="server" Width="666px"></asp:TextBox>
        <br />
        <br />
        Enter Front Title:<br />
        <asp:TextBox ID="TextBoxTitle" runat="server"></asp:TextBox>
        <br />
        <br />
        Enter Front Background Image:<br />
        <asp:TextBox ID="TextBoxBackgroundImage" runat="server"></asp:TextBox>
        <br />
        <br />
        Enter Front Count:<br />
        <asp:TextBox ID="TextBoxCount" runat="server"></asp:TextBox>
        <br />
        <br />
        <br />
        Enter Back Title:<br />
        <asp:TextBox ID="TextBoxBackTitle" runat="server"></asp:TextBox>
        <br />
        <br />
        Enter Back Background Image:<br />
        <asp:TextBox ID="TextBoxBackBackgroundImage" runat="server"></asp:TextBox>
        <br />
        <br />
        Enter Back Content:<br />
        <asp:TextBox ID="TextBoxBackContent" runat="server"></asp:TextBox>
        <br />
        <br />
        <br />
        <asp:Button ID="ButtonSendTile" runat="server" onclick="ButtonSendTile_Click" 
            Text="Send Tile Notification" />
        <br />
        <br />
        Response:<br />
        <asp:TextBox ID="TextBoxResponse" runat="server" Height="78px" Width="199px"></asp:TextBox>
        </form>
    </body>
    </html>
    
    
  7. 다음 using 지시문을 SendTile.aspx.cs 파일의 맨 위에 추가합니다.

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

                 protected void ButtonSendTile_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 Tile notification to the Microsoft Push Notification Service.
                    // HTTP POST is the only method allowed to send the notification.
                    sendNotificationRequest.Method = "POST";
    
                    // The optional custom header X-MessageID uniquely identifies a notification message. 
                    // If it is present, the same value is returned in the notification response. It must be a string that contains a UUID.
                    // sendNotificationRequest.Headers.Add("X-MessageID", "<UUID>");
    
                    // Create the Tile message.
                      string tileMessage = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
                      "<wp:Notification xmlns:wp=\"WPNotification\">" +
                          "<wp:Tile>" +
                            "<wp:BackgroundImage>" + TextBoxBackgroundImage.Text + "</wp:BackgroundImage>" +
                            "<wp:Count>" + TextBoxCount.Text + "</wp:Count>" +
                            "<wp:Title>" + TextBoxTitle.Text + "</wp:Title>" +
                            "<wp:BackBackgroundImage>" + TextBoxBackBackgroundImage.Text + "</wp:BackBackgroundImage>" +
                            "<wp:BackTitle>" + TextBoxBackTitle.Text + "</wp:BackTitle>" +
                            "<wp:BackContent>" + TextBoxBackContent.Text + "</wp:BackContent>" +
                         "</wp:Tile> " +
                      "</wp:Notification>";
     
                    // Set the notification payload to send.
                    byte[] notificationMessage = Encoding.Default.GetBytes(tileMessage);
    
                    // Set the web request content length.
                    sendNotificationRequest.ContentLength = notificationMessage.Length;
                    sendNotificationRequest.ContentType = "text/xml";
                    sendNotificationRequest.Headers.Add("X-WindowsPhone-Target", "token");
                    sendNotificationRequest.Headers.Add("X-NotificationClass", "1");
    
    
                    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. TileNotificationClient 프로젝트로 돌아가 이 프로젝트를 실행합니다. Windows Phone 에뮬레이터가 초기화되고 응용프로그램이 시작됩니다. 1-2초 후 응용프로그램에 URI가 포함된 메시지가 표시됩니다. 또한 이 URI는 Visual Studio 디버거 출력 창에도 표시됩니다.

    AP_Push_OutputWindow
    팁팁:

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

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

  3. 에뮬레이터에서 실행되는 Windows Phone 응용프로그램에서 응용프로그램 목록에 있는 TileNotificationClient 이름을 탭한 다음 시작 화면에 고정을 선택하여 응용프로그램 타일을 시작 화면에 고정합니다. 이 타일이 업데이트될 타일입니다.

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

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

  6. 타일 제목, 수 및 이미지를 입력합니다. 이미지 이름으로는 .jpb 파일의 전체 이름(예: Red.jpg)을 사용합니다.

    AP_Push_SendTile

    또한 BindToShellTile(Collection<(Of <<'(Uri>)>>)) 메서드를 사용하여 원격 이미지 파일에 URI를 보낼 수도 있습니다.

  7. 타일 보내기 버튼을 클릭합니다. 시작 화면에 고정한 타일이 업데이트됩니다. 타일 뒷면의 속성을 설정한 경우 타일의 뒷면을 표시하기 위해 몇 초 후 타일이 뒤집힙니다. 제목과 같은 필드를 비워두면 필드가 업데이트되지 않습니다.

    AP_PushTileUpdate

지금까지 ASP.NET 페이지에서 Windows Phone 에 알림을 보내어 타일을 업데이트하는 방법에 대해 알아보았습니다.

Microsoft는 MSDN 웹 사이트에 대한 귀하의 의견을 이해하기 위해 온라인 설문 조사를 진행하고 있습니다. 참여하도록 선택하시면 MSDN 웹 사이트에서 나가실 때 온라인 설문 조사가 표시됩니다.

참여하시겠습니까?
표시:
© 2014 Microsoft