情報
要求されたトピックは次のとおりです。しかし、このトピックはこのライブラリには含まれていません。

Windows Phone 8 用のトースト通知を送受信する方法

2014/06/18

対象: Windows Phone 8 および Windows Phone Silverlight 8.1 | Windows Phone OS 7.1

 

このトピックでは、Microsoft Push Notification Service にトースト通知を送信するのに必要な手順と、 Windows Phone で実行されているアプリでトースト通知を受信する方法を説明します。トースト通知およびその使用方法については、「Windows Phone 8 のプッシュ通知」を参照してください。

完全なトースト通知のサンプルをダウンロードできます。

重要:重要:

このトピックで説明する、Web サーバー上の ASP.NET Web ページからトースト通知を送信する手順では、完全版の Visual Studio または無料の Microsoft Visual Web Developer 2010 Express が必要です。

このトピックは、次のセクションで構成されています。

 

このセクションでは、Windows Phone 上で実行され、プッシュ通知チャンネルを作成し、トースト通知イベントを処理するアプリを作成します。

重要:重要:

わかりやすくするために、トースト通知の URI をコピーして、通知を送信する Web ページに貼り付けます。通常、この URI は、アプリ用に作成した Web サービスに渡されます。

トースト通知を受信するプッシュ クライアントを作成するには

  1. 新しい Windows Phone アプリを作成します。

  2. プロジェクトに「ToastNotificationClient」という名前を付けます。

  3. トースト メッセージでのパラメーターとナビゲーション情報の受け渡しを示すために、2 番目のページを追加します。 MainPage 上のボタンは 2 番目のページにナビゲートし、Main Page に設定された NavigatedFrom パラメーターを渡します。MainPage.xaml にボタンを追加するには、MainPage.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">
                <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. 2 番目のページを作成するには、ソリューション エクスプローラーで ToastNotificationClient プロジェクトを選択し、[プロジェクト] メニューの [新しい項目の追加] を選択します。新しい [Windows Phone Portrait Page] を追加し、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. ボタンのイベント ハンドラーを追加します。このボタンは、ページ 2 への移動と、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 は通常 Web サービスに送り返されます。

            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 のプッシュ クライアント コードが完成しました。このコードは、通知を送信する Web ページの作成が完了した後に実行します。

このセクションでは、デバイスでプッシュ チャンネルが作成されたときに返される URI を使用することによって、トースト通知を送信する ASP.NET Web ページを作成します。

ASP.NET プロジェクトを作成するには、Visual Studio の完全版または無料の Microsoft Visual Web Developer 2010 Express が必要です。

トースト通知を送信するための ASP.NET ページを作成するには

  1. Visual Studio のインスタンスをもう 1 つ開き、新しいアプリを作成します。テンプレートは [Web] の C# カテゴリにある [ASP.NET Empty Web Application] とします。

  2. プロジェクトに「SendToast」という名前を付けます。

  3. SendToast プロジェクト名を右クリックし、[追加]、[新しい項目]、[Web フォーム] の順に選択して、プロジェクトに新しい Web フォームを追加します。

  4. フォームに「SendToast」という名前を付け、[追加] をクリックします。

  5. ソリューション エクスプローラーで SendToast.aspx を右クリックし、[スタート ページに設定] をクリックして、SendToast フォームをスタート ページとして設定します。

  6. 次の手順は、SendToast.aspx Web フォームに以下のコントロールを追加することです。

    コントロールの型

    コントロール 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 Push Notification Service にポストします。トースト メッセージは、アプリに対して、Page2.xaml に移動するよう指示し、NavigatedFrom の値 Toast Notification を渡します。

            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 を取得するプッシュ クライアント コードを実行します。次に、Web ページでこの URI を使用して、トーストを送信します。

サンプルを実行するには

  1. ToastNotificationClient プロジェクトに戻って、これを実行します。Windows Phone エミュレーターが初期化した後に、アプリが起動します。しばらくすると、アプリによってプッシュ チャンネルの URI を含むメッセージが表示されます。この URI は Visual Studio デバッガーの [出力] ウィンドウにも表示されます。

    AP_Push_OutputWindow
    ヒントヒント:

    Visual Studio 2010 Express for Windows Phone では、既定の設定がデバッグ セッションの実行中に [出力] ウィンドウに表示されることはありません。[出力] ウィンドウを表示するには、[デバッグ] メニューで [Windows] を選択してから、[出力] を選択します。ウィンドウをスクロールして URI を確認します。

  2. これで通知チャンネルの作成が完了しました。Visual Studio デバッガーの [出力] ウィンドウからクリップボードに URI をコピーします。

  3. SendToast プロジェクトに切り替えて、これを実行します。

  4. URI テキスト ボックスに、以前のプロジェクトからコピーした URI を貼り付けます。

  5. トーストのタイトルとサブタイトルを入力します。[Send Toast] ボタンをクリックします。

    AP_Push_SendToast
  6. エミュレーターで実行中の Windows Phone アプリで、トーストが受信されます。アプリが実行されている場合、トースト情報を含むメッセージ ボックスが表示されます。

    AP_Push_ToastEvent

    アプリが実行されていない場合、画面の上部にアラートが表示されます。アラートをタップすると、ToastNotificationClient が起動し、Page2 に移動します。

    AP_Push_ToastMessageAP_Push_ToastRunning

ここでは、ASP.NET ページから Windows Phone にトースト メッセージを送信する方法について説明しました。

表示: