ROMANCE DAWN for the new world

Microsoft Azure を中心とした技術情報を書いています。

Windows Azure Notification Hub を使ってプッシュ通知する(後編)

gooner.hateblo.jp

前回の投稿では、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でライブタイルが表示されました。