Xamarin.Android アプリ用 Azure Mobile Engagement の使用

このトピックでは、Azure Mobile Engagement を使用してアプリの使用状況を把握する方法と、Xamarin.Android アプリケーションのセグメント化されたユーザーにプッシュ通知を送信する方法について説明します。 このチュートリアルでは、Mobile Engagement を使用した簡単なブロードキャスト シナリオのデモンストレーションを行います。 このシナリオでは、基本的なデータを収集し、Google Cloud Messaging (GCM) を使ってプッシュ通知を受信する空の Xamarin.Android アプリを作成します。

このチュートリアルには、次のものが必要です。

注意

このチュートリアルを完了するには、アクティブな Azure アカウントが必要です。 アカウントがない場合は、無料試用版のアカウントを数分で作成することができます。 詳細については、「Azure の無料試用版サイト」をご覧ください。

Android アプリ用のモバイル エンゲージメントの設定

  1. Azure ポータルにログオンします。
  2. [新規][Web + モバイル][Mobile Engagement] の順にクリックします。

  3. 表示される [New Mobile Engagement App Collection (新しい Mobile Engagement アプリ コレクション)] ブレードで、Azure クラシック ポータルで作成するように、アプリではなくアプリ コレクションを作成します。 次の情報を入力します。

    • 名前: 名前 of your アプリケーション コレクション
    • プラットフォーム: クリックすると開く [プラットフォーム] ブレードでアプリのターゲット プラットフォームを選択します。 例: アプリを iOS と Android の両方に対応させる場合は、両方のプラットフォームを選択すると、このアプリ コレクションの下に 2 つのアプリが作成されます。

    • サブスクリプション: Azure サブスクリプションを選択します。
    • リソース グループ: この Azure リソース (Mobile Engagement アプリ コレクション) を追加する Azure リソース グループを選択します。 新しいリソース グループを作成することもできます。
    • 場所: このアプリ コレクションとアプリについてのデータが格納されるリージョン。
  4. [参照] をクリックし、"Mobile Engagement" を検索して Mobile Engagement アプリ コレクションを参照します。

  5. Mobile Engagement アプリ コレクションの一覧が表示されるので、アプリ コレクションを作成した同じ Azure サブスクリプションがあることを確認します。

  6. 前の手順で作成したアプリ コレクションをクリックして、アプリ コレクション リソースのブレードを開きます。ブレードには、このアプリ コレクション内に存在するさまざまなアプリが表示されます。

  7. 開発対象とするプラットフォーム向けに作成したアプリをクリックします。

  8. 上部の [接続情報] コマンド ボタンをクリックして [接続情報] ブレードを開き、そこに表示される接続文字列をコピーします。

アプリを Mobile Engagement のバックエンドに接続します

このチュートリアルでは、データを収集してプッシュ通知を送信するために必要な最小限のセットである「基本的な統合」について説明します。

統合のデモンストレーションを行うために、Xamarin Studio で基本的なアプリを作成します。

新しい Xamarin.Android プロジェクトを作成する

  1. Xamarin Studio を起動して、[File (ファイル)] -> [New (新規)] -> [Solution (ソリューション)] の順に移動します。

  2. [Android App (Android アプリ)] を選択し、選択されている言語が [C#] であることを確認してから、[Next (次へ)] をクリックします。

  3. アプリ名組織 ID を入力します。 [Google Play Services] チェック ボックスがオンになっていることを確認し、[Next (次へ)] をクリックします。

  4. 必要に応じて [Project Name (プロジェクト名)][Solution Name (ソリューション名)][Location (位置)] を変更し、[Create (作成)] をクリックします。

Xamarin Studio で、Mobile Engagement の統合先のアプリが作成されます。

アプリを Mobile Engagement のバックエンドに接続する

  1. [Solution (ソリューション)] ウィンドウの Packages フォルダーを右クリックし、[Add Packages (パッケージの追加)] を選択します。

  2. Microsoft Azure Mobile Engagement Xamarin SDK を探してソリューションに追加します。

  3. MainActivity.cs を開き、次の using ステートメントを追加します。

     using Microsoft.Azure.Engagement;
     using Microsoft.Azure.Engagement.Activity;
    
  4. OnCreate メソッドに、Mobile Engagement バックエンドとの接続を初期化する次のコードを追加します。 ConnectionStringを必ず追加してください。

     EngagementConfiguration engagementConfiguration = new EngagementConfiguration();
     engagementConfiguration.ConnectionString = "YourConnectionStringFromAzurePortal";
     EngagementAgent.Init(engagementConfiguration);
    

アクセス権限とサービス宣言を追加する

  1. Properties フォルダーの下にある Manifest.xml ファイルを開きます。 Source タブを選択して、XML ソースを直接更新します。
  2. 次のアクセス許可を、プロジェクトの Manifest.xml 内の <application> タグの直前または直後に追加します (Manifest.xml は Properties フォルダーの下にあります)。

     <uses-permission android:name="android.permission.INTERNET"/>
     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
     <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
     <uses-permission android:name="android.permission.VIBRATE" />
     <uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION"/>
    
  3. 次の設定を <application>タグと</application> タグの間に追加して、エージェント サービスを宣言します。

     <service
          android:name="com.microsoft.azure.engagement.service.EngagementService"
          android:exported="false"
          android:label="<Your application name>"
          android:process=":Engagement"/>
    
  4. 貼り付けたばかりのコードの label 内の "<Your application name>" をアプリケーション名に置き換えます。 この内容は [設定] メニューに表示されます。デバイスで実行されているサービスをユーザーはここで確認できます。 たとえば、このラベルに「サービス」という語句を追加できます。

画面を Mobile Engagement に送信する

データを送信してユーザーがアクティブであることを確認するには、少なくとも 1 つの画面を Mobile Engagement のバックエンドに送信する必要があります。 これを行うには、MainActivityActivity ではなく EngagementActivity から継承するようにします。

public class MainActivity : EngagementActivity

EngagementActivity からの継承ができない場合は、.StartActivity メソッドと .EndActivity メソッドを、それぞれ OnResumeOnPause に追加する必要があります。

    protected override void OnResume()
        {
            EngagementAgent.StartActivity(EngagementAgentUtils.BuildEngagementActivityName(Java.Lang.Class.FromType(this.GetType())), null);
            base.OnResume();             
        }

        protected override void OnPause()
        {
            EngagementAgent.EndActivity();
            base.OnPause();            
        }

リアルタイム監視を使用してアプリを接続する

このセクションでは、Mobile Engagement のリアルタイム監視機能を使用して、アプリを Mobile Engagement バックエンドに接続する方法について説明します。

  1. Azure Mobile Engagement アカウントで、Mobile Engagement ポータルで監視および管理するアプリを選択していることを確認します。 下部にある [エンゲージ] ボタンをクリックして、Mobile Engagement ポータルに移動します。

  2. Mobile Engagement ポータルに移動します。 [監視] タブが選択されていない場合は、 [監視]をクリックします。
  3. モニターがアプリを起動するデバイスをリアルタイムで表示する準備が整いました。
  4. アプリを起動します。 統合が適切に行われていれば、モニターには 1 つのセッションが表示されます。これは、アプリが Mobile Engagement バックエンドに接続され、バックエンドにデータを送信していることを意味します。

プッシュ通知とアプリ内メッセージングを有効にする

Mobile Engagement を導入すると、プッシュ通知とアプリ内メッセージングを利用して、ユーザーにキャンペーン情報を提供できます。 このモジュールは、Mobile Engagement ポータルで REACH として呼び出されます。 次のセクションでは、それらを受信するようにアプリをセットアップします。

API キーを使用して Google Firebase プロジェクトを作成する

注意

この手順を完了するには、検証済みの電子メール アドレスを持つ Google アカウントが必要になります。 新しい Google アカウントを作成するには、accounts.google.com にアクセスしてください。

  1. Cloud Console に移動し、Google アカウントの資格情報でサインインします。
  2. [新規プロジェクトを作成] をクリックして新しいプロジェクトを作成します。 代わりに、[Google プロジェクトをインポート] をクリックして既存のプロジェクトをインポートすることもできます。
  3. プロジェクトを新しく作成する場合には、[プロジェクト名] を入力し、[国 / 地域] を選択します。
  4. プロジェクトのページの左上に設定を編集するための歯車があるので、それをクリックします。 メニューで [プロジェクトの設定] をクリックします。
  5. 上部にある [クラウド メッセージング] タブをクリックします。
  6. サーバー キー送信者 ID をメモします。この情報は、後で "Android マニフェスト ファイル" で必要になります。

マニフェスト ファイルを更新して通知を有効にする

Manifest.xml の <application> タグと </application> タグの間に、次のアプリ内メッセージングのリソースをコピーします。

    <activity android:name="com.microsoft.azure.engagement.reach.activity.EngagementTextAnnouncementActivity" android:theme="@android:style/Theme.Light" android:exported="false">
          <intent-filter>
            <action android:name="com.microsoft.azure.engagement.reach.intent.action.ANNOUNCEMENT"/>
            <category android:name="android.intent.category.DEFAULT" />
            <data android:mimeType="text/plain" />
          </intent-filter>
    </activity>
    <activity android:name="com.microsoft.azure.engagement.reach.activity.EngagementWebAnnouncementActivity" android:theme="@android:style/Theme.Light" android:exported="false">
        <intent-filter>
            <action android:name="com.microsoft.azure.engagement.reach.intent.action.ANNOUNCEMENT"/>
            <category android:name="android.intent.category.DEFAULT" />
            <data android:mimeType="text/html" />
        </intent-filter>
    </activity>
    <activity android:name="com.microsoft.azure.engagement.reach.activity.EngagementPollActivity" android:theme="@android:style/Theme.Light" android:exported="false">
        <intent-filter>
            <action android:name="com.microsoft.azure.engagement.reach.intent.action.POLL"/>
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>
    <activity android:name="com.microsoft.azure.engagement.reach.activity.EngagementLoadingActivity" android:theme="@android:style/Theme.Dialog" android:exported="false">
        <intent-filter>
            <action android:name="com.microsoft.azure.engagement.reach.intent.action.LOADING"/>
            <category android:name="android.intent.category.DEFAULT"/>
        </intent-filter>
    </activity>
    <receiver android:name="com.microsoft.azure.engagement.reach.EngagementReachReceiver" android:exported="false">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED"/>
            <action android:name="com.microsoft.azure.engagement.intent.action.AGENT_CREATED"/>
            <action android:name="com.microsoft.azure.engagement.intent.action.MESSAGE"/>
            <action android:name="com.microsoft.azure.engagement.reach.intent.action.ACTION_NOTIFICATION"/>
            <action android:name="com.microsoft.azure.engagement.reach.intent.action.EXIT_NOTIFICATION"/>
            <action android:name="com.microsoft.azure.engagement.reach.intent.action.DOWNLOAD_TIMEOUT"/>
        </intent-filter>
    </receiver>
    <receiver android:name="com.microsoft.azure.engagement.reach.EngagementReachDownloadReceiver">
        <intent-filter>
            <action android:name="android.intent.action.DOWNLOAD_COMPLETE"/>
        </intent-filter>
    </receiver>

通知のアイコンを指定します。

次の XML スニペットを Manifest.xml の <application> タグと </application> タグの間に貼り付けます。

    <meta-data android:name="engagement:reach:notification:icon" android:value="engagement_close"/>

これにより、システムおよびアプリ内通知の両方に表示されるアイコンが定義されます。 これはアプリ内通知では任意ですが、システム通知では必須です。 Android では無効なアイコンが設定されたシステム通知は拒否されます。

いずれかの描画可能なフォルダーにあるアイコン (engagement_close.png など) を使用してください。 mipmap フォルダーはサポートされていません。

注意

ランチャー アイコンは使用しないでください。 このアイコンの解像度は異なっており、通常はサポート対象外の mipmap フォルダー内にあります。

実際のアプリでは、 Android の設計ガイドラインに従って、通知に適したアイコンを使用します。

ヒント

適切な解像度のアイコンを使用するには、 これらの例を参考にしてください。 [Notification] セクションまでスクロールして 1 つのアイコンをクリックし、PNGS をクリックして描画可能なアイコンのセットをダウンロードします。 アイコンのバージョンごとに、使用する描画可能なフォルダーと解像度を確認できます。

GCM のプッシュ通知を受信するようにアプリを設定する

  1. Firebase プロジェクト コンソールから取得した Sender ID を置き換えた後、Manifest.xml の <application> タグと </application> タグの間に次を貼り付けます。 \n は意図的に付けられています。プロジェクト番号の末尾には必ずこれを付けてください。

     <meta-data android:name="engagement:gcm:sender" android:value="************\n" />
    
  2. 次のコードを、Manifest.xml の <application> タグと </application> タグの間に貼り付けます。 をパッケージ名に置き換えます。

     <receiver android:name="com.microsoft.azure.engagement.gcm.EngagementGCMEnabler"
     android:exported="false">
         <intent-filter>
             <action android:name="com.microsoft.azure.engagement.intent.action.APPID_GOT" />
         </intent-filter>
     </receiver>
    
     <receiver android:name="com.microsoft.azure.engagement.gcm.EngagementGCMReceiver" android:permission="com.google.android.c2dm.permission.SEND">
         <intent-filter>
             <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
             <action android:name="com.google.android.c2dm.intent.RECEIVE" />
             <category android:name="<Your package name>" />
         </intent-filter>
     </receiver>
    
  3. 強調表示された最新のアクセス権限セットを、 <application> タグの前に追加します。 <Your package name> をアプリケーションの実際のパッケージ名で置き換えます。

     <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
     <uses-permission android:name="<Your package name>.permission.C2D_MESSAGE" />
     <permission android:name="<Your package name>.permission.C2D_MESSAGE" android:protectionLevel="signature" />
    

Mobile Engagement に GCM API キーへのアクセス権限を付与する

Mobile Engagement にプッシュ通知の送信を許可するには、API キーへのアクセス権限を付与する必要があります。 これは、キーを構成して Mobile Engagement ポータルに入力することで実行します。

  1. Azure クラシック ポータルで、このプロジェクトに使用しているアプリを対象としていることを確認し、下部にある [エンゲージ] ボタンをクリックします。

  2. ここで [設定] -> [ネイティブ プッシュ通知] セクションをクリックし、GCM キーを入力します。

  3. 次に示す [GCM 設定] セクションの [API キー]編集アイコンをクリックします。

  4. ポップアップ画面で、前に取得した GCM サーバー キーを貼り付け、 [OK]をクリックします。

アプリへ通知を送信する

アプリにプッシュ通知を送信する単純なプッシュ通知キャンペーンを作成します。

  1. Mobile Engagement ポータルで [ リーチ ] タブに移動します。
  2. [新しいお知らせ] をクリックして、プッシュ通知キャンペーンを作成します。

  3. 次の手順に従って、キャンペーンの最初のフィールドを設定します。

    a.この問題では、ターゲット (またはクラス) ラベルは "tip_amount" です。 キャンペーンの名前を付けます。

    b. [配信タイプ] として [システム通知] > [簡易] を選択します。これは、タイトルと数行のテキストを表示する単純な Android のプッシュ通知です。

    c. [配信時刻][指定なし] を選択し、アプリが起動されているかどうかに関係なく、アプリが通知を受信できるようにします。

    d. 通知テキストに、プッシュ通知内で太字で表示されるタイトルを入力します。

    e. 次に、メッセージを入力します。

  4. スクロール ダウンし、[コンテンツ] セクションで [通知のみ] を選択します。

  5. 最も基本的なキャンペーンの設定が完了しました。 もう一度下にスクロールし、 [作成] ボタンをクリックしてキャンペーンを保存します。
  6. 最後の手順として、 [アクティブ化] をクリックしてキャンペーンをアクティブにし、プッシュ通知を送信します。