MSDN Library
콘텐츠의 테이블 축소
콘텐츠의 테이블 확장
정보
요청한 주제가 아래에 표시됩니다. 그러나 이 주제는 이 라이브러리에 포함되지 않습니다.

Windows Phone 8의 토스트 알림을 보내고 받는 방법

2014-06-18

적용 대상: Windows Phone 8 및 Windows Phone Silverlight 8.1 | Windows Phone OS 7.1

 

이 항목에서는 Microsoft 푸시 알림 서비스로 토스트 알림을 보내는 데 필요한 단계 및 Windows Phone 에서 실행 중인 앱에서 이 알림을 받는 방법에 대해 설명합니다. Windows Phone 8의 푸시 알림에서는 토스트 알림 및 사용 방법에 대해 설명합니다.

전체 토스트 알림 샘플을 다운로드할 수 있습니다.

중요중요:

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

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

 

이 섹션에서는 푸시 알림 채널을 만들고 토스트 알림 이벤트를 처리하는 Windows Phone 에서 실행되는 앱을 만듭니다.

중요중요:

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

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

  1. 새 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. MainPage.xaml.cs 파일 맨 위에 다음 using 지시문을 추가합니다.

    
    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 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 추가, 새 항목…, Web Form을 차례로 선택하여 프로젝트에 새 web form을 추가합니다.

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

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

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

    컨트롤 형식

    컨트롤 ID

    컨트롤 텍스트

    TextBox

    TextBoxUri

    URI 입력:

    TextBox

    TextBoxTitle

    제목 입력:

    TextBox

    TextBoxSubTitle

    부제목 입력:

    Button

    ButtonSendToast

    토스트 알림 보내기

    TextBox

    TextBoxResponse

    응답:

    Send Toast 버튼에 대해 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 에뮬레이터가 초기화되고 앱이 시작됩니다. 잠시 후 앱에 푸시 채널 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 으로 토스트 메시지를 보내는 방법을 알아보았습니다.

표시:
© 2016 Microsoft