チュートリアル: ユニバーサル Windows プラットフォーム アプリケーションを実行している特定のデバイスに通知を送信する

Note

Microsoft プッシュ通知サービス (MPNS) は非推奨とされ、サポートされなくなりました。

概要

このチュートリアルでは、Azure Notification Hubs を使用してニュース速報通知をブロードキャストする方法を示します。 このチュートリアルでは、Windows ストアまたは Windows Phone 8.1 (Silverlight 以外) アプリケーションについて取り上げます。 Windows Phone 8.1 Silverlight をターゲットにしている場合は、「Azure Notification Hubs を使用して特定の Windows Phone デバイスにプッシュ通知を送信する」を参照してください。

このチュートリアルでは、Azure Notification Hubs を使用して、ユニバーサル Windows プラットフォーム (UWP) アプリケーションを実行している特定の Windows デバイスにプッシュ通知を送信する方法について学習します。 このチュートリアルの完了後、興味があるニュース速報のカテゴリを登録できます。 それらのカテゴリのプッシュ通知のみが届きます。

ブロードキャストのシナリオに対応するには、通知ハブに登録を作成するときに "タグ" (複数可) を追加します。 通知がタグに送信されると、タグに登録されたすべてのデバイスが通知を受信します。 タグの詳細については、「ルーティングとタグ式」を参照してください。

Note

Visual Studio 2019 では、Windows ストアと Windows Phone のバージョン 8.1 以前のプロジェクトはサポートされていません。 詳細については、「Visual Studio 2019 の対象プラットフォームと互換性」を参照してください。

このチュートリアルでは、次のタスクを行います。

  • モバイル アプリにカテゴリ選択を追加する
  • 通知を登録する
  • タグ付けされた通知を送信する
  • アプリケーションを実行して通知を生成する

前提条件

このチュートリアルを開始する前に、Azure Notification Hubs を使用してユニバーサル Windows プラットフォーム アプリに通知を送信する方法に関するチュートリアルを完了してください。

アプリケーションにカテゴリ選択を追加する

最初の手順は、既存のメイン ページに UI 要素を追加して、登録するカテゴリをユーザーが選択できるようにすることです。 選択されたカテゴリはデバイスに格納されます。 アプリが起動すると、通知ハブにデバイス登録が作成され、選択されたカテゴリがタグとして追加されます。

  1. MainPage.xaml プロジェクト ファイルを開き、Grid 要素に次のコードをコピーします。

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <TextBlock Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2"  TextWrapping="Wrap" Text="Breaking News" FontSize="42" VerticalAlignment="Top" HorizontalAlignment="Center"/>
        <ToggleSwitch Header="World" Name="WorldToggle" Grid.Row="1" Grid.Column="0" HorizontalAlignment="Center"/>
        <ToggleSwitch Header="Politics" Name="PoliticsToggle" Grid.Row="2" Grid.Column="0" HorizontalAlignment="Center"/>
        <ToggleSwitch Header="Business" Name="BusinessToggle" Grid.Row="3" Grid.Column="0" HorizontalAlignment="Center"/>
        <ToggleSwitch Header="Technology" Name="TechnologyToggle" Grid.Row="1" Grid.Column="1" HorizontalAlignment="Center"/>
        <ToggleSwitch Header="Science" Name="ScienceToggle" Grid.Row="2" Grid.Column="1" HorizontalAlignment="Center"/>
        <ToggleSwitch Header="Sports" Name="SportsToggle" Grid.Row="3" Grid.Column="1" HorizontalAlignment="Center"/>
        <Button Name="SubscribeButton" Content="Subscribe" HorizontalAlignment="Center" Grid.Row="4" Grid.Column="0" Grid.ColumnSpan="2" Click="SubscribeButton_Click"/>
    </Grid>
    
  2. ソリューション エクスプローラーで、プロジェクトを右クリックし、[追加]>[クラス] の順に選択します。 [新しい項目の追加] で、クラスに Notifications という名前を付けて、[追加] を選択します。 必要に応じてクラス定義に public 修飾子を追加します。

  3. 次の using ステートメントを新しいファイルに追加します。

    using Windows.Networking.PushNotifications;
    using Microsoft.WindowsAzure.Messaging;
    using Windows.Storage;
    using System.Threading.Tasks;
    
  4. 新しい Notifications クラスに次のコードをコピーします。

    private NotificationHub hub;
    
    public Notifications(string hubName, string listenConnectionString)
    {
        hub = new NotificationHub(hubName, listenConnectionString);
    }
    
    public async Task<Registration> StoreCategoriesAndSubscribe(IEnumerable<string> categories)
    {
        ApplicationData.Current.LocalSettings.Values["categories"] = string.Join(",", categories);
        return await SubscribeToCategories(categories);
    }
    
    public IEnumerable<string> RetrieveCategories()
    {
        var categories = (string) ApplicationData.Current.LocalSettings.Values["categories"];
        return categories != null ? categories.Split(','): new string[0];
    }
    
    public async Task<Registration> SubscribeToCategories(IEnumerable<string> categories = null)
    {
        var channel = await PushNotificationChannelManager.CreatePushNotificationChannelForApplicationAsync();
    
        if (categories == null)
        {
            categories = RetrieveCategories();
        }
    
        // Using a template registration to support notifications across platforms.
        // Any template notifications that contain messageParam and a corresponding tag expression
        // will be delivered for this registration.
    
        const string templateBodyWNS = "<toast><visual><binding template=\"ToastText01\"><text id=\"1\">$(messageParam)</text></binding></visual></toast>";
    
        return await hub.RegisterTemplateAsync(channel.Uri, templateBodyWNS, "simpleWNSTemplateExample",
                categories);
    }
    

    このクラスは、ローカル記憶域を使用して、このデバイスが受信する必要があるニュースのカテゴリを格納します。 RegisterNativeAsync メソッドを呼び出す代わりに、RegisterTemplateAsync を呼び出して、テンプレート登録を使用してカテゴリを登録します。

    1 つ以上のテンプレートを登録する場合、テンプレート名 (たとえば、simpleWNSTemplateExample) を指定します。 テンプレートを更新または削除できるように、テンプレートに名前を付けます。 複数 (トースト通知用に 1 つとタイル用に 1 つ) のテンプレートを登録することもあるでしょう。

    注意

    Notification Hubs では、デバイスが同じタグを使用して複数のテンプレートを登録できます。 この場合、そのタグをターゲットとするメッセージが受信されると複数の通知がデバイスに配信されます (テンプレートごとに 1 つずつ)。 このプロセスにより、複数のビジュアル通知に同じメッセージを表示することが可能になります (Windows ストア アプリでバッジとトースト通知の両方として表示するなど)。により、複数のビジュアル通知に同じメッセージを表示することが可能になります (Windows ストア アプリでバッジとトースト通知の両方として表示するなど)。

    詳細については、「 テンプレート」を参照してください。

  5. App.xaml.cs プロジェクト ファイルで、次のプロパティを App クラスに追加します。

    public Notifications notifications = new Notifications("<hub name>", "<connection string with listen access>");
    

    このプロパティを使用して、Notifications インスタンスを作成してアクセスします。

    コードのプレースホルダーである <hub name><connection string with listen access> を、通知ハブの名前と既に取得してある DefaultListenSharedAccessSignature の接続文字列に置き換えます。

    Note

    クライアント アプリを使用して配布される資格情報は一般にセキュリティで保護されないため、クライアント アプリではリッスン アクセス用のキーだけを配布してください。 リッスン アクセスでは、通知用にアプリを登録できますが、既存の登録を変更することはできず、通知を送信することはできません。 通知を送信し既存の登録を変更するセキュリティで保護されたバックエンド サービスでは、フル アクセス キーが使用されます。

  6. MainPage.xaml.cs ファイルに、次の行を追加します。

    using Windows.UI.Popups;
    
  7. MainPage.xaml.cs ファイルに、次のメソッドを追加します。

    private async void SubscribeButton_Click(object sender, RoutedEventArgs e)
    {
        var categories = new HashSet<string>();
        if (WorldToggle.IsOn) categories.Add("World");
        if (PoliticsToggle.IsOn) categories.Add("Politics");
        if (BusinessToggle.IsOn) categories.Add("Business");
        if (TechnologyToggle.IsOn) categories.Add("Technology");
        if (ScienceToggle.IsOn) categories.Add("Science");
        if (SportsToggle.IsOn) categories.Add("Sports");
    
        var result = await ((App)Application.Current).notifications.StoreCategoriesAndSubscribe(categories);
    
        var dialog = new MessageDialog("Subscribed to: " + string.Join(",", categories) + " on registration Id: " + result.RegistrationId);
        dialog.Commands.Add(new UICommand("OK"));
        await dialog.ShowAsync();
    }
    

    このメソッドは、カテゴリのリストを作成し、Notifications クラスを使用してリストをローカル記憶域に格納します。 さらに、対応するタグを通知ハブに登録します。 カテゴリが変更されると、新しいカテゴリで登録が再作成されます。

これで、アプリは、デバイス上のローカル記憶域にカテゴリ セットを格納できます。 アプリは、ユーザーがカテゴリの選択を変更するたびに、通知ハブに登録します。

通知を登録する

このセクションでは、ローカル記憶域に格納されたカテゴリを使用して、起動時に通知ハブに通知します。

注意

Windows Notification Service (WNS) によって割り当てられたチャネル URI はいつでも変更される可能性があるため、通知を頻繁に登録して通知エラーを回避する必要があります。 この例では、アプリケーションが起動するたびに通知を登録します。 頻繁に (たとえば 1 日に複数回) 実行されるアプリでは、前回の登録から 1 日経過していない場合は、帯域幅を節約するために登録をスキップすることもできます。

  1. notifications クラスを使用してカテゴリに基づいてサブスクライブするには、App.xaml.cs ファイルを開き、InitNotificationsAsync メソッドを更新します。

    // *** Remove or comment out these lines ***
    //var channel = await PushNotificationChannelManager.CreatePushNotificationChannelForApplicationAsync();
    //var hub = new NotificationHub("your hub name", "your listen connection string");
    //var result = await hub.RegisterNativeAsync(channel.Uri);
    
    var result = await notifications.SubscribeToCategories();
    

    このプロセスにより、アプリが起動されたときに確実にローカル記憶域からカテゴリが取得されます。 その後、それらのカテゴリの登録が要求されます。 InitNotificationsAsync メソッドは、「Azure Notification Hubs を使用してユニバーサル Windows プラットフォーム アプリに通知を送信する」のチュートリアルの中で作成しました。

  2. MainPage.xaml.cs プロジェクト ファイルで、OnNavigatedTo メソッドに次のコードを追加します。

    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        var categories = ((App)Application.Current).notifications.RetrieveCategories();
    
        if (categories.Contains("World")) WorldToggle.IsOn = true;
        if (categories.Contains("Politics")) PoliticsToggle.IsOn = true;
        if (categories.Contains("Business")) BusinessToggle.IsOn = true;
        if (categories.Contains("Technology")) TechnologyToggle.IsOn = true;
        if (categories.Contains("Science")) ScienceToggle.IsOn = true;
        if (categories.Contains("Sports")) SportsToggle.IsOn = true;
    }
    

    このコードは、以前に保存されたカテゴリの状態に基づいてメイン ページを更新します。

これでアプリは完成しました。 デバイスのローカル記憶域に一連のカテゴリを格納することができます。 ユーザーがカテゴリの選択を変更すると、保存済みのカテゴリを使用して通知ハブへの登録が行われます。 次のセクションでは、このアプリにカテゴリ通知を送信できるバックエンドを定義します。

UWP アプリを実行する

  1. Visual Studio で、F5 キーを押して、アプリのコンパイルと起動を行います。 アプリの UI には、購読するカテゴリを選択できる一連の切り替えボタンが表示されます。

    ニュース速報アプリ

  2. 1 つ以上のカテゴリ切り替えボタンを有効にし、[購読] を選択します。

    アプリケーションにより、選択されたカテゴリがタグに変換され、選択されたタグの新しいデバイス登録が通知ハブから要求されます。 登録済みのカテゴリがダイアログ ボックスに表示されます。

    カテゴリの切り替えと [購読] ボタン

タグ付けされた通知を送信するコンソール アプリを作成する

このセクションでは、.NET コンソール アプリから、タグ付けされたテンプレート通知としてニュース速報を送信します。

  1. Visual Studio で、Visual C# の新しいコンソール アプリケーションを作成します。

    1. メニューで、 [ファイル]>[新規作成]>[プロジェクト] を選択します。
    2. [新しいプロジェクトの作成] で、テンプレートのリストで C# の [コンソール アプリ (.NET Framework)] を選択し、[次へ] を選択します。
    3. アプリの名前を入力します。
    4. [ソリューション] で、[ソリューションに追加] を選択し、[作成] を選択してプロジェクトを作成します。
  2. [ツール]>[NuGet Package Manager]>[パッケージ マネージャー コンソール] の順に選択してから、コンソール ウィンドウで次のコマンドを実行します。

    Install-Package Microsoft.Azure.NotificationHubs
    

    この操作によって、Microsoft.Azure.NotificationHubs パッケージを使用して Azure Notification Hubs SDK への参照が追加されます。

  3. Program.cs ファイルを開き、次の using ステートメントを追加します。

    using Microsoft.Azure.NotificationHubs;
    
  4. Program クラス内で、次のメソッドを追加するか、既にメソッドが指定されている場合は置き換えます。

    private static async void SendTemplateNotificationAsync()
    {
        // Define the notification hub.
        NotificationHubClient hub = NotificationHubClient.CreateClientFromConnectionString("<connection string with full access>", "<hub name>");
    
        // Apple requires the apns-push-type header for all requests
        var headers = new Dictionary<string, string> {{"apns-push-type", "alert"}};
    
        // Create an array of breaking news categories.
        var categories = new string[] { "World", "Politics", "Business", "Technology", "Science", "Sports"};
    
        // Send the notification as a template notification. All template registrations that contain
        // "messageParam" and the proper tags will receive the notifications.
        // This includes APNS, GCM/FCM, WNS, and MPNS template registrations.
    
        Dictionary<string, string> templateParams = new Dictionary<string, string>();
    
        foreach (var category in categories)
        {
            templateParams["messageParam"] = "Breaking " + category + " News!";
            await hub.SendTemplateNotificationAsync(templateParams, category);
        }
    }
    

    このコードでは、文字列の配列の 6 つのタグのそれぞれに対するテンプレート通知が送信されます。 タグを使用することで、デバイスは登録されているカテゴリに関する通知のみを確実に受信できます。

  5. 上記のコードでは、プレースホルダー <hub name><connection string with full access> を、通知ハブの名前と通知ハブのダッシュボードから得た DefaultFullSharedAccessSignature の接続文字列に置き換えます。

  6. Main() メソッド内に、次の行を追加します。

     SendTemplateNotificationAsync();
     Console.ReadLine();
    
  7. コンソール アプリケーションをビルドします。

タグ付けされた通知を送信するコンソール アプリを実行する

前のセクションで作成したアプリを実行します。 選択されたカテゴリの通知がトースト通知として表示されます。

次のステップ

このチュートリアルでは、ニュース速報をカテゴリごとにブロードキャストする方法について説明しました。 バックエンド アプリケーションは、そのタグの通知を受信するように登録されているデバイスに、タグ付けされた通知をプッシュします。 使用されているデバイスに関係なく、特定のユーザーにプッシュ通知を送信する方法については、次のチュートリアルに進んでください。