Android ゲームのプラットフォーム認証

Google Play Games サービスの機能にアクセスするには、認証済みプレーヤーのアカウントをゲームから提供する必要があります。このドキュメントでは、ゲームにシームレスな認証エクスペリエンスを実装する方法について説明します。

Play Games サービス v2 SDK には、ゲームに認証されるユーザーの数を増やし、開発を容易にするために複数の改善が行われています。

  • ユーザー向けの改善点:
    • デフォルトのアカウントを選択すると、ユーザーはプロンプトを操作せずに認証されます。
    • ユーザーは、Play Games サービスで認証するために、または新しいアカウントを作成するために、Play Games アプリをダウンロードする必要がなくなりました。
    • ユーザーは、複数のゲームの Play ゲームサービス アカウントを 1 つのページで管理できるようになりました。
  • デベロッパー向けの改善点:
  • ゲームを起動するとログインが自動的にトリガーされ、アカウント管理は OS 設定で処理されるため、クライアント コードで認証またはログアウトのフローを処理する必要がなくなりました。

新しいクライアントの統合

このセクションでは、Play ゲームサービス ログイン v2 と新しいクライアントの統合を行う方法について説明します。

依存関係を追加する

アプリのルートレベルの build.gradle ファイルに Play ゲームサービス SDK の依存関係を追加します。Gradle を使用している場合は、依存関係を次のように追加または更新できます。

dependencies {
 implementation "com.google.android.gms:play-services-games-v2:+"
}

プロジェクト ID を定義する

Play ゲームサービス SDK のプロジェクト ID をアプリに追加する手順は次のとおりです。

  1. アプリの AndroidManifest.xml ファイルで、次の <meta-data> 要素と属性を <application> 要素に追加します。

    <manifest>
      <application>
        <meta-data android:name="com.google.android.gms.games.APP_ID"
                   android:value="@string/game_services_project_id"/>
      </application>
    </manifest>
    

    ゲームのゲームサービスのプロジェクト ID を値として使用し、文字列リソース参照 @string/game_services_project_id を定義します。ゲームサービスのプロジェクト ID は、Google Play Console の [設定] ページのゲーム名で確認できます。

  2. res/values/strings.xml ファイルで、文字列リソース参照を追加し、値としてプロジェクト ID を設定します。プロジェクト ID は、Google Play Console の [設定] ページのゲーム名で確認できます。次に例を示します。

    <!-- res/values/strings.xml -->
    <resources>
      <!-- Replace 0000000000 with your game's project id. Example value shown above.  -->
      <string translatable="false"  name="game_services_project_id"> 0000000000 </string>
    </resources>
    

SDK を初期化する

Application クラスの onCreate(..) コールバックで Play ゲーム SDK を初期化します。

import com.google.android.gms.games.PlayGamesSdk;

...

@Override
public void onCreate(){
  super.onCreate();
  PlayGamesSdk.initialize(this);
}

認証結果を取得する

ゲームは、起動すると常にユーザーの認証を試行します。ユーザーを認証するには、ユーザーが正常に認証されたことを確認してから、プレーヤー ID を取得する必要があります。

認証の試行を確認するには、GamesSignInClient.isAuthenticated() を呼び出し、addOnCompleteListener を使用して結果を取得します。次に例を示します。

GamesSignInClient gamesSignInClient = PlayGames.getGamesSignInClient(getActivity());

gamesSignInClient.isAuthenticated().addOnCompleteListener(isAuthenticatedTask -> {
  boolean isAuthenticated =
    (isAuthenticatedTask.isSuccessful() &&
     isAuthenticatedTask.getResult().isAuthenticated());

  if (isAuthenticated) {
    // Continue with Play Games Services
  } else {
    // Show a sign-in button to ask players to authenticate. Clicking it should
    // call GamesSignInClient.signIn().
  }
});

自動トリガーによるプロファイル作成を防止する

マニフェスト ファイルを使用して、自動トリガーされるプロファイル作成プロンプトを無効にできます。これにより、Play ゲームサービス プロフィールを持っていないユーザーは、Play ゲームサービス プロフィールの作成を求められることなく、ゲームを読み込み続けることができます。詳しくは、プロファイル作成オプションをご覧ください。

この機能を使用するには、次の条件を満たしていることを確認してください。

  • デバイスにログインしている Google アカウントのいずれにも、Play ゲームサービス プロフィールが存在しません。
  • ゲームが Play Games サービス SDK com.google.android.gms:play-services-games-v2:21.0.0 以降と統合されている。

プロファイルの自動作成を促すメッセージが表示されないようにするには、次の手順を行います。

  1. AndroidManifest.xml ファイルで、<meta-data> 要素に com.google.android.gms.games.SUPPRESS_GAME_PROFILE_CREATION タグを追加し、<application> 要素に属性を追加します。

    <application>
        ...
        <meta-data
            android:name="com.google.android.gms.games.SUPPRESS_GAME_PROFILE_CREATION"
            android:value="true" />
        ...
    </application>
    

    このフラグを true に設定すると、ゲームでプロフィール作成プロセスを処理することを Play Games サービスに通知します。そのため、既存の Play ゲームサービス プロフィールを持っていないデバイスのユーザーに対して、プロフィール作成のユーザー インターフェースが自動的に表示されることはありません。

  2. Play Games サービス API を呼び出すと、GamesClientStatusCodes.SIGN_IN_REQUIRED ステータス コードは、Play Games サービス プロファイルがないためユーザーを自動的に認証できなかったことが原因で呼び出しが失敗したことを示します。

    これにより、Play Games サービス プロフィールを持たないユーザーは、Play Games サービス プロフィールの作成をすぐに求められることなく、実装された認証方法に進むことができます。GamesSignInService.signin() を呼び出すことで、プロファイルの作成を開始できます。

    import com.google.android.gms.games.PlayGames;
    ...
    
    // Get the achievements client using Play Games services.
    AchievementsClient achievementsClient = PlayGames.getAchievementsClient(getActivity());
    achievementsClient.getAchievementsIntent()
        .addOnFailureListener(
            new OnFailureListener() {
              @Override
              public void onFailure(@NonNull Exception exception) {
                int statusCode = ((ApiException) exception).getStatusCode();
                if (statusCode == GamesClientStatusCodes.SIGN_IN_REQUIRED) {
                  // SIGN_IN_REQUIRED: The user needs to sign in with Play Games Services.
                  // Call GamesSignInService.signin() to prompt for
                  // authentication at a suitable time which will trigger the
                  // profile creation UI.
                  // (e.g., after a tutorial). Use GamesSignInService.isAuthenticated() to check auth status.
                }
              }
            });
  3. 除外タグを追加したら、logcat ウィンドウを使用して追加を確認します。logcat の出力には、「Game opted out of automatic profile creation prompt (using manifest)」のようなメッセージが含まれます。