チュートリアル:Notification Hubs を使用して Xamarin.Android アプリにプッシュ通知を送信する

概要

Note

Firebase Cloud Messaging の非推奨と移行の手順については、「Google Firebase Cloud Messaging の移行」を参照してください。

このチュートリアルでは、Azure Notification Hubs を使用して Xamarin.Android アプリケーションにプッシュ通知を送信する方法について説明します。 Firebase Cloud Messaging (FCM) を使用してプッシュ通知を受信する空の Xamarin.Android アプリを作成します。 通知ハブを使用して、アプリを実行しているすべてのデバイスにプッシュ通知をブロードキャストします。 完成したコードは、NotificationHubs アプリ サンプルで参照できます。

このチュートリアルでは、次の手順を実行します。

  • Firebase プロジェクトを作成し、Firebase Cloud Messaging を有効にする
  • 通知ハブを作成する
  • Xamarin.Android アプリを作成し、それを通知ハブに接続する
  • Azure Portal からテスト通知を送信する

前提条件

Firebase プロジェクトを作成し、Firebase Cloud Messaging を有効にする

  1. Firebase コンソールにサインインします。 Firebase プロジェクトがまだない場合は、新しく作成します。

  2. プロジェクトを作成した後、 [Add Firebase to your Android app](Android アプリに Firebase を追加する) を選択します。

    Add Firebase to your Android app

  3. [Android アプリへの Firebase の追加] ページで、次の手順を実行します。

    1. [Android パッケージ名] に、お使いのパッケージの名前を入力します。 (例: tutorials.tutoria1.xamarinfcmapp)。

      Specify the package name

    2. [アプリの登録] を選択します。

    3. [google-services.json のダウンロード] を選択します。 次に、プロジェクトのフォルダーにファイルを保存し、[次へ] を選択します。 まだ Visual Studio プロジェクトを作成していない場合は、プロジェクトの作成後にこの手順を実行できます。

      Download google-services.json

    4. [次へ] を選択します。

    5. [この手順をスキップする] を選択します。

      Skip the last step

  4. Firebase コンソールで、プロジェクトの歯車アイコンを選択します。 次に、 [Project Settings](プロジェクト設定) を選択します。

    Select Project Settings

  5. google-services.json ファイルをダウンロードしていない場合は、このページでダウンロードできます。

    Download google-services.json from the General tab

  6. 上部にある [クラウド メッセージング] タブに切り替えます。 後で使用するために、サーバー キーをコピーし、保存します。 この値を使用して通知ハブを構成します。

    Copy server key

通知ハブを作成する

  1. Azure portal にサインインします。

  2. 左側のメニューから、 [すべてのサービス] を選択します。 A screenshot showing select All Services for an existing namespace.

  3. [サービスのフィルター] テキスト ボックスに「Notification Hubs」と入力します。 サービス名の横にある星のアイコンを選択して、左側のメニューにある [お気に入り] セクションにサービスを追加します。 [Notification Hubs] を選択します。

    A screenshot showing how to filter for notification hubs.

  4. [Notification Hubs] ページで、ツール バーの [作成] を選択します。

    A screenshot showing how to create a new notification hub.

  5. [Notification Hub] ページの [基本] タブで、次の手順を行います。

    1. [サブスクリプション] で、使用する Azure サブスクリプションの名前を選択し、既存のリソース グループを選択するか、新しいリソース グループを作成します。

    2. [名前空間の詳細] に新しい名前空間の一意の名前を入力します。

    3. 名前空間には 1 つ以上の通知ハブが含まれているので、 [通知ハブの詳細] にそのハブの名前を入力します。

    4. [場所] ドロップダウン リスト ボックスで値を選択します。 この値には、ハブを作成する場所を指定します。

      Screenshot showing notification hub details.

    5. Availability Zones オプションをレビューします。 可用性ゾーンがあるリージョンを選んだ場合は、既定でチェック ボックスが選択されます。 Availability Zones は有料機能であるため、追加料金がレベルに追加されます。

    6. [ディザスター リカバリー] オプションを選びます。[None] (なし)、[Paired recovery region] (ペアの復旧リージョン)、または [Flexible recovery region] (フレキシブル復旧リージョン) のオプションがあります。 Paired recovery region (ペアリングされた復旧リージョン) を選択すると、フェールオーバー リージョンが表示されます。 Flexible recovery region (柔軟な復旧リージョン) を選択した場合は、ドロップダウンを使用して復旧リージョンの一覧から選択します。

      Screenshot showing availability zone details.

    7. [作成] を選択します

  6. デプロイが完了したら、[リソースに移動] を選択します。

GCM/FCM の設定を通知ハブ用に構成する

  1. 左側のメニューの [設定] で、 [Google (GCM/FCM)] を選択します。

  2. Google Firebase Console からメモしたサーバー キーを入力します。

  3. ツールバーの [保存] を選択します。

    Screenshot of Notification Hub in Azure Portal with Google G C M F C M option highlighted and outlined in red.

通知ハブが FCM と連動するように構成されました。接続文字列により、アプリが通知を受信すると共に、プッシュ通知を送信するように登録されます。

Xamarin.Android アプリを作成し、それを通知ハブに接続する

Visual Studio プロジェクトを作成し、NuGet パッケージを追加する

注意

このチュートリアルに記載されている手順は、Visual Studio 2017 を対象としています。

  1. Visual Studio の [ファイル] メニューを開き、 [新規作成][プロジェクト] の順に選択します。 [新しいプロジェクト] ウィンドウで、次の手順のようにします。

    1. [インストール済み][Visual C#] の順に展開し、 [Android] をクリックします。

    2. 一覧から [Android アプリ (Xamarin)] を選択します。

    3. プロジェクトの 名前 を入力します。

    4. プロジェクトの 場所 を選択します。

    5. [OK] を選択します。

      New Project dialog

  2. [New Android App](新しい Android アプリ) ダイアログ ボックスで [空のアプリ] を選択し、 [OK] を選択します。

    Screenshot that highlights the Blank App template.

  3. ソリューション エクスプローラー ウィンドウで、 [プロパティ] を展開し、 [AndroidManifest.xml] をクリックします。 Google Firebase Console でプロジェクトに Firebase Cloud Messaging を追加するときに入力したパッケージ名に一致するようにパッケージ名を更新します。

    Package name in GCM

  4. 次の手順に従って、プロジェクトのターゲット Android バージョンを Android 10.0 に設定します。

    1. プロジェクトを右クリックし、 [プロパティ] を選択します。
    2. [Android バージョンを使用したコンパイル:(ターゲット フレームワーク)] フィールドで、 [Android 10.0] を選択します。
    3. ターゲット フレームワークの変更を続行するには、メッセージ ボックスで [はい] を選択します。
  5. 次の手順に従って、必要な NuGet パッケージをプロジェクトに追加します。

    1. プロジェクトを右クリックし、 [NuGet パッケージの管理...] を選択します。

    2. [インストール済み] タブに切り替えて、 [Xamarin.Android.Support.Design] を選択し、右側のウィンドウで [更新] を選択して、パッケージを最新バージョンに更新します。

    3. [参照] タブに切り替えます。Xamarin.GooglePlayServices.Base を検索します。 結果の一覧で [Xamarin.GooglePlayServices.Base] を選択します。 その後、 [インストール] を選択します。

      Google Play Services NuGet

    4. [NuGet パッケージ マネージャー] ウィンドウで、Xamarin.Firebase.Messaging を検索します。 結果の一覧で [Xamarin.Firebase.Messaging] を選択します。 その後、 [インストール] を選択します。

    5. 次に、Xamarin.Azure.NotificationHubs.Android を検索します。 結果の一覧で [Xamarin.Azure.NotificationHubs.Android] を選択します。 その後、 [インストール] を選択します。

Google Services JSON ファイルを追加する

  1. Google Firebase Console からダウンロードした google-services.json ファイルをプロジェクト フォルダーにコピーします。

  2. プロジェクトに google-services.json を追加します。

  3. [ソリューション エクスプローラー] ウィンドウで google-services.json を選択します。

  4. [プロパティ] ウィンドウで、ビルド アクションを [GoogleServicesJson] に設定します。 [GoogleServicesJson] が表示されない場合は、Visual Studio を閉じて再起動し、プロジェクトを再度開いて再試行します。

    GoogleServicesJson build action

プロジェクトで Notification Hubs を設定する

Firebase Cloud Messaging の登録

  1. Google Cloud Messaging から Firebase に移行する場合、プロジェクトの AndroidManifest.xml ファイルに古い GCM 構成が含まれていることが原因で通知が重複する可能性があります。 ファイルを編集し、<application> セクション内の次の行 (存在する場合) を削除します。

    <receiver
        android:name="com.google.firebase.iid.FirebaseInstanceIdInternalReceiver"
        android:exported="false" />
    <receiver
        android:name="com.google.firebase.iid.FirebaseInstanceIdReceiver"
        android:exported="true"
        android:permission="com.google.android.c2dm.permission.SEND">
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
            <category android:name="${applicationId}" />
        </intent-filter>
    </receiver>
    
  2. application 要素の前に、以下のステートメントを追加します。

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS"/>
    
  3. Android アプリケーションと通知ハブについて次の情報を収集します。

    • 接続文字列のリッスン: Azure portal のダッシュボードで [接続文字列の表示] を選択します。 この値に使用するための DefaultListenSharedAccessSignature 接続文字列をコピーします。
    • ハブ名: Azure portal からのハブの名前。 たとえば、 mynotificationhub2です。
  4. [ソリューション エクスプローラー] ウィンドウで、該当するプロジェクトを右クリックし、 [追加] を選択して、 [クラス] を選択します。

  5. Xamarin プロジェクトの Constants.cs クラスを作成し、このクラスに次の定数値を定義します。 プレースホルダーを実際の値に置き換えます。

    public static class Constants
    {
        public const string ListenConnectionString = "<Listen connection string>";
        public const string NotificationHubName = "<hub name>";
    }
    
  6. 次の using ステートメントを MainActivity.cs に追加します。

    using WindowsAzure.Messaging.NotificationHubs;
    
  7. MainActivity クラスに次のプロパティを追加します。

    internal static readonly string CHANNEL_ID = "my_notification_channel";
    
    
  8. MainActivity.cs で、次のコードを OnCreate (base.OnCreate(savedInstanceState) の後) に追加します。

    // Listen for push notifications
    NotificationHub.SetListener(new AzureListener());
    
    // Start the SDK
    NotificationHub.Start(this.Application, HubName, ConnectionString);
    
  9. AzureListener という名前のクラスをプロジェクトに追加します。

  10. 次の using ステートメントを AzureListener.cs に追加します。

    using Android.Content;
    using WindowsAzure.Messaging.NotificationHubs;
    
  11. クラスの宣言の上に次のコードを追加して、クラスが Java.Lang.Object から継承し、INotificationListener を実装するようにします。

    public class AzureListener : Java.Lang.Object, INotificationListener
    
  12. 次のコードを AzureListener クラス内に追加して、受信したメッセージを処理します。

        public void OnPushNotificationReceived(Context context, INotificationMessage message)
        {
            var intent = new Intent(this, typeof(MainActivity));
            intent.AddFlags(ActivityFlags.ClearTop);
            var pendingIntent = PendingIntent.GetActivity(this, 0, intent, PendingIntentFlags.OneShot);
    
            var notificationBuilder = new NotificationCompat.Builder(this, MainActivity.CHANNEL_ID);
    
            notificationBuilder.SetContentTitle(message.Title)
                        .SetSmallIcon(Resource.Drawable.ic_launcher)
                        .SetContentText(message.Body)
                        .SetAutoCancel(true)
                        .SetShowWhen(false)
                        .SetContentIntent(pendingIntent);
    
            var notificationManager = NotificationManager.FromContext(this);
    
            notificationManager.Notify(0, notificationBuilder.Build());
        }
    
  13. プロジェクトを構築します

  14. デバイスまたは読み込まれたエミュレーターでアプリを実行する

Azure Portal からテスト通知を送信する

アプリの通知の受信をテストするには、Azure Portal[テスト送信] オプションを使用します。 これは、デバイスにテスト プッシュ通知を送信します。

Azure portal - Test Send

プッシュ通知は通常、互換性のあるライブラリを使用して Mobile Services などのバックエンド サービスや ASP.NET に送信されます。 ライブラリがバックエンドに使用できない場合は、REST API を直接使用して通知メッセージを送信することもできます。

次のステップ

このチュートリアルでは、バックエンドに登録されているすべての Android デバイスにブロードキャスト通知を送信しました。 特定の Android デバイスにプッシュ通知を送信する方法を学習するには、次のチュートリアルに進んでください。