2017年12月26日火曜日

Google Play game services いばらの道

ゲームサービスなんぞは、一度通った道。 既に過去作で実装したことがあるので、できんことはないだろう。 しかし、この手のやつはなるべく Google が推奨する新しい形式で取り入れないとバグの温床となりかねない事情がある。 古いソースを繰り返すのは、あまり懸命ではない。

なるべく最新の型を取り入れよう。 なので、比較的新しい記事を参考にして、コードのつまみ食いだ。 私が知っているやり方とは全然違うなあ。 で、やってみたらサインイン(ログイン)がうまくいかない。 あっちこっちから、つまんでいるのでわけが分からなくなってきた。

結局、BaseGameUtils をライブラリに加えた方が、よさそうぞ? と、いうことになりましたので、 じゃあ入れてみよう。と、いうことでダウンロードしようと思って、ググってみましたが、何と!(どこにあるのか)わかりません。 「〇〇が全裸」みたいな興味深い動画を観ようとして、さんざんたらい回しにされた挙句、たどり着けない感じに似ています。 しかたがないので、過去作である The Melancholy Of Ghosts からインポートすることにしました。 こういうとき、長いことやってきた経験が活きますね。資産があるというか…。

ググったら何でも分かるんでしょ? っていうかもしれませんが、分かりません。 まず、Google の提供するサービス自体が日進月歩で変わっていきますし、 開発環境もかつての eclipse(2014年くらいまで主流)から移り変わって、今や Android Studio、Unity、など当然のように古い文献が役に立たないものが台頭しています。 さらに、Fire Base の存在もややこしさに拍車をかけます。 また、恐ろしいことにサンプルコードのスペルが間違っている場合すらありました(個人サイトでね)。connected と書くべきところが、 conected ですかね、まあ間違っていたらコピペしても当然コンパイルできないわけで、困りますわ。

public class MainActivity extends BaseGameActivity implements View.OnClickListener,GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {

BaseGameActivity を継承しています。 結局、限りなく古いやり方をなぞることになりました。 そうしないとできなかったもので。

SHA1 フィンガープリントの登録

ただし、今回はゲームサービスを Fire Base と紐づけてプロジェクト作成しています。ここだけ、最先端です。 かつては、後付けでフィンガープリントを変えることはできませんでしたが、この点に関しては便利になっています。 firebase console を開き、ゲームサービスの該当するプロジェクトを開きます。 Authentication を選び、ログイン方法のタブを選択。Google を押すと、説明のト書きがでてくるので、 その中にある「プロジェクトの設定」のリンクをクリックします。 下の方にいくと、「フィンガープリントを追加」の文字があるので、それをクリックすると入力可能です。 一つのフィンガープリントは一つのプロジェクトでしか使用できません。 間違えても、ゴミ箱マークを押すと削除することができ、入力のし直しが可能です。

紆余曲折あったが、これで成功か…。

と、こ、ろ、が…。さあ、サインイン成功してリーダーボードの呼び出しもできた。 じゃあ、リリース版のビルドをするかっ、てなりますが、ここで Generate Signed APK を行うと、エラーがでて完了しません。 どうやら、外部参照が重複していることを怒られているようですが…。 dependencies {} 内の


compile project(':BaseGameUtils')

これを削除すると、コンパイルができました。 しかし、こうするとサインインができません。

堂々巡りの無間地獄の始まりだ、アリジゴク、底なし沼…ン。 光明はささない。 が、しかし、これで選択肢が2つに増えました。

・グレードルのdependencies {} 内の記述を頑張る
・BaseGameUtils を解析して必要最低限をパクる

前者がどうしようもなく、意味不明だったので、私の技術力ではお手上げ。 後者にチャレンジすることに。 注目したのは、GameHelper.java の GoogleApiClient.Builder createApiClientBuilder() というメソッド。 これ絡みでググってみると、「ビンゴ!」っぽいのを発見。
GoogleApiClientのライフサイクル管理を自動化してみる
いやあ、お世話になりますぜ、へっへっへ…。


        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .addApi(Games.API).addScope(Games.SCOPE_GAMES)
                .enableAutoManage(this, this)  // ← この一行を追加するだけです
                .build();

こうですね、で、当然、BaseGameUtils を使わないわけですから、 スーパークラスの継承もとりやめです。 ただし、通常の Activity だと具合が悪いので、AppCompatActivity を継承します。

public class MainActivity extends AppCompatActivity implements implements View.OnClickListener,GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {

そして肝心の build.gradle (app) ですが、こうなりました。


dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:23.4.0'
    compile 'com.google.firebase:firebase-ads:11.2.0'
    compile 'com.google.android.gms:play-services-games:11.2.0'
    testCompile 'junit:junit:4.12'
}

apply plugin: 'com.google.gms.google-services'

firebase-ads:11.2.0 は広告の絡みで導入しています。 もちろん、人によって必要な外部ライブラリは変わってきますので、何が正解ということはありませんが、 可能な限り最低限に抑えた方がよさそうです。

なんでハマったのか、やっとわかったぞ

「なんでハマったのか、やっとわかったぞ」と言われても「はあ、何か間違っていたんでしょ」と思うだけでしょう。 だけど当の本人は「何を間違っているか」をずっと勘違いしているんですね。 イライラして冷静さを失うとこうなります。 いっつも2時間も作業したら飽きてしまって外に出かけるのですが、今回は珍しく長時間机上で煮詰まっていました。 しかし、逆効果だったね。外の空気を浴びて…落ち…着いて…考えた方が、案外うまくいくものです。

じゃあ、言わせてもらいますけど、昔はデバッグキーストアのSHA1で登録したリーダーボードにガンガン記録を送信できたわけです。で、本番(リリース版)で試してみると、リリース用の署名(異なるSHA1を使っている)だとデバッグキー対応のゲームサービスプロジェクトに接続できないんですね。それで、何でやあ? 何でアクセスのサクセスがでけへんのやあ! と困惑したのです。多くの者が通る道です。

・デバッグ環境 >>> デバッグキーのゲームサービスと通信可能
・本番環境(一般人がDLするアプリそのもの) >>> 署名キーのゲームサービスと通信可能

ところが、今はですね。デバッグのSHA1で登録したゲームサービスに接続はできるけど、スコアの送信はできないんですね。 そんなわけで、うっかりデバッグキーでゲームサービスのプロジェクトを作ってしまったことに、長いこと気づきませんでした。 あと、広告用に作った Fire Base のプロジェクトに SHA1 の登録はしていなかったのですが、いつの間にか謎の SHA1 が登録されていたんですよ。今考えれば、アプリをプレイストアにリリースしたときに、SHA1 が自動で反映されたとしか思えないのですが、何なんだこの謎の署名は? と、長いこと真実に気づきませんでした。まあ、捨てないでよかった。

だからですね、テスト環境でゲームサービスを試そうと思ったら、今はかなりめんどくさいのです。 公開前のテストを行う手順を公開します。
①ゲームサービスはリリース版APKのSHA1を登録して作成する
②「公開の準備完了」のプロセスまではゲームサービス登録作業を進める
③テスト端末のアカウントのメールアドレスが登録されていない場合は登録する
④Generate Signed APK で APK を作成
⑤作った APK をテスト端末のストレージに放り込んで、それをインストールする

アルファ版とかベータ版とかあるから、それを使えってことなのかもしれませんが、個人でやる場合はそれもメンドイですしね。

0 件のコメント:

コメントを投稿