タイルとバッジのライフサイクル運用(Microsoft Azure Mobile Service)編

「タイルとバッジのライフサイクル実装(Azure)編」で、Microsoft Azure Notifications Hubの通知を受けとる方法を解説しました。ここでは、Microsoft Azure Mobile Serviceを使って認証を行う方法を解説します。この認証により、クライアントがタグを登録してチャンネルを開いた後、タグをMicrosoft Azure Mobile Service側で管理することができます。タグをMicrosoft Azure Notifications Hubでチャンネル単位で管理するのでなく、Microsoft Azure Mobile Serviceでユーザー単位で管理するための準備です。Microsoft Azure Mobile Serviceで管理する方法を含めたタグの継続的サポート、Microsoft Azure Mobile Serviceのバックエンド・プログラムのメンテナンス、バッジの送信、遠隔監視などの解説は「タイルとバッジのライフサイクル運用(タグの管理)編」で行っています。

サンプル・ソリューション

・Microsoft Azure Mobile Serviceを使う

Microsoft Azure Service Busを直接操作する方法の他に、Microsoft Azure Mobile Serviceの機能を使ってMicrosoft Azure Notifications Hubとの通知の受送信を行う方法があります。Microsoft Azure Service Busに直接通知を送信する方法は以下のような感じです。

    NotificationHubClient hub = NotificationHubClient
        .CreateClientFromConnectionString
            ("DefaultFullSharedAccessSignatureコード", "通知ハブ名");
    string toastTemplate =
        @"<toast><visual><binding template='ToastText01'>
                <text id='1'>{0}</text>
            </binding></visual></toast>";
    var message = string.Format(toastTemplate,"Lady Gaga updates photos at Instagram");
    //タグ「Lady_Gaga」を登録しているチャンネル(端末)にプッシュ
    await hub.SendWindowsNativeNotificationAsync(message,"Lady_Gaga");
    //全チャンネル(端末)にプッシュ
    await hub.SendWindowsNativeNotificationAsync(message);

これは、コンソールアプリケーションとして実装できる最もシンプルな通知発行の処理ですので、Service Bus Explorerを使うまでも無いようなケースでは、このコンソールアプリケーションを使ってください。サンプルアプリケーションのPushNotificationConsoleプロジェクトにあります。

Microsoft Azure Mobile Serviceを使うと、認証済みの通知発行、受信を容易に構築することができます。Microsoft Azure Mobile Serviceのバックエンド・プログラムに認証を要求するオプションを設定することで、チャンネルの登録時にMicrosoft Azure Mobile Serviceの認証機能を通してユーザーを管理することができます。タグを管理する際、端末(チャンネル)ごとにタグを管理するのでなく、ユーザーごとに管理することができ保守性が向上します。また、ユーザーにとっても複数のIdentity Providerを利用できることから利便性が向上します。その他、多くの通知を配信するシステムを構築する際に考慮することですが、SilverlightやWindows Phone 8が利用するMicrosoft Push Notification Serviceに通知を発行する場合、認証済みのWebサービスでないと500/日に制限されますので、それを回避するという意味もあります。


※出典:Microsoft Productivity Future Vision – 将来のデバイス数を考慮するとユーザー単位のタグ管理は必須

Microsoft Azure Service Busでの通知発行をMicrosoft Azure Mobile Serviceでの通知発行へ変更する方法はいくつかあります。最も簡単な方法は、Visual Studio 2013 Update 2以降でプロジェクトのコンテキストメニューから[追加]-[プッシュ通知]を選択する方法を使います。その後少し変更を加え、通知を発行するプログラムをMicrosoft Azure Mobile Serviceからダウンロードしてソリューションに組み込み、それを認証を使うように変更し、Microsoft Azure Mobile Serviceに発行して運用に使うという流れが適しています。

導通試験にService Bus Explorerを使ってストアアプリを作成し、運用時の通知発行のバックエンド・プログラムを分離したスキームで構築したいケースは、多くの開発現場で必要な作業分割と考えます。そのようなケースに向いている構築の流れが、AzureポータルからMicrosoft Azure Mobile Serviceを作成し、ダッシュボードからバックエンド・プログラムのみをダウンロードしてローカルWebサーバーで開発、Azureへ発行して実運用という流れです。

以下に既存のMicrosoft Azure Mobile Serviceを使う手順を解説してあります。新規にMicrosoft Azure Mobile Serviceを作成する手順は、その下の「・認証を設定する」に解説してあります。

・Microsoft Azure Mobile Serviceによる通知の受信

1.Visual Studioでストアアプリを開きます。ユニバーサル・アプリの空のプロジェクトを新規に作成しても良いですし、前回のサンプルを使って手順を進めていくのも良いかと思います。ただし、サンプル・ソリューションはappxmanifestでトーストなどを許可しています。新規に作成する場合は、「Notification Hubs の使用」を参照して、パッケージの設定を行っておいてください。Windows側のプロジェクトのコンテキストメニューから[追加]-[プッシュ通知]を選択しウィザードを開始します。

2.ストアにサインインし、アカウント保護などひと通りの手順を行って対象のアプリケーションを選択します。

3.Microsoft Azureにサインインし、Mobile Serviceを選択して組み込みは終了です。

・Phone側も設定する

同じ作業をPhone側のプロジェクトに対して行うのも良いのですが、無駄なディレクティブがApp.xaml.csに挿入されてしまうので、手作業でソリューションを整理していきます。

まず、SharedのApp.xaml.csを編集します。Windowsディレクティブで囲まれている部分を削除し、Phone側にも適用します。

    public sealed partial class App : Application
    {
//コメントアウトし、Phone側にも適用
//#if WINDOWS_APP
        public static MobileServiceClient LinkingSongsClient
            = new MobileServiceClient("https://linkingsongs.azure-mobile.net/",
                "OCvDSyYXuMNyTZIDghRshUpuSDLznl61");
//#endif
	...
        public App()
        {
            ...
        }
	...
        protected override void OnLaunched(LaunchActivatedEventArgs e)
        {
            ...
            Window.Current.Activate();
            //サンプル・ソリューションを使っている場合、InitNotificationsAsyncをコメントアウト
            //InitNotificationsAsync();
            //ディレクティブを外し、以下を追加
            //自動挿入されたMobileサービス・プロキシのUploadChannelを
            //自作のAuthAsyncの後に実行するように定義する。
            AuthAsync().GetAwaiter().OnCompleted(() =>
            {
                LinkingSongsPush.UploadChannel();
            });
        }
        //AuthAsyncを自作する
        private static async Task AuthAsync()
        {
            return await LinkingSongsClient
                .LoginAsync(MobileServiceAuthenticationProvider.Facebook);
        }
	...
        //サンプル・ソリューションを使っている場合、
        //InitNotificationsAsyncは使わないので削除しても良い
        private async void InitNotificationsAsync()
        {
        ...
        }
        ...
    }

サービス・フォルダにあるpush.register.csをShared(ルートでよい)に移動してサービス・フォルダを削除します。また、以下のように編集します。

    internal class LinkingSongsPush
    {
        static PushNotificationChannel channel { get; set; }
        public async static void UploadChannel()
        {
            try
            {
                if (channel == null)
                {
                    channel = await PushNotificationChannelManager
                        .CreatePushNotificationChannelForApplicationAsync();
                }
                await App.LinkingSongsClient.GetPush()
                    .RegisterNativeAsync(channel.Uri);
                var dialog = new MessageDialog("Registration success, expire at : "
                    + channel.ExpirationTime.ToString());
                dialog.Commands.Add(new UICommand("OK"));
                await dialog.ShowAsync();
            }
            catch (Exception exception)
            {
                HandleRegisterException(exception);
            }
        }
        private static async void HandleRegisterException(Exception exception)
        {
            var dialog =
                new MessageDialog("Registration fault: " + exception.ToString());
            dialog.Commands.Add(new UICommand("OK"));
            await dialog.ShowAsync();
        }
    }

モバイル サービスでの Facebook 認証用のアプリケーションの登録」を参考にFacebookのアプリケーションを設定し、Microsoft Azure Mobile ServiceのIDを構成したら、Windows側をスタートアップ・プロジェクトにしてF5で実行します。

・認証を設定する

Microsoft Azure Mobile Serviceに認証を設定する最もシンプルな方法は、Microsoft Azure Mobile Serviceを作成して、ダッシュボードからコードをダウンロード、認証の編集を行ってMicrosoft Azure Mobile Serviceへ発行という手順です。

1.Microsoft AzureポータルからMobile Serviceを選択し、新規作成を行います。モバイルサービス名、データベース、通知ハブを設定します。既存の通知ハブを選択する場合は、他のストアアプリと紐づけられていないものを選ぶか、新規に作成してください。通知ハブはストアアプリのパッケージSIDとストアアプリに紐づけられたLiveサービスのクライアント・シークレットを設定してストアアプリ固有のものになります。

2.[ダッシュボード]の左のクイックスタートアイコン(雲に雷のマーク)を選択し、[既存の Windows アプリまたは Windows Phone アプリに接続する]から[ダウンロード]を選択してダウンロードします。

3.解凍してサービス・フォルダ(例では「LinkingSongsService」フォルダ)を既存のソリューションのフォルダにコピーし、Visual Studioのソリューション・エクスプローラーで、ソリューションのコンテキストメニューから[追加]-[既存のプロジェクト]を選択してソリューションに追加します。App_StartフォルダのWebApiConfig.csのRegisterメソッドに以下の1行を追加します。

options.PushAuthorization =
    Microsoft.WindowsAzure.Mobile.Service.Security.AuthorizationLevel.User;

4.App.xaml.csのAuthAsyncをコメントアウトして、F5でエラーなく実行できることを確認してください。

    //AuthAsync().GetAwaiter().OnCompleted(() =>
    //{
    //    LinkingSongsPush.UploadChannel();
    //});
    LinkingSongsPush.UploadChannel();

5.サービスを発行してエラーが発生することを確認します。先ほど組み込んだサービスのプロジェクト(例では「LinkingSongsService」プロジェクト)のコンテキストメニューから発行を選択してウィザードを開始します。

6.通知ハブを選択し、接続を検証したら既定のまま進み発行のプレビューを選択します。

7.発行を行い、サービスが正常に動いていることを確認したら、F5でエラーが発生することを確認します。

8.App.xaml.csのAuthAsyncを元に戻して、F5でエラーなく実行できることを確認してください。

    AuthAsync().GetAwaiter().OnCompleted(() =>
    {
        LinkingSongsPush.UploadChannel();
    });
    //LinkingSongsPush.UploadChannel();

About takao

I'm Microsoft MVP since June 2010.