Play Games サービスのログイン 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 Games アイコンのボタンを引き続き表示し、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 with 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