はじめに
本記事は、Flutterの公式の課金ライブラリである in_app_purchase の restorePurchases
メソッドを、Androidで使った際のハマリポイントをご紹介します。
restorePurchases
メソッドとは
いわゆる「復元処理」の際に使えるメソッドで、未消費の課金データを取得できます。
Android側の実装は下記のところで行っています。
ちらっと中身を見てみると、Androidで BillingClient
を使ったことがある人は見たことがあるであろう queryPurchases
が使われているだろうことがわかります。
// 138行目
responses = await Future.wait([
billingClient.queryPurchases(SkuType.inapp),
billingClient.queryPurchases(SkuType.subs)
]);
ステータスが PurchaseStatus.restored
に上書きされて返却される
そんな restorePurchases
メソッドですが、意図的なのかバグなのかわかりませんが、通知される PurchaseDetails
(購入情報のクラス)のステータスがすべて restored
となっています。
↓ status
に PurchaseStatus.restored
を上書きしている箇所
Androidの場合、消費アイテムの後払い購入が可能なため、 restored
になっていると、
- 購入が成功したもの(
purchased
)が復元されたのか - 後払いのもの(
pending
)が復元されたのか
が判断付かないことになってしまいます。
in_app_purchase
の作り上、restorePurchases
メソッドを呼んだ場合と、通常の購入フローで使う buyConsumable
メソッドを呼んだ場合どちらも purchaseStream
にイベントが流れてくるようになっているため、本来あるべきステータスで処理ができず問題になるケースもあるでしょう。
InAppPurchaseAndroidPlatformAdditionの queryPastPurchases
メソッドを使う
上記の問題を回避しつつ復元を行う場合、InAppPurchaseAndroidPlatformAdditionの queryPastPurchases
メソッドが有効です。
コードを見てみるとわかりますが restorePurchases
メソッドとほぼ同じようなコードになっています。
主な違いとしては、
- ステータス(
status
)を上書きしていない(※ 重要) QueryPurchaseDetailsResponse
を返却する
というところでしょうか。
ステータスが上書きされていないので、購入が成功したもの( purchased
)なら報酬の付与、後払いのもの( pending
)ならその旨をUIで表示する、といった処理が可能となります。
まとめ
restorePurchases
メソッドではステータスが restored
に上書きされること、その代わりとして InAppPurchaseAndroidPlatformAdditionの queryPastPurchases
メソッドが使えることをご紹介しました。
この記事がなにかの参考になれば幸いです。