テストステ論

高テス協会会長が, テストステロンに関する情報をお届けします.

(etiles report) Google Play Serviceのリーダーボードと連携させました

play.google.com

当初の予定ではリーダーボードの実装は正式リリース後と思っていたのですが,

  • このゲームはリーダーボードなしでは続けてプレイするモチベーションを保てない
  • リリースしたあとに難しい実装を追加するのは大変

ということでBetaでやることにしました. お楽しみください. 上のリンクをスマホから開くか, あるいはGoogle Playで"etiles"と検索してもらえば見つかります.

www.youtube.com

Google Play Serviceは, アカウントの管理やリーダーボードなど, モバイルゲームに必要な機能を無料で提供しています. アカウント管理は認証自体はグーグルアカウントと結びついていて, 他のアプリでログインしてると(通常はGMailとかでログインしてますよね)自動的にログインされます(そしてそれが要求仕様です). しかし, 本名でリーダーボードには載りたくないのがふつうなので, Gamers IDというのを設定することが出来て(というか自動的に要求されます), これが使われます. おれはGodAimAkiraです.

実装上の仕組みとしては, Androidの起動時にMainActivityを立ち上げるところで(実際には閉じてからまた開くケースを考えてonResumeに実装することが推奨されています)バックグラウンドのサインイン(signinSilently)を実行して, 失敗した場合のみIntentを表示します. その後はReactNative用とのブリッジが初期化されて, その中でアプリケーショングローバルなコンテキストを使ってサインイン状態に常にアクセスしつつ, リーダーボードへの処理(submitScoreImmediateなど)を実行するという感じです.

Androidのことがわからなかったので少し勉強が必要でしたが, 実装は自体は難しくありませんでした. しかし, なかなかリーダーボードにスコアを送ることが出来ずに嵌りました. リーダーボードが使えないとこのアプリは完全に無価値です. すでに100時間はゆうに時間をかけてしまっており, オープンソースにしてしまい開発実績として終わりにするのも少しためらわれるレベルになっていました. ノイローゼになってました.

症状としては, 「Google Playにリリースしたものはダメだが, ローカルでのデバグビルドやリリースビルドはスコアを送信出来る」というもので, 色々なことを疑って, 結果として副次的にgradle.buildを改善出来たりもしたので良かったとは思いますが, 根本的な原因を共有します.

Google Play Serviceのリーダーボードを利用する時には, アプリとリンクします. アプリには鍵がついており, リンク時にはアプリのパッケージ名と鍵のSHA1で認識します. リンクされたアプリから送られてきたリクエスト以外は弾くという仕組みです. リーダーボードは複数作ることが出来て, etilesの場合ではオープンβ用のbetaと, ローカルでのデバグビルド用のtestという2つのリーダーボードを使い分けています.

Androidのアプリを開発する時にサインをすることが必要です. デフォルトではデバグ用の鍵は自動生成されますが, リリース用には必要で, keytoolを使って作成します. その上で, 作ったkeystoreを使うように設定ファイルを書いたりすれば, ビルド時にサインをするという仕組みです. etilesの場合は, デバグビルド用にも鍵を用意してます. なぜかというと, 自動生成された謎の鍵ではリーダーボードとリンクすることが出来ないからです. そのためリリースビルドと同様に明示的に鍵を作る必要があります.

その上で, 以下のようにリーダーボードと鍵をリンクさせたために失敗していました.

  • リーダーボード (beta)
    • リリース用鍵
  • リーダーボード (test)
    • デバグ用鍵

しかしこれではGoogle Playから落としたAPKでプレイした時にリーダーボードに弾かれます. なぜかというと, Google Playに上げた時点で, Google PlayはAPKをサインし直すからです. 以下のページのUse Google Play Signingというのを見てください.

Sign Your App | Android Studio

このGoogle Play Signingという機能は使わないことも出来るのですが, ガイダンスに自然に従うと使うように設定されてしまうため, ほとんどの人は使うようになっていると思います. 使う場合, 自分で生成した鍵というのは正確にはupload時にしか使われない鍵であり, それ以降は捨てられてしまうのです.

なので, 動くようにするためには

  • リーダーボード (beta)
  • リーダーボード (test)
    • デバグ用鍵

のように設定する必要があるのです. こうすれば, ローカルのどのビルドでも, Google Play経由でもAPKが正常動作します.

Google Play Serviceを利用するとか, React-Nativeから使うとかに関しての知見はたまったので, 困っている方は相談してください.