GodotのiOSのIn App Purchase周りは本体に実装されているのだが、これがかなり狂った仕様になっている。コールバックで値を返す代わりに、1秒後に結果を取得するためのメソッドを呼んで取得してくれ、というかなり意味不明な仕様。
実際どれくらいに呼べばいいかもわからないし、通信の問題で遅延など発生したら多分取得できないので再度呼ばなきゃいけなかったりとか、そもそも値が帰ってこないパターンはいつまでリトライ繰り返せばいいかもわからないのでかなり厳しすぎる。というか、正直使い物にならない気がする。
ということで試しにコールバック形式に変更してみている。
Godotのバージョンアップを考えると本来は直接コードをいじることは望ましくないので、一通り完成して実運用できるようなったらモジュール化した方が良さそう。外部ライブラリを含めてのモジュール化をしたことがなく、そのあたりハマったら面倒そうなのでとりあえず直接いじっている。
とりあえずrequest_product_infoを変更してみた。うまくいってるっぽい気がする。このコミット(超雑)。
https://github.com/dala00/godot/commit/d554a4315924e8820fac7d0f992a2229c86dd0d0
とりあえず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);
こんな感じ。
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は誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。
また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!
こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?
コメント