LoginSignup
10
1

More than 1 year has passed since last update.

【Flutter】in_app_purchaseのrestorePurchasesメソッドをAndroidで使った場合の注意点

Posted at

はじめに

本記事は、Flutterの公式の課金ライブラリである in_app_purchaserestorePurchases メソッドを、Androidで使った際のハマリポイントをご紹介します。

restorePurchases メソッドとは :mag:

いわゆる「復元処理」の際に使えるメソッドで、未消費の課金データを取得できます。

Android側の実装は下記のところで行っています。

ちらっと中身を見てみると、Androidで BillingClient を使ったことがある人は見たことがあるであろう queryPurchases が使われているだろうことがわかります。

in_app_purchase_android_platform.dart
// 138行目
responses = await Future.wait([
    billingClient.queryPurchases(SkuType.inapp),
    billingClient.queryPurchases(SkuType.subs)
]);

ステータスが PurchaseStatus.restored に上書きされて返却される :warning:

そんな restorePurchases メソッドですが、意図的なのかバグなのかわかりませんが、通知される PurchaseDetails(購入情報のクラス)のステータスがすべて restored となっています。

statusPurchaseStatus.restored を上書きしている箇所

Androidの場合、消費アイテムの後払い購入が可能なため、 restored になっていると、

  • 購入が成功したもの( purchased )が復元されたのか
  • 後払いのもの( pending )が復元されたのか

が判断付かないことになってしまいます。

in_app_purchase の作り上、restorePurchases メソッドを呼んだ場合と、通常の購入フローで使う buyConsumable メソッドを呼んだ場合どちらも purchaseStream にイベントが流れてくるようになっているため、本来あるべきステータスで処理ができず問題になるケースもあるでしょう。

InAppPurchaseAndroidPlatformAdditionの queryPastPurchases メソッドを使う :rocket:

上記の問題を回避しつつ復元を行う場合、InAppPurchaseAndroidPlatformAdditionの queryPastPurchases メソッドが有効です。

コードを見てみるとわかりますが restorePurchases メソッドとほぼ同じようなコードになっています。
主な違いとしては、

  • ステータス( status )を上書きしていない(※ 重要)
  • QueryPurchaseDetailsResponse を返却する

というところでしょうか。

ステータスが上書きされていないので、購入が成功したもの( purchased )なら報酬の付与、後払いのもの( pending )ならその旨をUIで表示する、といった処理が可能となります。 :thumbsup:

まとめ

restorePurchases メソッドではステータスが restored に上書きされること、その代わりとして InAppPurchaseAndroidPlatformAdditionの queryPastPurchases メソッドが使えることをご紹介しました。

この記事がなにかの参考になれば幸いです。

10
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
1