読者です 読者をやめる 読者になる 読者になる

おけやの日々

株式会社おけやのブログです。業務、企画、技術の事など様々な事を書きます。

cocos2d-x の GooglePlay の課金 API のバグを直した話

プログラムばっかり書いてるほうで吉田といいます。

グッズの発送なのですが相方と相談しましてリリースの目処が立ってからのほうがいいかなぁ

という感じになりました。先に欲しいという方がいればご連絡くだされば発送いたします。

ちなみに進捗のほうですが、先行リリースする予定の GooglePlay での課金が実装出来たなど、

もうだいぶゴールが見えて来ました。

機能的にはほぼほぼ出来上がり、微調整、バグフィックスと後はバックエンドのサーバー周りを整えるとリリースかというぐらいです。

バグフィックスが曲者である点はある程度察していただけるかとも思っています。

ちなみに GooglePlay で先行する理由ですが、 GooglePlay は不具合の修正対応が申請なしで行えるからです。

iOS の場合だと申請し、素直に通っても数日、長ければもっとかかるのでまずは GooglePlay で出して様子を見ようという事にしました。

Android ユーザーの方にはバグがあるかもしれないけどいち早く遊んでいただき、 iPhone ユーザーの方には安定したバージョンをお届けできる予定です。

またもや edge を行く辛みなのか cocos2d-x の GooglePlay の課金プラグインにけっこう辛いバグがありました。

いかにハマりいかに解決したかをここに記録として残し cocos2d-x を使用している方が今後ハマらない事を祈ろうと思います。

cocos2d-x には plugin-x というのがありまして、

Twitter でつぶやく機能や Admob で広告を貼る機能、GooglePlay や AppStore などで課金を行う機能など便利なものがいろいろ提供されています。

github.com

今回の不具合の発端は GooglePlay の課金の仕様に由来します。

GooglePlay ではアプリ内アイテムを購入する際に1つのアイテムを基本的には1回しか買えないようになっています。

もし何回も購入させる場合はアイテム消費(Consume) API を叩いてアイテムを使用したことを GooglePlay に通知しなければいけません。

上の plugin-x の IAPGooglePlay プラグインソースコードを見たところ、

その機能は実装されていました。しかしながら使ってみるとなぜか Consume が呼ばれないため、

アイテムが一回しか買えないという非常に辛い状況になりました。

一度は普通に課金出来たため「やったー出来たー」と喜んでいたのに次の日には動かなくなるという辛い状況でした。

普段 XCode で開発しているため、Android ではデバッガなどが使えません。

Android Devise Monitor で内部の動きを追跡しながらちょこちょこソースを書き換えてみたりしてがんばって原因を探りました。

過程は長くなるので結論からいうと Plugin が生成する Activity の onActivityResult が呼ばれていませんでした。

「はて? onActivityResult を呼ぶ箇所は手でコーディングしないといけないことは Readme.md に書いてあって実装したのになぜ??」となったのです。

これについても追跡を行ったところ、Plugin の API の仕様が変わっているのにも関わらず Readme.md がそれに追随していなかったのです。

merge されるかはわかりませんが、とりあえず直して pull request は送っておきました。

github.com

cocos2d-x 及び plugin-x も version 4 への活発な開発が行われているようで、こういう細かい修正は後回しになるかもしれません。

ちなみにこういう不具合に当たった時に独自実装をするべきかどうかは非常に迷うところではありますが、

おけやの場合はとりあえず広く使われているものを使ったほうが良いという方針で不具合自体を直すことにしています。

僕達が安価にゲームを開発できるのは cocos2d-x であったり周辺ツールであったりを作って公開してくれている人がいるからです。

そういう方たちに恩ばっかり受け取るのではなくちゃんと貢献もしないといけません。

現状お金でスポンサードなどをする体力は無いのでせめて技術力と時間を使ってそのような活動をしています。

一応営利企業なのでこういう活動に無限に時間を割くわけにはいきませんが、まずは手のとどくところからという感じです。