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 をアプリに追加する手順は次のとおりです。
アプリの
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 の [設定] ページのゲーム名で確認できます。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 つの注意すべき主要な変更が含まれています。
- ログインは、ゲームの起動時に自動的にトリガーされます。GoogleSignIn SDK の
GoogleSignInClient
を使用してログインを実施する代わりに、GamesSignInClient.isAuthenticated()
を使用して自動ログインの試行結果を取得できます。 - クライアント Factory クラスで
GoogleSignInAccount
オブジェクトを渡す必要はなくなりました。追加の OAuth スコープはリクエストできません(GAMES_LITE
は自動的にリクエストされます)。 - Play ゲームサービス SDK 内の
GamesSignInClient.requestServerSideAccess()
を使用して認証トークンが提供されるようになりました。 - ログアウト方法が削除され、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);
}
ログインとログアウトの呼び出しを削除する
追加のスコープを指定しない場合、ユースケースを移行するのは簡単です。
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(). } });
アカウント管理が OS と Play ゲームアプリの設定に含まれているため、ログアウトする呼び出しをすべて削除します。
プレーヤーがログインに成功したら、Play ゲームのログインボタンをゲームから削除します。ゲーム起動時にログインしないことをユーザーが選択した場合は、必要に応じて Play ゲームのアイコンのボタンを表示し続け、
GamesSignInClient.signIn()
でログイン プロセスをトリガーできます。ユーザーがログイン済みであることを確認したら、プレーヤー ID を取得してユーザーを識別できます。
PlayGames.getPlayersClient(activity).getCurrentPlayer().addOnCompleteListener(mTask -> { // Get PlayerID with mTask.getResult().getPlayerId() } );
GoogleSignIn API への依存関係が使用されなくなった場合は削除します。
クライアント クラスの名前を更新する
クライアント(LeaderboardsClient
や AchievementsClient
など)を作成するときは、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