RevenueCatとは、スマホアプリでアプリ内課金を実装するのに、とても便利なサービスです。
Googleが課金用のAPIであるGoogle Play Billing Libraryをv4を必ず使うようにアナウンスがありましたので、使用するRevenueCatのプラグインも新しいものに変えないといけないなあと作業をしていました。
起こったこと
私が使用していたプラグインは以下のバージョンでした。
purchases_flutter: ^2.0.3 in_app_purchase: ^0.5.1+3
これを、とりあえずGoogle Play Billing Library v4を使用している以下に変更しようとしました。併せて、Flutter 3対応しようとin_app_purchaseのバージョンも上げることにしました。
purchases_flutter: 3.4.0 in_app_purchase: ^2.0.1
すると、こんな例外を出力し、アプリが起動しなくなってしまいました。
E/AndroidRuntime(14816): FATAL EXCEPTION: Thread-11 E/AndroidRuntime(14816): Process: jp.hogehoge.hogehoge.hogehoge, PID: 14816 E/AndroidRuntime(14816): java.lang.NoSuchMethodError: No virtual method queryPurchases(Ljava/lang/String;)Lcom/android/billingclient/api/Purchase$PurchasesResult; in class Lcom/android/billingclient/api/BillingClient; or its super classes (declaration of 'com.android.billingclient.api.BillingClient' appears in /data/app/~~AKgbd2lgmn59U0e6nd0PXg==/jp.hogehoge.hogehoge.hogehoge-W7i_53QDl58CQ33UIN34jQ==/base.apk) E/AndroidRuntime(14816): at com.revenuecat.purchases.google.BillingWrapper$queryPurchases$1.invoke(BillingWrapper.kt:383) E/AndroidRuntime(14816): at com.revenuecat.purchases.google.BillingWrapper$queryPurchases$1.invoke(BillingWrapper.kt:53) E/AndroidRuntime(14816): at com.revenuecat.purchases.google.BillingWrapper.withConnectedClient(BillingWrapper.kt:593) E/AndroidRuntime(14816): at com.revenuecat.purchases.google.BillingWrapper.queryPurchases(BillingWrapper.kt:380) E/AndroidRuntime(14816): at com.revenuecat.purchases.Purchases$updatePendingPurchaseQueue$1.run(Purchases.kt:1707) E/AndroidRuntime(14816): at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:462) E/AndroidRuntime(14816): at java.util.concurrent.FutureTask.run(FutureTask.java:266) E/AndroidRuntime(14816): at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301) E/AndroidRuntime(14816): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) E/AndroidRuntime(14816): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) E/AndroidRuntime(14816): at java.lang.Thread.run(Thread.java:923) I/Process (14816): Sending signal. PID: 14816 SIG: 9 Lost connection to device.
No virtual method queryPurchases ???
どうして「そんなメソッドはない」って言われるのか。。。
意外な方法で解決
queryPurchasesメソッドがないってどういうことなのだろうとGoogle先生に聞いてみたところ、以下の記事が見つかりました。
BillingClient#queryPurchasesAsync() の追加と BillingClient#queryPurchases() の削除予告
一歩先のGoogle Play Billing Library v5では、queryPurchasesメソッドが削除され、その前段のv4ではqueryPurchasesメソッドは非推奨扱いにされるということでした。
これらから、どうやら作成しているアプリはGoogle Play Billing Library v5を参照しており、それで「queryPurchasesメソッドが存在しない」と例外を吐いているということがわかります。
しかし、purchase_flutterはGoogle Play Billing Library v4を使用しているバージョンなのに、なぜv5のAPIを叩いて「存在しない」と言っているのか、意味がわかりませんでした。
・・・盲点がありました。悪さをしているのはこいつでした。
in_app_purchase: ^2.0.1
アプリ内課金のレシート情報を取得するためだけに使用しているin_app_purchase 2.0.1がGoogle Play Billing Library v5を使用していました。
in_app_purchaseのバージョンを一旦元の0.5.1+3に戻すと、例外を吐くことなくアプリが起動するようになりました。。。