PR

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形式で通知される(クリックで拡大)

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

Think IT会員限定特典
  • 「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のWebサイトにログインすることでさまざまな限定特典を入手できるようになります。

Think IT会員サービスの概要とメリットをチェック

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