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

방법: 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. 프로젝트 이름을 ToastNotificationClient로 지정합니다.

  3. 토스트 메시지로 매개 변수 및 탐색 정보를 전달하는 과정을 보여 주기 위해 두 번째 페이지가 추가됩니다. MainPage의 버튼은 두 번째 페이지로 이동하여 Main Page로 설정된 NavigatedFrom의 매개 변수를 전달합니다. MainPage.xaml에서 <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"></Grid>를 다음 코드로 바꾸어 MainPage.xaml에 버튼을 추가합니다.

            <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
                <Button Content="Navigate to Page 2" Height="72" HorizontalAlignment="Left" Margin="83,82,0,0" Name="buttonNavigate" VerticalAlignment="Top" Width="281" Click="buttonNavigate_Click" />
            </Grid>
    
    
  4. 두 번째 페이지를 만들려면 솔루션 탐색기에서 ToastNotificationClient 프로젝트 이름을 선택하고 메뉴에서 프로젝트 | 새 항목 추가를 선택합니다. 새 Windows Phone 세로 페이지를 추가하고 이름을 Page2.xaml로 지정합니다. 추가를 클릭하면 Page2.xaml 및 Page2.xaml.cs 파일이 만들어집니다. Page2.xaml에서 <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"></Grid>를 다음 코드로 바꿉니다.

            <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
                <TextBlock Height="33" HorizontalAlignment="Left" Margin="36,87,0,0" Name="textBlockFrom" Text="" VerticalAlignment="Top" Width="390" />
            </Grid>
    
    
  5. 다음 using 지시문을 MainPage.xaml.cs 파일의 맨 위에 추가합니다.

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

    
            public MainPage()
            {
                /// Holds the push channel that is created or found.
                HttpNotificationChannel pushChannel;
    
                // The name of our push channel.
                string channelName = "ToastSampleChannel";
    
                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);
    
                    // Register for this notification only if you need to receive the notifications while your application is running.
                    pushChannel.ShellToastNotificationReceived += new EventHandler<NotificationEventArgs>(PushChannel_ShellToastNotificationReceived);
                    
                    pushChannel.Open();
    
                    // Bind this new channel for toast events.
                    pushChannel.BindToShellToast();
    
                }
                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);
    
                    // Register for this notification only if you need to receive the notifications while your application is running.
                    pushChannel.ShellToastNotificationReceived += new EventHandler<NotificationEventArgs>(PushChannel_ShellToastNotificationReceived);
    
                    // 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()));
    
                }
            }
    
    
    
    
  7. 버튼에 대한 이벤트 처리기를 추가합니다. 이 버튼은 Page2로의 이동을 보여 주고 MainPage에서 이동했음을 나타낼 매개 변수를 전달합니다.

            private void buttonNavigate_Click(object sender, RoutedEventArgs e)
            {
                this.NavigationService.Navigate(new Uri("/Page2.xaml?NavigatedFrom=Main Page", UriKind.Relative));
            }
    
    
  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))
                        );
            }
    
    
  10. 마지막 이벤트 처리기는 선택 사항입니다. 응용프로그램이 실행되고 있지 않을 때 토스트 알림이 도착하면 토스트가 표시됩니다. 응용프로그램이 실행 중이면 토스트가 표시되지 않습니다. 실행 중인 응용프로그램이 토스트 알림에 응답하게 하려면 ShellToastNotificationReceived 이벤트 처리기를 구현해야 합니다.

            void PushChannel_ShellToastNotificationReceived(object sender, NotificationEventArgs e)
            {
                StringBuilder message = new StringBuilder();
                string relativeUri = string.Empty;
    
                message.AppendFormat("Received Toast {0}:\n", DateTime.Now.ToShortTimeString());
    
                // Parse out the information that was part of the message.
                foreach (string key in e.Collection.Keys)
                {
                    message.AppendFormat("{0}: {1}\n", key, e.Collection[key]);
    
                    if (string.Compare(
                        key,
                        "wp:Param",
                        System.Globalization.CultureInfo.InvariantCulture,
                        System.Globalization.CompareOptions.IgnoreCase) == 0)
                    {
                        relativeUri = e.Collection[key];
                    }
                }
    
                // Display a dialog of all the fields in the toast.
                Dispatcher.BeginInvoke(() => MessageBox.Show(message.ToString()));
    
            }
    
    
    
  11. Page2.xaml에 대한 OnNavigatedTo 이벤트 처리기를 추가합니다. 텍스트 블록에 페이지로 전달되는 NavigatedFrom 매개 변수의 값이 표시됩니다.

            protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
            {
                base.OnNavigatedTo(e);
    
                //  If we navigated to this page
                // from the MainPage, the DefaultTitle parameter will be "FromMain".  If we navigated here
                // when the secondary Tile was tapped, the parameter will be "FromTile".
                textBlockFrom.Text = "Navigated here from " + this.NavigationContext.QueryString["NavigatedFrom"];
    
            }
    
    

이제 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. 프로젝트 이름을 SendToast로 지정합니다.

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

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

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

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

    컨트롤 형식

    컨트롤 ID

    컨트롤 텍스트

    TextBox

    TextBoxUri

    URI 입력:

    TextBox

    TextBoxTitle

    제목 입력:

    TextBox

    TextBoxSubTitle

    부제목 입력:

    Button

    ButtonSendToast

    토스트 알림 보내기

    TextBox

    TextBoxResponse

    응답:

    토스트 보내기 버튼에 대해 ButtonSendToast_Click 이벤트 처리기가 생깁니다. SendToast.aspx의 콘텐츠를 아래 코드로 바꾸어 해당 컨트롤을 만듭니다.

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="SendToast.aspx.cs" Inherits="SendToast.SendToast" %>
    
    <!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 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 Title:<br />
        <asp:TextBox ID="TextBoxTitle" runat="server"></asp:TextBox>
        <br />
        <br />
        Enter Subtitle:<br />
        <asp:TextBox ID="TextBoxSubTitle" runat="server"></asp:TextBox>
        <br />
        <br />
        <br />
        <asp:Button ID="ButtonSendToast" runat="server" onclick="ButtonSendToast_Click" 
            Text="Send Toast Notification" />
        <br />
        <br />
        Response:<br />
        <asp:TextBox ID="TextBoxResponse" runat="server" Height="78px" Width="199px"></asp:TextBox>
        </form>
    </body>
    </html>
    
    
    
  7. 다음 using 지시문을 SendToast.aspx.cs 파일의 맨 위에 추가합니다.

    
    using System.Net;
    using System.IO;
    using System.Text;
    
    
  8. ButtonSendToast_Click 이벤트 처리기에 대한 코드를 추가합니다. 이 코드는 첫 번째 TextBox에 입력된 URI를 가져와 토스트 알림 메시지를 구성한 다음 이를 Microsoft 푸시 알림 서비스에 게시합니다. 토스트 메시지는 앱에 Page2.xaml로 이동하고 토스트 알림NavigatedFrom 값을 전달하라고 지시합니다.

            protected void ButtonSendToast_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 toast 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 toast message.
                    string toastMessage = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
                    "<wp:Notification xmlns:wp=\"WPNotification\">" +
                       "<wp:Toast>" +
                            "<wp:Text1>" + TextBoxTitle.Text.ToString() + "</wp:Text1>" +
                            "<wp:Text2>" + TextBoxSubTitle.Text.ToString() + "</wp:Text2>" +
                            "<wp:Param>/Page2.xaml?NavigatedFrom=Toast Notification</wp:Param>" +
                       "</wp:Toast> " +
                    "</wp:Notification>";
    
                    // Set the notification payload to send.
                    byte[] notificationMessage = Encoding.Default.GetBytes(toastMessage);
    
                    // Set the web request content length.
                    sendNotificationRequest.ContentLength = notificationMessage.Length;
                    sendNotificationRequest.ContentType = "text/xml";
                    sendNotificationRequest.Headers.Add("X-WindowsPhone-Target", "toast");
                    sendNotificationRequest.Headers.Add("X-NotificationClass", "2");
    
    
                    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. ToastNotificationClient 프로젝트로 돌아가 이 프로젝트를 실행합니다. Windows Phone 에뮬레이터가 초기화되고 응용프로그램이 시작됩니다. 1-2초 후 응용프로그램에 푸시 채널 URI가 포함된 메시지가 표시됩니다. 또한 이 URI는 Visual Studio 디버거 출력 창에도 표시됩니다.

    AP_Push_OutputWindow
    팁팁:

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

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

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

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

  5. 토스트의 제목과 부제목을 입력합니다. 토스트 보내기 버튼을 클릭합니다.

    AP_Push_SendToast
  6. 에뮬레이터에서 실행 중인 Windows Phone 에서 토스트가 수신됩니다. 응용프로그램이 실행 중이면 토스트 정보가 포함된 메시지가 표시됩니다.

    AP_Push_ToastEvent

    응용프로그램이 실행되고 있지 않으면 화면 맨 위에 경고가 표시됩니다. 경고를 탭하면 ToastNotificationClient가 시작되고 Page2로 이동합니다.

    AP_Push_ToastMessageAP_Push_ToastRunning

지금까지 ASP.NET 페이지에서 Windows Phone 으로 토스트 메시지를 보내는 방법을 알아보았습니다.

표시:
© 2014 Microsoft