Google Play Games Servicesサインインの実装 (2025/04/15時点)
- はじめに
- build.gradleへの記述
- Google Play Servicesの利用可否の確認
- サインイン処理の流れ
- サインインクライアントの生成
- サイレントサインインの実装
- インタラクティブサインインの実装
- サインイン処理成功後の処理
- サインアウト処理
- 終わりに
はじめに
2025/4/15現在、play-services-games(以下、v1と表記)はdeprecatedになっており、代わりに新しいバージョンであるplay-services-games-v2(以下、v2と表記)の使用が推奨されています。
※2025/2~3頃からdeprecatedになったと思います。
そこで、本記事ではv2を用いてGoogle Play Games Servicesサインインを実装する方法を紹介します。
なお、環境構築部分は以前と変わらないため、以下の記事をもとに事前に実施してください。
※build.gradleの内容は本記事で書き換えます。
deep-verdure.hatenablog.com
build.gradleへの記述
build.gradleに以下を追記します。
dependencies {
implementation 'com.google.android.gms:play-services-games-v2:20.1.2'
}
以下が残っている場合、不要なため削除します。
dependencies { implementation 'com.google.android.gms:play-services-auth:21.3.0' implementation 'com.google.android.gms:play-services-games:23.2.0' implementation 'com.google.apis:google-api-services-drive:v3-rev110-1.23.0' }
Google Play Servicesの利用可否の確認
以前と全く同じです。以下を参照し、実装してください。
https://deep-verdure.hatenablog.com/entry/2018/08/30/012328?_gl=1*1r1xaxs*_gcl_au*MTE2Mzc4OTkwOS4xNzQyMjIwNDcy#Google-Play-Services%E3%81%AE%E5%88%A9%E7%94%A8%E5%8F%AF%E5%90%A6%E3%81%AE%E7%A2%BA%E8%AA%8D
サインイン処理の流れ
過去にサインインしたことがあるアカウント情報を用いて自動的にサインインを実行するサイレントサインイン、Googleが作成した専用のダイアログを用いて、ユーザが手動でアカウントを選択し、サインインを実施するインタラクティブサインインの順でサインインが試みられるのは以前と同じです。インタラクティブサインインに失敗した場合、サインイン処理全体として失敗したことになります。
ただし、この流れはv2では直感的に、簡潔に書けるようになっています。サインインを表す最も外側の窓口メソッドは以下の記述で問題ないでしょう。
fun signIn() { if (!isGoogleApiAvailable()) { return } silentSignIn() }
サインインクライアントの生成
v2では、GamesSignInClientクラスがサインインクライアントとなります。以前はサインインオプションを構築する必要がありましたが、v2ではPlayGames.getGamesSignInClient()でいきなりサインインクライアントを取得できます。一行で書けるのでイニシャライザに書く必要はなく、クラスのフィールドで初期化してしまって問題ありません。
private val signInClient = PlayGames.getGamesSignInClient(activity)
サイレントサインインの実装
サイレントサインインの実装メソッドを以下に示します。
private fun silentSignIn() { signInClient.isAuthenticated().addOnCompleteListener(activity) { task -> val isAuthenticated = task.isSuccessful && task.result.isAuthenticated if (isAuthenticated) { //サイレントサインインに成功 retrievePlayerInformation() } else { //インタラクティブサインインが必要 interactiveSignIn() } } }
GamesSignInClient#isAuthenticated()でサイレントサインインを実行できます。Tasks APIが利用されているところはv1と同様です。なお、v2ではサインインアカウントの概念が存在せず、v1の時に必要だったサインインアカウントのnullチェックが不要になっています。その分少しだけ記述が簡易になっています。
Tasks APIについては以下を参照ください。
developers.google.com
インタラクティブサインインの実装
インタラクティブサインインの実装メソッドを以下に示します。
private fun interactiveSignIn() { signInClient.signIn().addOnCompleteListener { task -> val isAuthenticated = task.isSuccessful && task.result.isAuthenticated if (isAuthenticated) { //インタラクティブサインインに成功 retrievePlayerInformation() } else { //インタラクティブサインインに失敗 //サインイン全体として失敗時のエラー処理を記述 } } }
GamesSignInClient#signIn()でインタラクティブサインインを実行できます。v1ではインテントを利用していたので、インテントの処理のためのコードも記述していましたが、v2では上記のみでインタラクティブサインインを実行できます。REQUEST_CODE_SIGN_INのキャッチは不要なので、v1の時のコードが残っている方は削除してしまいましょう。
サインイン処理成功後の処理
サインイン処理成功後のプレイヤーの取得や、スナップショットの取得といった処理は、PlayGames.getPlayersClient()等の、PlayGames.getXXXClient()という形式のメソッドを利用して行えます。v1利用時のコードが残っている場合、前述のメソッドに差し替えるだけで他のコードはそのまま流用できます。なお、メソッド呼び出し時にサインインアカウントの受渡しは不要で、コンテキストを渡すだけで問題ありません。
例えば、プレイヤーの取得は以下のコードを流用できますので参考にしてください。
https://deep-verdure.hatenablog.com/entry/2018/08/30/012328?_gl=1*1r1xaxs*_gcl_au*MTE2Mzc4OTkwOS4xNzQyMjIwNDcy#%E3%82%B5%E3%82%A4%E3%83%B3%E3%82%A4%E3%83%B3%E5%87%A6%E7%90%86%E6%88%90%E5%8A%9F%E5%BE%8C%E3%81%AE%E5%87%A6%E7%90%86
サインアウト処理
v2では明示的なサインアウト処理の記述は不要になりました。裏でよしなに処理しておいてくれます。
終わりに
お疲れ様でした!v1の頃と比較して直感的に、楽に記述できることがお分かりになったかと思います。実装のハードルは確実に下がっていますので、まだGoogle Play Games Services連携を利用していない方もこれを機に是非挑戦してみましょう!