Windows PhoneによるToastとRaw通知の送受信
通知チャネルを取得してトースト情報を送信する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