Android ゲームのログイン

コレクションでコンテンツを整理 必要に応じて、コンテンツの保存と分類を行います。

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

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

  • ユーザー向けの改善点:
    • デフォルトのアカウントを選択すると、ユーザーはプロンプトを操作せずにログインできます。
    • ユーザーは、Play ゲームサービスでログインするために、または新しいアカウントを作成するために、Play ゲームアプリをダウンロードする必要がなくなりました。
    • ユーザーは、複数のゲームの 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 {
    // Disable your integration with Play Games Services or show a
    // login button to ask  players to sign-in. Clicking it should
    // call GamesSignInClient.signIn().
  }
});

ゲーム起動時にログインしないことをユーザーが選択した場合は、必要に応じて Play ゲームのアイコンのボタンを表示し続け、ユーザーがボタンを押したら GamesSignInClient.signIn() を呼び出してユーザーのログインを再試行できます。

ユーザーがログイン済みであることを確認したら、プレーヤー ID を取得してユーザーを識別できます。次に例を示します。

PlayGames.getPlayersClient(activity).getCurrentPlayer().addOnCompleteListener(mTask -> {
    // Get PlayerID with mTask.getResult().getPlayerId()
  }
);

Play ゲームサービス ログイン v2 に移行する

このセクションでは、クライアント コードを Play ゲームサービス v1 から v2 に移行する方法について説明します。

新しい SDK には、ログインの成功率を大きく高める次の 4 つの注意すべき主要な変更が含まれています。

  1. ログインは、ゲームの起動時に自動的にトリガーされます。GoogleSignIn SDK の GoogleSignInClient を使用してログインを実施する代わりに、GamesSignInClient.isAuthenticated() を使用して自動ログインの試行結果を取得できます。
  2. クライアント Factory クラスで GoogleSignInAccount オブジェクトを渡す必要はなくなりました。追加の OAuth スコープはリクエストできません(GAMES_LITE は自動的にリクエストされます)。
  3. Play ゲームサービス SDK 内の GamesSignInClient.requestServerSideAccess() を使用して認証トークンが提供されるようになりました。
  4. ログアウト方法が削除され、Play ゲームサービスのログインやログアウトにゲーム内ボタンが不要になりました。

また、ゲームの起動時に自動的にログインすることで、追加のログインが発生します。そのため、割り当て管理のページを確認して、ゲームがログイン リクエストの割り当てを超えないようにする必要があります。

新しい SDK Maven リポジトリをターゲットにする

Gradle ビルドシステムを使用している場合、これを行うにはモジュールの build.gradle ファイルで依存関係を com.google.android.gms:play-services-games-v2:+ アーティファクトに変更します。次に例を示します。

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

SDK を初期化する

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

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

...

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

ログインとログアウトの呼び出しを削除する

追加のスコープを指定しない場合、ユースケースを移行するのは簡単です。

  1. GoogleSignIn API を使用してログイン呼び出しを削除します。ログインは常にゲームの起動時に行われます。代わりに、GamesSignInClient.isAuthenticated() を使用して自動ログインの試行結果をリッスンします。

    GamesSignInClient gamesSignInClient = PlayGames.getGamesSignInClient(getActivity());
    
    gamesSignInClient.isAuthenticated().addOnCompleteListener(isAuthenticatedTask -> {
      boolean isAuthenticated =
        (isAuthenticatedTask.isSuccessful() &&
         isAuthenticatedTask.getResult().isAuthenticated());
    
      if (isAuthenticated) {
        // Continue with Play Games Services
      } else {
        // Disable your integration with Play Games Services or show a
        // login button to ask  players to sign-in. Clicking it should
        // call GamesSignInClient.signIn().
      }
    });
    
  2. アカウント管理が OS と Play ゲームアプリの設定に含まれているため、ログアウトする呼び出しをすべて削除します。

  3. プレーヤーがログインに成功したら、Play ゲームのログインボタンをゲームから削除します。ゲーム起動時にログインしないことをユーザーが選択した場合は、必要に応じて Play ゲームのアイコンのボタンを表示し続け、GamesSignInClient.signIn() でログイン プロセスをトリガーできます。

  4. ユーザーがログイン済みであることを確認したら、プレーヤー ID を取得してユーザーを識別できます。

    PlayGames.getPlayersClient(activity).getCurrentPlayer().addOnCompleteListener(mTask -> {
        // Get PlayerID with mTask.getResult().getPlayerId()
      }
    );
    
  5. GoogleSignIn API への依存関係が使用されなくなった場合は削除します。

クライアント クラスの名前を更新する

クライアント(LeaderboardsClientAchievementsClient など)を作成するときは、Games.getFooClient() ではなく PlayGames.getFooClient() を使用します。

サーバーサイドのアクセスをリクエストする

サーバーサイドのアクセスをリクエストするときは、GoogleSignInAccount.getServerAuthCode() ではなく GamesSignInClient.requestServerSideAccess() を使用します。

GamesSignInClient gamesSignInClient = PlayGames.getGamesSignInClient(this);
gamesSignInClient
  .requestServerSideAccess(OAUTH_2_WEB_CLIENT_ID,
                           /*forceRefreshToken=*/ false)
  .addOnCompleteListener( task -> {
    if (task.isSuccessful()) {
      String serverAuthToken = task.getResult();
      // Send authentication code to the backend game server to be
      // exchanged for an access token and used to verify the
      // player via the Play Games Services REST APIs.
    } else {
      // Failed to retrieve authentication code.
    }
});

追加のスコープを削除する

Play ゲームサービス v2 では、追加のスコープはリクエストできません。それでも追加のスコープをリクエストする必要がある場合は、Google ログイン SDK を Play ゲームサービスと併用することをおすすめします。

GoogleApiClient からの移行

古い既存の統合の場合、ゲームは Play ゲームサービス SDK の GoogleApiClient API のバリエーションに依存している可能性があります。これは 2017 年後半に非推奨となり、「接続のない」クライアントに置き換えられました。移行するには、GoogleApiClient クラスを「接続なし」の同等のものに置き換えます。その後、前述のガイダンスに沿って、ゲームを v1 から v2 に移行する必要もあります。一般的なクラスのマッピングを以下に示します。

com.google.android.gms.games.achievement.Achievements ->
    com.google.android.gms.games.AchievementsClient

com.google.android.gms.games.leaderboard.Leaderboard ->
    com.google.android.gms.games.LeaderboardsClient

com.google.android.gms.games.snapshot.Snapshots ->
    com.google.android.gms.games.SnapshotsClient

com.google.android.gms.games.stats.PlayerStats ->
    com.google.android.gms.games.PlayerStatsClient

com.google.android.gms.games.Players ->
    com.google.android.gms.games.PlayersClient

com.google.android.gms.games.GamesStatusCodes ->
    com.google.android.gms.games.GamesClientStatusCodes