Windows PhoneによるToastとRaw通知の送受信

2011年9月26日(月)
PROJECT KySS

通知チャネルを取得してトースト情報を送信するWPFプログラム

VS2010メニューから「ファイル(F)/新規作成(N)/プロジェクト(P) 」と選択し、「インストールされたテンプレート」から、「Windows」を選択します。右に表示されるパネルから「WPFアプリケーション」を選択します。「名前(N)」に「WPF_ToastNotification」と指定し、[OK]ボタンをクリックします。

コントロールのレイアウト

まず、Windowのプロパティから[レイアウト]パネルにあるWidthに646、Heightに245と指定します。この値は読者が自由に設定してください。

次に、ツールボックスからMainWindow.xamlのデザイン画面上に、TextBlockを2個、TextBoxを2個、Buttonを1個配置します。各コントロールの配置とNameは図4を参照してください。

図4:各コントロールを配置した(クリックで拡大)

書き出されるXAMLコードは省略します。

ソリューションエクスプローラー内のMainWindow.xamlを展開して表示される、MainWindow.xaml.vbをダブルクリックして、リスト2のコードを記述します。

ロジックコードを記述する

リスト2  (MainWindow.xaml.vb)

Option Strict On
Imports System.Net
Imports System.IO
Imports System.Text

Class MainWindow

getUriというメンバ変数を宣言します。
  Dim getUri As String = String.Empty

メインウィンドウが読み込まれた時の処理

新しいWebClientのインスタンスmyWebClientオブジェクトを生成します。WebClientクラスは、データの送受信用のメソッドを提供するクラスです。
String またはUriとして指定したリソースをダウンロードする、DownloadStringAsyncメソッドで、サーバー上のchannelUri.txtをダウンロードします。第5回で、サーバーにアップしているTileNotification_NETのDefault.aspxで保存されたチャネルURIを取得します。
AddHandlerメソッドで、非同期のリソース ダウンロード操作の完了時に発生する、DwonloadStringCompletedイベントに、イベントハンドラを追加します。メンバ変数getUriにダウンロードした結果を格納します。チャネルURIが格納されます。
サーバーに配置した、TileNotification_NETの、ASP.NETファイルへのアクセス許可やIISの設定は、各自が行ってください。
  Private Sub MainWindow_Loaded(sender As Object, e As System.Windows.RoutedEventArgs) Handles Me.Loaded
    Dim myWebClient As New WebClient
 
    AddHandler myWebClient.DownloadStringCompleted, Sub(resultSender As Object, resultArgs As DownloadStringCompletedEventArgs)
                     If resultArgs.Error Is Nothing = False Then
                                    MessageBox.Show("Channelファイルが見つかりません")
                                    Exit Sub
                     Else
                                    getUri = resultArgs.Result
                                       End If
                             End Sub
    myWebClient.DownloadStringAsync(New Uri("サーバーのURI/TileNotification_NET/SaveData/channelUri.txt", UriKind.Absolute))
  End Sub

[Toast通知を送る]ボタンがクリックされた時の処理

HttpWebRequestクラス型のsendToastNotificationオブジェクト変数を宣言し、WebRequest.Createメソッドで、指定したURI(getUri) で新しいWebRequest のインスタンスを初期化し、DirectCastで、HttpWebRequestクラスにキャストします。HttpWebRequestクラスは、URIへの要求を行うWebRequestクラスの 、HTTP 固有の実装を提供するクラスです。
HttpWebRequestクラスのMethodプロパティに「POST」を指定します。
変数myTitleにtitleTextBoxの値を、mySubTitle変数にsubTitleTextBoxの値を格納します。
Visual Basicの埋め込み式を用いて、XML 要素リテラルでtoastXml要素を作成しています。埋め込み式の構文は<%= expression %>で、ASP.NET で使用される構文と同じです。
<wp:Text1>要素の値には、myTitle変数の値を埋め込みます。<wp:Text2>要素の値には、mySubTitle変数の値を埋め込みます。
XElement.ParseメソッドでtoastXmlの内容を文字列として読み込みます。
 送信する通知のデータ本体を設定します。読み込んだXMLデータを、Encoding.UTF8.GetBytesメソッドでUTF8のバイトシーケンスにエンコードし、Byte型のmyNotificationMessage変数に格納します。
HttpRequestクラスのContentlengthにUTF8のバイトシーケンスにエンコードしたバイト数を指定します。ContentTypeにはtext/xml、HeadersにはAddメソッドで、「"X-WindowsPhone-Target", "toast"」と「"X-NotificationClass", "2"」を追加します。X-NotificationClassヘッダには、いつデバイスに通知するかを設定できます。”2”は「プッシュ通知サービスによって、すぐにメッセージを配信」する場合に指定します。”12”を指定すると「450 秒以内に、プッシュ通知サービスによってメッセージを配信」になり、”22”を指定すると「900 秒以内に、プッシュ通知サービスによってメッセージを配信」の意味になります。前回(第5回)のタイル通知の場合は、1、11、21の値のいずれかを指定しましたが、トースト通知では2、12、22の値になります。
  要求データを書き込むために使用する Stream オブジェクトmyStreamを宣言します。 StreamクラスのWriteメソッドでByte型のmyNotificationMessageを書き込みます。Writeメソッドの書式は下記の通りです。

Write(バイト配列,バイトのコピーを開始する位置でインデックスは0から,書き込むバイト数)

Closeメソッドで、Streamを閉じます。これで、Windows Phoneにトースト通知がなされます。
  Private Sub Button1_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles Button1.Click
    Dim sendToastNotification As HttpWebRequest = DirectCast(WebRequest.Create(getUri), HttpWebRequest)
    sendToastNotification.Method = "POST"
    Dim myTitle As String = titleTextBox.Text
    Dim mySubTitle As String = subTitleTextBox.Text
    Dim toastXml As XDocument = <?xml version="1.0" encoding="utf-8"?>
                              <wp:Notification xmlns:wp="WPNotification">
                                <wp:Toast>
                                  <wp:Text1><%= myTitle %></wp:Text1>
                                  <wp:Text2><%= mySubTitle %></wp:Text2>
                                </wp:Toast>
                              </wp:Notification>
    Dim readXmlData As XElement = XElement.Parse(toastXml.ToString)
    Dim myNotificationMessage As Byte() = Encoding.UTF8.GetBytes(readXmlData.ToString)
 
    With sendToastNotification
      .ContentLength = myNotificationMessage.Length
      .ContentType = "text/xml"
      .Headers.Add("X-WindowsPhone-Target", "toast")
      .Headers.Add("X-NotificationClass", "2")
    End With
 
    Dim myStream As Stream = sendToastNotification.GetRequestStream()
    myStream.Write(myNotificationMessage, 0, myNotificationMessage.Length)
    myStream.Close()
  End Sub
End Class

Windows PhoneによるRaw通知の送受信

今回は「生の通知」を送受信するサンプルの紹介です。

最初に、Windows Phoneのプログラムを実行します。チャネルURIが表示されますので、[OK]をクリックします。WPFのアプリケーションを実行します。サーバーには「第5回:Windows Phoneによるタイル通知の送受信」で解説した、TileNotification_NETが配置されています。このファイルは、Tile、Toast、Raw Notificationの3つで共通に使用します。

WPFのアプリケーションから、値1に「梅雨が明けた」、値2に「暑い夏がくる」と入力し、[生データを送る]ボタンをクリックします。Windows Phone上に値1と値2のデータがXML形式で通知されます(図5)。

図5:入力したデータがWindows Phone上にXML形式で通知される(クリックで拡大)

サンプル一式は、会員限定特典としてダウンロードできます。記事末尾をご確認ください。
※サンプル実行でエラーが発生した場合は、「ソリューションのビルド」を実行後、再度、デバッグ開始を行ってください

  • 「Windows PhoneによるToastとRaw通知の送受信」サンプルプログラム_1

  • 「Windows PhoneによるToastとRaw通知の送受信」サンプルプログラム_2

四国のSOHO。薬師寺国安(VBプログラマ)と、薬師寺聖(デザイナ、エンジニア)によるコラボレーション・ユニット。1997年6月、Dynamic HTMLとDirectAnimationの普及を目的として結成。共同開発やユニット名義での執筆活動を行う。XMLおよび.NETに関する著書や連載多数。最新刊は「Silverlight実践プログラミング」両名とも、Microsoft MVP for Development Platforms - Client App Dev (Oct 2003-Sep 2012)。http://www.PROJECTKySS.NET/

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています