今回は、Microsoft のプッシュ通知サービスを使って、Toast(トースト)とRaw(生)通知を送受信する2つのサンプルを紹介します。まず初めは、Toast通知の送受信のサンプルからです。
Windows PhoneによるToast通知の送受信
このサンプルは3つのプログラムから構成されています。トースト通知チャネルを生成して通知イベントに接続するWindows Phone 7.1のプログラム、通知チャネルをサーバーに保存するASP.NETプログラム、通知チャネルを取得してトーストの情報をWindows Phoneに送信するWPFプログラムの3つです。
このプログラムで実装する機能の動作を、下記に解説しておきます。トースト通知とはどんなものかがわかると思います。
最初に、Windows Phoneのプログラムを実行します。チャネルURIが表示されますので、[OK]をクリックします。チャネルURIをサーバーに保存したメッセージが表示されます。この画面でエラーが表示されることもありますが、サーバーにはチャネルURIは保存されていますので、[OK]をクリックします。「Start」アイコンをクリックし、→アイコンをクリックして、WP7_ToastNotificationをホールドし、「スタート画面に追加」を選択します。すると、WP7_ToastNotificationのタイルが表示されます(図1)。ここまでは、第5回の「Windows Phoneによるタイル通知の送受信」と同じです。

|
図1:WP7_ToastNotificationをホールドし、「スタート画面に追加」を選択すると、WP7_ToastNotificationのタイルが表示される(右図2枚)(クリックで拡大) |
この状態から次に、WPFのプログラムを起動します。実行すると、タイトルを入力する「Title」、サブタイトルを入力する「Sub Title」画面が表示されます。Titleに「光化学スモッグ注意報発令」、Sub Titleに「本日正午に発令」と入力して[Toast通知を送る]ボタンをクリックします(図2)。

|
図2:TitleとSub Titleを入力した(クリックで拡大) |
図2の状態から、[Toast通知を送る]をクリックすると、Windows PhoneエミュレーターのWP7_ToastNotificationタイルの上方にトーストが表示されます。トースト通知は、表示後10秒で画面から消えます(図3)。急きょ何らかのメッセージを知らせたい場合などに利用できます。

|
図3:エミュレーター上にトーストが表示された(クリックで拡大) |
サンプル一式は、会員限定特典としてダウンロードできます。記事末尾をご確認ください。
※サンプル実行でエラーが発生した場合は、「ソリューションのビルド」を実行後、再度、デバッグ開始を行ってください
サーバーに配置するASP.NETのファイルは「第5回:Windows Phoneによるタイル通知の送受信」に同じですので、コード、解説ともにそちらを参照してください。
まず初めに、Windows Phone 7.1のプロジェクトを作成します。
プロジェクトの作成
VS 2010のメニューから[ファイル(F)/新規作成(N)/プロジェクト(P)]を選択します。次に、「Windows Phone アプリケーション」を選択して、「名前(N)」に任意のプロジェクト名を指定します。ここでは「WP71_ToastNotification」という名前を付けています。Windows Phoneのバージョンは7.1を選択します。
MainPage.xamlの編集
x:NameがPageTitleというTextBlockコントロールのTextプロパティに「Toast Notification」と指定します。書き出されるXAMLコードは省略します。
ソリューションエクスプローラー内のMainPage.xamlを展開し、MainPage.xaml.vbをダブルクリックして、リスト1のコードを記述します。このリスト1のコードは「第5回:Windows Phoneによるタイル通知の送受信」と全く同じです。コードのみ掲載しますので、解説は第5回を参照してください。
日本語表示設定
Windows Phone 7.1 SDK RC 日本語版では、フォントの設定なしにアプリケーションを実行し、タイトルやテキストに日本語を使った場合、日本語フォントが使われないで変な表示になってしまうことがあります。これを解消するには、書き出されるXAMLコードのアプリケーションのトップである要素内に、Language="ja-JP" と指定しておきます。
ロジックコードを記述する
リスト1 (MainPage.xaml.vb)
2 | Imports Microsoft.Phone.Notification |
5 | Partial Public Class MainPage |
6 | Inherits PhoneApplicationPage |
ページが読み込まれた時の処理
01 | Private Sub MainPage_Loaded(sender As Object, e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded |
02 | Dim myPushChannel As HttpNotificationChannel |
03 | Dim myChannelName As String = "KySSToastSampleChannel" |
04 | myPushChannel = HttpNotificationChannel.Find(myChannelName) |
06 | If myPushChannel Is Nothing = True Then |
07 | myPushChannel = New HttpNotificationChannel(myChannelName) |
08 | AddHandler myPushChannel.ChannelUriUpdated, AddressOf myPushChannel_ChanelUriUpdated |
09 | AddHandler myPushChannel.ErrorOccurred, AddressOf myPushChannel_ErrorOccured |
11 | myPushChannel.BindToShellToast() |
13 | AddHandler myPushChannel.ChannelUriUpdated, AddressOf myPushChannel_ChanelUriUpdated |
14 | AddHandler myPushChannel.ErrorOccurred, AddressOf myPushChannel_ErrorOccured |
15 | MessageBox.Show(String.Format("チャネルのURI={0}", myPushChannel.ChannelUri.ToString())) |
16 | SendUriToServer(myPushChannel.ChannelUri.ToString()) |
通知チャネルに関連付けられた URI を返すイベント
1 | Private Sub myPushChannel_ChanelUriUpdated(sender As Object, e As NotificationChannelUriEventArgs) |
2 | Dispatcher.BeginInvoke(Sub() |
3 | 'System.Diagnostics.Debug.WriteLine(e.ChannelUri.ToString()) |
4 | MessageBox.Show(String.Format("チャネルのURI={0}", e.ChannelUri.ToString())) |
5 | SendUriToServer(e.ChannelUri.ToString()) |
何か予期しない動作が発生した場合に起きるイベント
1 | Private Sub myPushChannel_ErrorOccured(sender As Object, e As NotificationChannelErrorEventArgs) |
2 | Dispatcher.BeginInvoke(Sub() |
3 | MessageBox.Show(String.Format("Push Notification {0} Errorが発生。{1}{2}{3}", e.ErrorType, e.Message, e.ErrorCode, e.ErrorAdditionalData)) |
アクティブなチャネルURIをサーバーに送る処理(引数としてアクティブなチャネルURIを指定)
01 | 「サーバーのURL」にはTileNotification_NETをアップロードしたサーバーのURLを指定してください。ファイルへのアクセス許可やIISの設定は各自が行ってください。 |
02 | Private Sub SendUriToServer(myChannelUri As String) |
03 | Dim myWebClient As New WebClient |
05 | .Encoding = System.Text.Encoding.UTF8 |
06 | .Headers("content-type") = "application/x-www-form-urlencoded" |
09 | AddHandler myWebClient.UploadStringCompleted, Sub(resultSender As Object, resultArgs As UploadStringCompletedEventArgs) |
10 | MessageBox.Show(resultArgs.Result) |
12 | myWebClient.UploadStringAsync(New Uri("サーバーのURL/TileNotification_NET/Default.aspx", UriKind.Absolute), myChannelUri) |