Android スタジオとプッシュ通知の概要

概要

このチュートリアルは、プッシュ通知と統合した Android の PlayFab を起動、実行する方法について説明します。

プッシュ通知では、いくつかのシステムで設定が必要です。 説明を始める前に、インフラストラクチャの仕組みについて説明します。 プロセスには、4 つのエンティティがあります。

  1. Google Play サービス
  2. Firebase クラウド メッセージング サービス (FCM、旧 Google クラウド メッセージング の上に構築されています。)
  3. PlayFab サービス
  4. クライアント アプリケーション

1. Google Play サービス

Google Play サービスがパッケージ名を使用して、プレイ マーケットで使用するページを識別します。

こちらの例のとおりです: com.bob.games.matchthree

Google Play に登録されると、パッケージ名は一意のアプリケーション ID となり、プレイ ストア経由のインストールからなりすましの防止まで多くの目的に利用されます。

2. Firebase クラウド メッセージング (FCM)

Firebase クラウド メッセージング サービスはクラウドベースのシステムで、プッシュ通知の送信、管理、配信を行います。

また、他のサービス (PlayFab など) が代わりに FCM サーバー キーを使用してプッシュ通知を送信できます。

3. PlayFab サービス

PlayFab サービスが FCM サーバー キーを使用して、クライアントにプッシュ通知を送信できます。

4. クライアント サービス

最後に、クライアント アプリケーションは通知を受信し、必要に応じて処理を行います。

4 方向への分割

この結果、4 つの異なるシステム を設定する必要があります。 これを行うために、チュートリアルを 4 つの章に分け、各部分の構成を説明します。

注意

システムの構成に使用する 順序 が重要です。

前提条件

  • Google アカウントをご用意ください。
  • PlayFab アカウントをご用意ください。
  • Android アセット スタジオの 通知アイコン ジェネレーターを使用して生成された通知アイコンです。

シナリオ

チュートリアルのこのセクションでは、Foo PlayFab アプリに呼び出されたアプリケーションを構築します。 Android アプリには、次の機能があります。

  • Android デバイス ID を使用して、PlayFab に署名します。
  • PlayFab からプッシュ通知を受信します。

パッケージ名は、com.foo.playfab.app です。

Important

このチュートリアルを使用する場合、自身のパッケージ名やタイトルを使用することを確認してください。

第 1 章: Firebase を設定します。

公式コンソール ページを使用して、Firebase の設定を開始します。 新しいプロジェクトを追加できるページを表示します。

  • これを実行するには、次の図に示すように [プロジェクトの追加] エリアを選択します。

Firebase - プロジェクトの追加

  • [プロジェクト名] を要求されます (このチュートリアルでは、Foo PlayFab App を使用しますが、このチュートリアルを使用する場合、自身の 名前を使用することを 確認してください)。

  • [プロジェクトの作成] ボタンを選択し、次の手順に進みます。

Firebase - プロジェクトの作成

[新しいプロジェクト ダッシュ ボード] にリダイレクトされます。

  • 次の図で示すように、エリアを選択して、新しい [Android アプリケーション] をプロジェクトに追加します。

Firebase - Firebase を Android アプリに追加

新しいアプリケーションには、3 つの手順を追加する必要があります。

  1. 最初に、Android のパッケージ名 を必要です。 com.foo.playfab.app を使用していますが、このチュートリアルを使用する場合、自身のパッケージ名を使用することを確認してください。

  2. [アプリの登録] ボタンを選択し、次の手順に進みます。

Firebase - Android アプリの登録

手順 2 では、google services.json という名前の設定ファイルをダウンロードできます。 後で使用するアプリに自動的に Google サービスを設定します。

  • ダウンロードした後、[続行] ボタンを選択し、次の手順に移動します。

Firebase - Google 設定ファイルの追加

  1. 最後の手順では、Firebase SDK と Google Play SDK を繋ぐ、構築プロセスの設定方法を説明します。

注意

この設定は、Android スタジオに組み込まれた自動ツールを使用して自動的に行います。このため、この情報は無視してもかまいません。

  • [完了] ボタンを選択し、続行します。

Firebase - Android アプリへの追加終了

  • アプリケーションが追加されると、ダッシュ ボードに表示されます。

  • ここで、設定は終了です。FCM サーバー キーを取り出す必要があります (PlayFab プッシュ通知を繋ぐために使用します)。

  • 次の図に示すように、[プロジェクトの設定] に移動します。

Firebase - プロジェクトの設定

  • [プロジェクト設定] で、[クラウド メッセージング] タブに移動します。

  • [サーバー キー] エリア (下に表示される図の赤いエリア) に移動します。

  • このキーをコピーし、安全で簡単にアクセスしやすい場所に保存します。

Firebase - クラウド メッセージング - サーバー キー

この時点で、プッシュ通知を有効にするために、Firebase で必要な作業は終了しました。

第 2 章: Google Play コンソールの構成

ご使用のアプリが準備できている場合、Google コンソール プロジェクトを作成して、製品の Play Store ページを準備します。 Google Play プロジェクトを作成し、それを Firebase プロジェクトにリンクするプロセスについて説明します。

Google Play コンソール ページにアクセスし、次の図に示すように、新しいプロジェクトを作成します。

Google Play - コンソール ページ

  • タイトルを割り当てます。

注意

この例では、Foo PlayFab アプリを使用します。 このチュートリアルを使用する場合、 自身のタイトルやパッケージ名を使用することを確認してください。

  • [作成] ボタンを選択し、続行します。

Google Play - アプリケーションの作成

  • [Google Play コンソール プロジェクト] ページが開きます。

  • サイド メニューの [サービスと API] を選択します。

Google Play コンソール - サービスと API

  • [サービスの設定] ページが開きます。
  • [Firebase クラウド メッセージング] パネルに移動します。
  • 次の図に示すように、[送信者 ID をリンク] ボタンを選択します。

Google Play - FCM パネル - 送信者 ID へのリンク

[送信者 ID] にリンクするには、

  • 前章の Firebase コンソールを使用していたときに、受信した (保存していた) FCM サーバー キーを使用します。
  • 完了したら、例に示すように、[リンク] ボタンを選択します。

Google Play - 送信者 ID へのリンク - FCM API キーの追加

  • 次の例で示すように、[Google Play コンソール] に表示される [送信者 ID] が、Firebase コンソール のものと一致することを確認します。

Google Play コンソール - Firebase コンソール - 送信者 ID の一致

ここで、[Google Play コンソール プロジェクト][Firebase プロジェクト] に正常にリンクされています。

第 3 章: PlayFab タイトルの設定

この章の目的は、PlayFab サービスの設定方法を示すことです。これにより、手作業を必要とせず、プレイヤーにプッシュ通知を送信できるようになります。

  • まず、タイトルの設定メニューの [タイトルの設定] に移動する必要があります。

  • [プッシュ通知] タブを選択します。

  • [Android] オプションで、[設定] アイコンを選択します。

PlayFab - プッシュ通知 - Android の設定

  • Google サーバー API キーが求められます。

  • 下の例で示すように、Firebase コンソール経由で受信したキーをコピーします。

PlayFab - Firebase コンソール - サーバー API キーの追加

  • すべてが正しく設定できた場合、[プッシュ通知][アクティブ] と示すページが表示されます。

PlayFab - Push 通知 - アクティブ

これで、PlayFab タイトルの設定が完了しました。

第 4 章: Android スタジオ プロジェクトの構成

PlayFab JavaSDK を利用するためには、PlayFab クライアント JavaSDK とその依存関係である Google GSON が必要です。

  • PlayFab クライアント JavaSDK JAR ライブラリをここからダウンロードします。

  • client-sdk-*.jar と、必要に応じて、対応する Java ドキュメントを探します。

  • 最新の Google GSON をダウンロードします。

  • gson-*.jar を探します。

  • 前に説明した .jar ファイルが近くにあります。

最初に、通常の Android スタジオ プロジェクトを作成します。

  • [パッケージ名] が、このチュートリアル全体で使用したものと一致していることを確認します (例については、Firebase の章を確認してください)。

    注意

    この例の目的は、com.foo.playfab.app を使用していますが、このチュートリアルを使用中に自身のパッケージ名やタイトルを使用することを忘れないようにしてください。

Android スタジオ - 新しいプロジェクト - アプリ名の追加

  • [最小 SDK] を選択します。

  • [次へ] ボタンを選択します。

Android スタジオ - 新しいプロジェクト - 最小の SDK の選択

このチュートリアルでは、Empty Activity テンプレートを使用することをお勧めします。

  • 使用するテンプレートを選択します。

  • [次へ] ボタンを選択します。

Android スタジオ - 新しいプロジェクト - テンプレートの選択

  • 希望に応じてテンプレートを設定します。

  • [完了] ボタンを選択します。

Android スタジオ - 新しいプロジェクト - 完了

新しく作成したプロジェクトを開くと、

  • [プロジェクト] タブ (1) に切り替えます。

注意

前章では、Firebase コンソールから google-services.json 設定ファイルをダウンロードしました。 次の手順では、これを使用します。

  • このファイルが [アプリ] フォルダー (2) にあることを確認します。
  • [ツール] (3) に移動します。
  • 次の例に示すように、[Firebase] (4) を選択します。

Android スタジオ - 構成ファイルをプロジェクトに追加

[Firebase アシスタント] がウィンドウの右側に開かれます。

  • [クラウド メッセージング] フォルダーに移動し、次に示すように [Firebase クラウド メッセージングの設定] を選択します。

Android Studio - Firebase Assistant - クラウド メッセージングを設定する

  • [Firebase 通知アシスタント] で、次の図に示すように [FCM をアプリに追加] (1) ボタンを選択します。

  • 新しい依存関係を Gradle 経由で追加することを示す、ダイアログ ボックスが開きます。

  • [変更の反映] (2) を選択し、変更を許可します。

    注意

    残念ながら、Gradle の同期プロセス (3) によって自動的に追加された依存関係が不正であり、エラーがレポートされます。

  • 依存関係を正しく設定するには、次のように自動追加文を置き換えてください。

    implementation 'com.google.firebase:firebase-core:16.0.3
    implementation 'com.google.firebase:firebase-messaging:17.0.0

Android Studio - Firebase Assistant - FCM をアプリに追加する

この処理が完了すると、

  • [Firebase 通知アシスタント] が、依存関係が正しく設定されている (1) と示していることを確認します。

注意

この章の最初で、必要な JAR ファイルを取得しました。 通常、ビルド ファイルは自動的に、これらのファイルを取得します。

  • これらの JAR ファイルが アプリ/ライブラリ フォルダ (2) の下に一覧表示されることを確認するには、すべてのファイルを選択して、右クリックします。
  • 次の例に示すように [ライブラリとして追加] (3) を選択します。

Android Studio - Firebase Assistant - ライブラリとして追加

  • Android アセット スタジオ 通知アイコン ジェネレーター を使用して、アイコンを準備し、app/src/main/res 内に配置します。

  • 次に示す例では、ic_stat_blur_on という名前のアイコンが呼び出されます。

Android スタジオ - アイコンの追加

  • 最後に、[プロジェクトのリビルド] を選択します。

Android スタジオ - プロジェクトのリビルド

すでに、通知を受信および処理するコードの実装を開始できます。 4 つのファイルを変更 (必要に応じて作成) します。

  1. app/src/main/AndroidManifest.xml
  2. app/src/main/java/..packagePath../MainActivity.java
  3. app/src/main/java/..packagePath../FooAppFirebaseInstanceIdService.java
  4. app/src/main/java/..packagePath../FooAppFirebaseMessagingService.java

注意

現在の実装は、できるだけ短い時間で実施しました。通知の簡単なテストができます。 高品質なベスト プラクティスとより複雑な実装例については、FCM ガイド をご覧ください。

AndroidManifest.xml

次のコードでは、任意の MY_PACKAGE_IDENTIFIER プレースホルダーを自身のパッケージ ID に置き換えます。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="MY_PACKAGE_IDENTIFIER">
    <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <!-- The following block enables our custom Firebase Instance ID Service-->
        <service android:name=".FooAppFirebaseInstanceIdService" android:exported="true">
            <intent-filter>
                <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
            </intent-filter>
        </service>

        <service
            android:name=".FooAppFirebaseMessagingService" android:exported="true">
            <intent-filter>
                <action android:name="com.google.firebase.MESSAGING_EVENT"/>
            </intent-filter>
        </service>

    </application>

</manifest>

MainActivity.java

シナリオに従って、コードで次のプレースホルダーを置き換える必要があります。

  • PLAYFAB_TITLE_ID

    • PlayFab ゲーム マネージャーで受信したタイトルの ID を使用します。
  • PACKAGE_IDENTIFIER

    • 設定したものと一致する Java パッケージ ID を使用します。
package PACKAGE_IDENTIFIER;

import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import com.playfab.PlayFabClientAPI;
import com.playfab.PlayFabClientModels.*;
import com.playfab.PlayFabErrors;
import com.playfab.PlayFabSettings;
import java.util.List;
import java.util.Map;

public class MainActivity extends AppCompatActivity {

    // Invoked when activity is started
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Set PlayFab title
        PlayFabSettings.TitleId = "PLAYFAB_TITLE_ID";

        // Start login operation
        AsyncTask.execute(new Runnable() {
            @Override
            public void run() {
                if(login()) FooAppFirebaseInstanceIdService.setAllowRegisterForPush(true); // Ready to register for push notifications
            }
        });
    }

    public boolean login(){
        LoginWithAndroidDeviceIDRequest request = new LoginWithAndroidDeviceIDRequest();
        request.CreateAccount = true;

        // There are several approaches on getting unique android device id.
        // https://stackoverflow.com/questions/2785485/is-there-a-unique-android-device-id
        request.AndroidDeviceId = "qwerty";

        PlayFabErrors.PlayFabResult<LoginResult> response = PlayFabClientAPI.LoginWithAndroidDeviceID(request);
        if(response.Error != null){
            Log.d("Foo PlayFab App",CompileErrorsFromResult(response.Error));
            return false;
        }
        return true;
    }

    // Utility method to compose an error message out of PlayFab result.
    private static String CompileErrorsFromResult(PlayFabErrors.PlayFabError error) {
        if (error == null)
            return null;

        String errorMessage = "";
        if (error.errorMessage != null)
            errorMessage += error.errorMessage;
        if (error.errorDetails != null)
            for (Map.Entry<String, List<String>> pair : error.errorDetails.entrySet())
                for (String msg : pair.getValue())
                    errorMessage += "\n" + pair.getKey() + ": " + msg;
        return errorMessage;
    }
}

FooAppFirebaseInstanceIdService.java

シナリオに従って、以下に表示されているコードのプレースホルダーを置き換える必要があります。

  • PACKAGE_IDENTIFIER
    • 設定したものと一致する Java パッケージ ID です。
package PACKAGE_IDENTIFIER;

import android.text.TextUtils;
import android.util.Log;
import com.google.firebase.iid.FirebaseInstanceId;
import com.google.firebase.iid.FirebaseInstanceIdService;
import com.playfab.PlayFabClientAPI;
import com.playfab.PlayFabClientModels;
import com.playfab.PlayFabErrors;
import java.util.List;
import java.util.Map;

public class FooAppFirebaseInstanceIdService extends FirebaseInstanceIdService {

    private static String _token;

    private static boolean _allowRegistration;

    // This is invoked from activity that performs authentication.
    // Once login is complete this method is invoked.
    // If we have a pending token, we use it to register for push notifications
    public static void setAllowRegisterForPush(boolean isAllowed) {
        _allowRegistration = isAllowed;
        if (_allowRegistration && !TextUtils.isEmpty(_token)) {
            registerForPush(_token);
        }
    }

    // Invoked when firebase has fetched a token
    // If we already have logged in, we use new token to register for push
    @Override
    public void onTokenRefresh() {
        _token = FirebaseInstanceId.getInstance().getToken();
        if (_allowRegistration && !TextUtils.isEmpty(_token)) {
            registerForPush(_token);
        }
    }


    private static void registerForPush(String token) {
        PlayFabClientModels.AndroidDevicePushNotificationRegistrationRequest request = new PlayFabClientModels.AndroidDevicePushNotificationRegistrationRequest();
        request.DeviceToken = token;

        PlayFabErrors.PlayFabResult<PlayFabClientModels.AndroidDevicePushNotificationRegistrationResult> response = PlayFabClientAPI.AndroidDevicePushNotificationRegistration(request);

        if (response.Error != null) {
            Log.d("Foo PlayFab App", CompileErrorsFromResult(response.Error));
        }
    }

    // Utility method to compose an error message out of PlayFab result.
    private static String CompileErrorsFromResult(PlayFabErrors.PlayFabError error) {
        if (error == null)
            return null;

        String errorMessage = "";
        if (error.errorMessage != null)
            errorMessage += error.errorMessage;
        if (error.errorDetails != null)
            for (Map.Entry<String, List<String>> pair : error.errorDetails.entrySet())
                for (String msg : pair.getValue())
                    errorMessage += "\n" + pair.getKey() + ": " + msg;
        return errorMessage;
    }

}

FooAppFirebaseMessagingService.java

シナリオに従って、以下に示されているコードのプレースホルダーを置き換える必要があります。

  • PACKAGE_IDENTIFIER
    • 設定したものと一致する Java パッケージ ID です。
package com.foo.playfab.app;

import android.util.Log;
import com.google.firebase.messaging.FirebaseMessagingService;
import com.google.firebase.messaging.RemoteMessage;

public class FooAppFirebaseMessagingService extends FirebaseMessagingService {

    @Override
    public void onMessageReceived(RemoteMessage message) {
        // Intercept the message here
        Log.d("Foo PlayFab App","Message received: "+message.getNotification().getBody());
    }
}

テスト

ここで、デバイスにアプリケーションを配置できます。

  • アプリケーションを起動すると、自動的にログインされ、プッシュ通知が登録されます。

  • デバイスの [ホーム] ボタンを選択し、アプリケーションを最小化します。 システム トレイに到着した通知をテストできることが重要です

  • 次に、PlayFab タイトルの [ゲーム マネージャー] ページに移動し、ダッシュボードを使用して、最新の [プッシュ登録] を探します。

  • プレイヤー ID (1) を選択します。

PlayFab - PlayStream - イベント ログ

そのプレイヤーの [プッシュ通知の送信] ページが開きます。

  • [プッシュ通知を送信] ボタン (1) を選択します。

  • [タイトル] (2) に入力します。

  • メッセージ (3) の本文を入力します。

  • [プッシュ通知の送信] ボタン (4) を選択し、変更を送信します。

PlayFab - プッシュ通知の送信

  • デバイスにメッセージが到着することを確認します。

Android アプリ - PlayFab プッシュ通知の受信

メッセージがアプリケーションに正常に配信されると、メッセージが到着します。

正常に統合できました。 アプリケーションが実際に動作している間は、FooAppFirebaseMessagingService を使用してメッセージの受信を制御する場合があります。