🦕

GooglePlayGameServicesのセットアップ

2022/06/30に公開

はじめに

AndroidアプリでGooglePlayGameServices v2を使ったリーダーボードを実装したので、手順を投稿します。関連する筆者の記事に記載した三部構成になっています。
GooglePlayConsoleを使ってAndroidアプリをリリースしているレベルの読者を想定しています。

関連する筆者の記事

  1. GooglePlayGameServicesのセットアップ(本記事)
  2. AndroidGamesへのサインインの実装
  3. GooglePlayGameServicesを使ったリーダーボードの実装

参考資料

本記事に関連するAndroidDevelopersのガイドは以下です。
https://developers.google.com/games/services/console/enabling

リーダーボード実装前の筆者の状態

  1. GooglePlayにアプリをリリース済み
  2. アプリはプロダクトフレーバーを使って有料版と無料版をリリースしている
  3. 有料版アプリと無料版アプリで共通のリーダーボードを使いたい
  4. GooglePlayGamesServicesのセットアップはしていない
  5. GoogleAPI(Firebase)などは使用していない

1. GooglePlayConsoleにゲームプロジェクトを追加する

まずはAndroidDevelopersのガイドのステップ1、ステップ2に従い、GooglePlayConsoleにサインインしてゲームプロジェクトの追加を行います。
こちらの手順は、既にゲームプロジェクトが存在するかどうかと、ゲームプロジェクトで既にGoogpeAPI(Firebaseなど)を使用しているかどうかによって手順が異なります。筆者は有料版アプリで新規ゲームプロジェクトを作成し、無料版アプリでは既存のゲームプロジェクトを使用する手順で進めました。

1.1. 有料版アプリは新規ゲームプロジェクトを作成(筆者の場合)

最初にセットアップを行った有料版アプリでは、新規でゲームプロジェクトを作成し、GoogleAPIは未使用を指定しました。この手順を行うことで、GoogleCloudConsoleにGooglePlayGameServicesプロジェクトのエントリが作成されます。
GooglePlayConsoleのプロパティセクションで、ゲームの説明、カテゴリおよびグラフィックアセットの追加を行ってください。

1.2. 無料版アプリは既存のゲームプロジェクトを使用(筆者の場合)

無料版アプリでは、既存のGooglePlayGameServicesプロジェクトを利用するを選択して、有料版アプリで作成したゲームプロジェクトを指定しました。これによって、有料版アプリと無料版アプリで共通のゲームプロジェクトを参照し、リーダーボードを共有することができるようになります。

2. GoogleCloudConsoleでOAuth2.0クライアントIDを生成する

ここからはAndroidDevelopersのガイドのステップ3の手順です。

2.1. GoogleCloudConsoleでOAuth同意画面を設定する

2.1.1. ①OAuth同意画面

まず、アプリ情報の入力を行います。

次に、アプリのドメインを入力します。プライバシーポリシーはGooglePlayConsoleのアプリのコンテンツに登録しているプライバシーポリシーのURLを入力しました。アプリケーションのホームページはこのために新規で作成しました。筆者はプライバシーポリシーもアプリケーションのホームページもGitHubPagesを使って作成しました。
承認済みドメインの入力では、GoogleSerchConsoleを使って自身のGitHubPagesのドメイン承認を行いました。このドメイン承認の処理の中で、ドメインの所有権を確認するために、Googleから指定されたHTMLタグをページに埋め込みました。所有権の確認方法には、HTMLタグの埋め込みの他にもHTMLファイルのアップロードやGoogleAnalyticsを使う方法などが存在し、一つを選択して行うことができます。

最後にデベロッパーの連絡先情報を入力して①OAuth同意画面の入力は完了です。

2.1.2 ②スコープ

スコープにはgames、games_lite、drive.appdataの3つを含める必要があります。

2.1.3 ③省略可能な情報

こちらはGoogle審査担当者に対してアプリの情報を提供することで、検証プロセスを短縮することが目的です。筆者は特に追加のアプリ情報は無かったため未入力で処理を進めました。

2.1.4 ④概要

①~③の入力内容を確認して、審査の準備を開始します。

2.1.5 審査

この後、GoogleCloudPlatformから英語のメールが来て、いくつかのやり取りをしました。筆者はここで苦労したので、ポイントを記載しておきます。

GoogleCloudPlatformからのメール

If your app doesn't need to display an icon, you can skip the verification process and no action is required. If you do skip the verification process, the existing functions of your app won't change, as long as the scopes used by your project don’t change.

筆者はここが分からなかったため「AndroidDevelopersのガイドに従って、AndroidネイティブアプリでGooglePlayGamesServicesを使ったリーダーボードの実装をしているので、アイコンは表示しないと思うのだけど?」などと何度かメールのやり取りをしました。最終的には「OAuth brand verification processをするか、しないかだ」と、二択で回答を求められたため、verification processをしないと回答しました。結果としてこれで問題なくOAuthもGooglePlayGamesServicesを使ったリーダーボードも実装することができました。

2.2. GoogleCloudConsoleでOAuth2.0クライアントIDを作成する

まずは入力画面のキャプチャを載せておきます。名前はエンドユーザーには表示されないクライアントの識別子です。パッケージ名とSHA-1証明書のフィンガープリントについては下で詳しく説明します。

2.2.1. パッケージ名

AndroidManifest.xml内のパッケージ名を入力するように書かれていますが、筆者のようにプロダクトフレーバーを使っている場合、プロダクトフレーバーのサフィックスまでを含めて入力する必要があります。
筆者の場合、AndroidManifest.xmlのパッケージ名はzozooizozzoizioiiiooi.tapsですが、プロダクトフレーバーのサフィックスがproの有料版アプリではzozooizozzoizioiiiooi.taps.proを入力します。

AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="zozooizozzoizioiiiooi.taps">

2.2.2. SHA-1証明書のフィンガープリント

keytoolコマンドを使って、ビルド時に指定している証明書からSHA-1フィンガープリントを取得するように書かれていますが、筆者はこれではうまくいかず、実行時に以下のようなエラーログが表示されました。筆者はこのエラーログの下から2行目に記載されているフィンガープリントを入力し直すことで、エラーを解消することができました。

コマンド
keytool -keystore path-to-debug-or-production-keystore -list -v
エラーログ
PlayGamesServices[SignInAuthenticator]: **** APP NOT CORRECTLY CONFIGURED TO USE GOOGLE PLAY GAME SERVICES
    **** DEVELOPER_ERROR
    **** This is usually caused by one of these reasons:
    **** (1) Your package name and certificate fingerprint do not match
    ****     the client ID you registered in Developer Console.
    **** (2) Your App ID was incorrectly entered.
    **** (3) Your game settings have not been published and you are 
    ****     trying to log in with an account that is not listed as
    ****     a test account.
    **** (4) A server auth code was requested, but an incorrect client
    ****     id was provided. The client id for server auth codes should
    ****     be the client id for the game server (not the android app).
    ****
    **** To help you debug, here is the information about this app
    **** Package name         : zozooizozzoizioiiiooi.taps.pro
    **** Cert SHA1 fingerprint: ■:■:■:■:■:■:■:■:■:■:■:■:■:■:■:■:■:■:■:■
    **** App ID from manifest : ■■■■■■

推測ですが、エラーの原因は筆者がPlayアプリ署名を利用しているためだと思います。
https://support.google.com/googleplay/android-developer/answer/9842756

3. GooglePlayConsoleで認証情報を追加する

GoogleCloudConsoleで生成したOAuth2.0クライアントIDをGooglePlayConsoleの認証情報に追加します。筆者の場合、1つのゲームプロジェクトに対して、有料版アプリと無料版アプリの2つの認証情報(Auth2.0クライアントID)が追加されています。

お疲れ様でした。ここまででGooglePlayGameServicesのセットアップは完了です。次はAndroidGamesへのサインインの実装に移ります。
https://zenn.dev/zozooizozzoizio/articles/8db7ce9573dda9

筆者のアプリ

テンキーでの入力スピードを競うAndroidアプリを開発しました。こちらの記事にあるGooglePlayGameServicesの機能であるリーダーボードが搭載されていますので、興味を持って頂けた方は是非リーダーボードの上位ランクインを目指してみてください。
https://play.google.com/store/apps/details?id=zozooizozzoizioiiiooi.taps.free

https://youtu.be/RHbiQxafGkQ

Discussion