前回の投稿では、Windows Azure Notification Hub(通知ハブ)を使わずにプッシュ通知したので、今回は通知ハブを使って実装してみました。通知ハブについては、こちらのMSDNが分かりやすかったです。
Windows Azure Notification Hub の作成
Azure ポータルから、通知ハブを作成します。ここでは、「goonerhub」という名前で作成しました。後ほど必要になるので、接続情報をメモしておきます。
- DefaultListenSharedAccessSignature
- DefaultFullSharedAccessSignature
チャネルURIの送信
Windows Store アプリからチャネルURIを送信します。通知ハブ用のライブラリを Nuget からインストールしておきます。
- Install-Package WindowsAzure.Messaging.Managed
Appクラスの OnLaunched メソッドなどで、通知ハブに送信します。DefaultListenSharedAccessSignatureを設定して、NotificationHub クラスをインスタンス化します。
#App.xaml.cs var channel = await PushNotificationChannelManager.CreatePushNotificationChannelForApplicationAsync(); var hub = new NotificationHub("goonerhub", "DefaultListenSharedAccessSignature"); var result = await hub.RegisterNativeAsync(channel.Uri);
ライブタイルのプッシュ通知
通知ハブに送信する Web API を作ります。POST api/hub へリクエストすると、通知ハブに送信します。通知ハブ用のライブラリを Nuget からインストールしておきます。
- Install-Package WindowsAzure.ServiceBus
DefaultFullSharedAccessSignatureを設定して、NotificationHubClient クラスをインスタンス化します。
#HubController.cs public class HubController : ApiController { public async Task<IHttpActionResult> Post([FromBody]string payload) { var client = NotificationHubClient.CreateClientFromConnectionString("DefaultFullSharedAccessSignature", "goonerhub"); await client.SendWindowsNativeNotificationAsync(payload); return Ok(); } }
結果確認
タイルテンプレートの XML を api/hub へ POST すると、プッシュ通知が行われます。
まとめ
通知ハブを使うと、バックエンドロジックの実装コストを大幅に削減できます。iOS や Android など対応デバイスが増えると、そのメリットはさらに大きくなります。また、数百台というデバイスにプッシュ通知する場合でも、通知ハブ側でスケーリングしてくれることも、大きなメリットです。気になったのは、WNS への要求ヘッダーで指定できた通知キューや有効期限などの設定が難しそうなことぐらいです。モバイルアプリを作るうえで、プッシュ通知は上手く活用したい技術なので、通知ハブは便利なサービスです。
まだプレビュー版ですが、ASP.NET Web API に対応した Windows Azure Mobile Services を利用すると、さらに便利に使えそうなので、時間を見つけて確認してみたいと思います。
おまけ
こちらにも記載されていますが、Windows 8.1 から大きなタイルが増えたので、タイルテンプレートの XML が Version 2 に更新されています。Windows 8 に新しいタイルテンプレートを通知してよいものか少し心配でしたが、fallback 属性があるので、8.0と8.1のチャネルURIを区別する必要はありません。実際に試してみましたが、それぞれのOSでライブタイルが表示されました。