2020-10-01に更新

GodotのIn App Purchaseをコールバック形式にしてみるテスト

GodotのiOSのIn App Purchase周りは本体に実装されているのだが、これがかなり狂った仕様になっている。コールバックで値を返す代わりに、1秒後に結果を取得するためのメソッドを呼んで取得してくれ、というかなり意味不明な仕様。

実際どれくらいに呼べばいいかもわからないし、通信の問題で遅延など発生したら多分取得できないので再度呼ばなきゃいけなかったりとか、そもそも値が帰ってこないパターンはいつまでリトライ繰り返せばいいかもわからないのでかなり厳しすぎる。というか、正直使い物にならない気がする。

ということで試しにコールバック形式に変更してみている。

Godotのバージョンアップを考えると本来は直接コードをいじることは望ましくないので、一通り完成して実運用できるようなったらモジュール化した方が良さそう。外部ライブラリを含めてのモジュール化をしたことがなく、そのあたりハマったら面倒そうなのでとりあえず直接いじっている。

request_product_info

とりあえずrequest_product_infoを変更してみた。うまくいってるっぽい気がする。このコミット(超雑)。

https://github.com/dala00/godot/commit/d554a4315924e8820fac7d0f992a2229c86dd0d0

init

とりあえずAdMobモジュールを参考にして、initメソッドをつけた。下記のようにして使う。

_in_app_store.init(get_instance_id())

GodotのNodeのインスタンスIDが分かればそれに対してコールバックを返すことができるっぽい。そのため、最初にこれでインスタンスIDを渡してシングルトンに保存しておくベースの処理。

処理結果を貯める代わりにコールバックする

下記のコードの、コメントアウトしている部分で結果をためている。勘弁してほしい。その代わりに、GodotのNodeの_on_product_info_received` をcallする。

    // InAppStore::get_singleton()->_post_event(ret);
    int instanceId = InAppStore::get_singleton()->get_instance_id();
    Object *obj = ObjectDB::get_instance(instanceId);
    obj->call_deferred("_on_product_info_received", ret);

GodotのNode側

こんな感じ。

func _ready():
    if Engine.has_singleton("InAppStore"):
        _in_app_store = Engine.get_singleton("InAppStore")
        _in_app_store.init(get_instance_id())
        var result = _in_app_store.request_product_info({"product_ids": ["ticket5"]})

func _on_product_info_received(data):
    print("_on_product_info_received")
    print(data)

今のところうまくかえってきているっぽい。

2020-10-01 23:12:57.362505+0900 ios-formation[2074:940291] _on_product_info_received
2020-10-01 23:12:57.362540+0900 ios-formation[2074:940291] {currency_codes:[JPY], descriptions:[バトルの報酬が5倍にアップします],

ひとまず一通りこの形に修正してみたい。

(というか可能であればきれいに作ってそのまま本体に取り込まれたい……)

ツイッターでシェア
みんなに共有、忘れないようにメモ

だら@Crieit開発者

Crieitの開発者です。 Webエンジニアです(在宅)。大体10年ちょい。 記事でわかりにくいところがあればDMで質問していただくか、案件発注してください。 業務依頼、同業種の方からのコンタクトなどお気軽にご連絡ください。 業務経験有:PHP, MySQL, Laravel, Vue.js, React, Node, RoR 趣味:Elixir, Phoenix, Nuxt, Express, GCP, AWS等色々 PHPフレームワークちいたんの作者

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント