先日、Windows Azureメディアサービスが正式サービス提供(GA)されました。
同日に、Windows Azureサービスバスの新機能の、プレビューが開始されました。
その名も「通知ハブ」。日本語では「通知ハブ」ですが、英語ではNotification Hubsです。
Windows 8ストアアプリケーションやiOSアプリケーション(現時点)に対し一斉にプッシュ通知を実行することのできるサービスです。
アプリの更新のお知らせや、重要な情報提供などといった様なプッシュ型の通知が容易に実現できます。
また、タグ分類により特定のタグで待ち受けている受信者にだけがメッセージを受信することができるようになっています。
概要は以下のURLにて紹介されています。
Windows Azure Service Bus Notification Hubs (英語情報)
それでは、Windowsストアアプリに対してプッシュ通知を設定してみましょう。
プッシュ通知を実行するには、まずWindows ストアアプリをストアへ関連付けし、名前を予約しておきます。
ソリューションエクスプローラーのストアアプリプロジェクトでコンテキストメニューを表示し、「ストア」メニューから「アプリケーションをストアと関連付ける」を選択します。
(注:関連付けにはあらかじめログインに使用するMicrosoftアカウントでストアプリの開発者登録(有償)をしておく必要があります。)

ウィザード中の「アプリケーションの選択」にて「名前を予約」をクリックし、アプリケーションの名前を予約します。

ダッシュボードで名前を予約後、予約したアプリケーションの「高度な機能」のリンクをクリックします。
ページ中の「プッシュ通知と Live Connect サービスの情報」をクリックし、「プッシュ通知と Live Connect サービスの情報」ページにて、プッシュ通知に必要な情報を入手しておきます。
具体的には、パッケージSIDとクライアントシークレットの2種類に情報が必要となります。これらの情報をコピーしておきます。
これらの情報は「プッシュ通知と Live Connect サービスの情報」ページ内で「サービスの認証」をクリックすると表示されます。
次にWindows Azure管理ポータルで通知ハブのサービスを作成します。
「新規作成」→「アプリサービス」→「SERVICE BUS通知ハブ」を選択し、通知ハブを作成します。

通知ハブを作成後、作成された通知ハブを選択し、「構成」タブをクリックします。
ここで、windows通知を設定します。先ほどコピーしておいたパッケージSIDとクライアントシークレットを入力して。「保存」をクリックして設定は完了です。

以上で、設定に関する項目は完了です。
続いて、アプリケーションをインプリメントしていきましょう。
まず、Windowsストアアプリが通知ハブのプッシュ通知受信を有効化するための手順を紹介します。
その前に、WindowsストアアプリでWindows Azureメッセージングを利用するためのライブラリを入手しておく必要があります。
Windows Azure Messaging Managedライブラリ(ZIP書庫)
ダウンロード&解凍後、ストアアプリのプロジェクトにMicrosoft.WindowsAzure.Messaging.Managed.dllへの参照を追加します。
次に、ストアアプリプロジェクトのApp.Xaml.csを開きます。
まず、usingに以下の定義を追加します。
using Microsoft.WindowsAzure.Messaging;
次にAppクラスのメンバ変数に以下の定義を追加します。
NotificationHub notificationHub;
続いて、Appコンストラクタを以下のように書き換えます。
public App()
{
var cn = ConnectionString.CreateUsingSharedAccessSecretWithListenAccess(
“sb://yournamespace.servicebus.windows.net/”,“… insert DefaultListenSharedAccessSignature key …”);
notificationHub = new NotificationHub(“yourhub”, cn);
this.InitializeComponent();
this.Suspending += OnSuspending;
}
このコード中のエンドポイントのURI中のyournamespaceを自身で作成したサービスバス名前空間名に、そしてNoticidationHubコンストラクタの引数である”yourhub”を作成した通知ハブ名に変更します。
また、… insert DefaultListenSharedAccessSignature key …の部分をリッスン専用の共有アクセスキーに置き換えます。これらのキーは管理ポータルで通知ハブを開いているときに表示される「SASキーの表示」をクリックすると以下のようなフォームが表示されます。

この中の「リッスン」のキー値をコピーし、当該部分にペーストします。
これで、コンストラクタのインプリメントは完了です。
次に、Appクラスに以下の2種のメソッドを追加します。
通知を実行するアプリケーションでは、利用する通知テンプレートをあらかじめ定義する必要があるため、利用する通知テンプレートがすでに存在するか否かをチェックし、存在しない場合は通知テンプレートを新規に登録する必要があります。
2つのメソッドは、そのためのメソッドです。
#このコード中の”TemplateName”の値は任意の名前に変更しておきます。
async Task InitializeNotificationsAsync()
{
await notificationHub.RefreshRegistrationsAsync();
if (!await notificationHub.RegistrationExistsForApplicationAsync(“TemplateName“))
{
await notificationHub.CreateTemplateRegistrationForApplicationAsync(
BuildTextToastTemplate(), “TemplateName“);
}
}
XmlDocument BuildTextToastTemplate()
{
var template =
ToastNotificationManager.
GetTemplateContent(ToastTemplateType.ToastText01);
var textNode = template.SelectSingleNode(“//text[@id=’1′]”) as XmlElement;
if (textNode != null)
{
textNode.InnerText = “$(msg)”;
}
return template;
}
このサンプルでは、シンプルなテキストのみのトースト通知を利用していますが、他のテンプレートを用いると、画像を張り付けることも可能です。利用可能なテンプレートの一覧と、テンプレートのソース(XML)はトースト テンプレート カタログ (Windows ストア アプリ) (Windows)にて表示サンプルとともに紹介されておりますので、適宜ご参照ください。
次に、App.Xaml.cs中のOnLanchedメソッドにawait属性を追加します。
protected async override void OnLaunched(LaunchActivatedEventArgs args)
続いて、OnLanchedメソッドでInitializeNotificationsAsyncを呼び出します。
await InitializeNotificationsAsync();
また、必須ではないようですが、必要に応じてOnActivatedイベントハンドラをオーバーライドしておきます。
protected async override void OnActivated(IActivatedEventArgs args)
{
base.OnActivated(args);
await InitializeNotificationsAsync();
}
OnActivatedイベントハンドラ内でもInitializeNotificationsAsyncを呼び出しておきます。
これでストアアプリへのインプリメントは完了です。
続いて、メッセージを送信するアプリケーションを作成しましょう。
これはASP .NET WebアプリケーションでもWPFアプリケーションでもWindowsフォームアプリケーションでも構いません。
今回は、Windows Azure Webサイトにデプロイ可能なASP .NET Webアプリケーションを利用します。
最初に、ServiceBus Previewを利用するためのService Bus preview featuresパッケージをNuGetから入手します。

パッケージのインストール後、以下のような簡単なWebフォームを用意し、ボタンクリック内にコードをインプリメントしていきます。

ボタンクリックのイベントハンドラのコードを以下に示します。
protected void btnSendMessage_Click(object sender, EventArgs e)
{
string connectionString
= ServiceBusConnectionStringBuilder
.CreateUsingSharedAccessSecretWithFullAccess(“yournamespace”,
“… insert DefaultFullSharedAccessSignature key …“);
var hubClient = NotificationHubClient.CreateClientFromConnectionString(connectionString,“yourhub”);
hubClient.SendTemplateNotification(
new Dictionary<string, string>
{
{“msg”, txtMessageBody.Text}
});
txtMessageBody.Text = “”;
}
このコード中の接続文字列のパラメータで指定されているyournamespaceを自身で作成したサービスバス名前空間名に、そしてCreateClientFromConnectionStringメソッドの第2引数である”yourhub”を作成した通知ハブ名に変更します。
また、”… insert DefaultFullSharedAccessSignature key …”は管理ポータルから「リッスン、管理、送信」のSASキーをコピーしてペーストします。
メッセージの送信はhubClient.SendTemplateNotificationメソッドを実行します。
メッセージ本文は「msg」というキーで表現されています。このキーは、Windows ストアアプリのテンプレート定義で用いたキーワードです。
そこで、Dictionary項目にmsgを追加します。
この際、表示したい文章を値に格納しておけばOKです。
これで、すべて完了です。
それでは、実際にアプリケーションを実行してみましょう。
Webフォームから以下のような文字列を入力し、送信ボタンをクリックします。

送信ボタンクリック直後に、画面右上にトーストが表示されれば、メッセージは正しく配信されています。

また、管理ポータルのダッシュボードにもメッセージ配信の状況がグラフ化され表示されます。

このように、簡単にトースト通知が実現できるようになりました。
なお、この記事はMSDNサイトのService Bus Notification Hub Tutorial: Windows 8 and C#(英語)をもとに記述しております。
併せて参照することをお勧めします。
[…] マルチデバイス向けにPush通知を提供するWindows Azure通知ハブ […]
[…] マルチデバイス向けにPush通知を提供するWindows Azure通知ハブ […]