目次
毎年恒例のアップデート
Androidアプリでアプリ内課金をするにはGoogle Play Billing Libraryを使う必要があるのですが、これは毎年メジャーアップデートされており、現在はバージョン6まで出ています。これだけであれば別にいいのですが、過去のバージョンを使っているとアプリのアップデートができないという決まりが…
具体的には
注: 2023 年 8 月 2 日以降、すべての新規アプリでは Billing Library バージョン 5 以降を使用する必要があります。また既存のアプリのアップデートについては、2023 年 11 月 1 日より Billing Library バージョン 5 以降の使用が必須となります
というように、一つ前のバージョンまでは許容されますが、2つ前、つまりバージョン4を使っているアプリはアップデートできなくなります。
事実上2年しか持たないライブラリとなるわけで、毎年対応する必要がある感じですね。
と言うわけで今回はバージョン5からバージョン6への対応をまとめたいと思います。
詳しくは下記のURLから確認していただくのが手っ取り早いかつ確実です。
(外部サイト)Google Play Billing Library 4 または 5 からバージョン 6 に移行する
https://developer.android.com/google/play/billing/migrate-gpblv6?hl=ja
ということで、ここでは実際にこんなケースの場合にどう対応したかまとめたいと思います。
ちなみに以下のような設定というか環境になってます
- 言語はKotlinで記述
- 定期購入(いわゆるサブスク)かつ2種類の購入アイテムがあり、購入済みアイテムを切り替えるとただちにアップグレードまたはダウングレードされる
これが消費型アイテムだったりするとまた変わるのかもしれませんが、今回は割愛します。
実際にバージョンアップしてみた
Android Studioでライブラリのアップデートをしてみると案の定エラーがありました。ただバージョン4→5よりかははるかに少ないです。(SKUが非推奨になったりしていたので)
今回はそこを取り上げてきます。
Purchase.PurchaseState.PENDINGの時のOrderIdがnull
真っ先にエラーが出たのはこの部分です。実はPENDINGの時も処理を入れていたのですが、おそらくバージョン6からThe order ID will be null if the purchase is in the Purchase.PurchaseState.PENDING state and populated if the purchase has transitioned to the Purchase.PurchaseState.PURCHASED state.
(購入が Purchase.PurchaseState.PENDING 状態にある場合、注文 ID は null になり、購入が Purchase.PurchaseState.PURCHASED 状態に移行した場合に設定されます。)
となり、PENDINGにOrderIdは取れなくなりました。
なので、PENDING時はOrderIdを使った処理を書かないようにしましょう。(普通はしないか…)
実はエラーはこれだけで、実はこの状態でも動くのですが、非推奨の指摘が1カ所あったので潰したいと思います。
setReplaceProrationMode とかは非推奨
「これを使え」と言われてすぐに非推奨になる微妙な感じがありますが、非推奨と言われたら直すしかない
1 2 3 4 |
val updateParams = BillingFlowParams.SubscriptionUpdateParams.newBuilder() .setOldPurchaseToken(oldPurchaseToken) .setReplaceProrationMode(BillingFlowParams.ProrationMode.IMMEDIATE_WITH_TIME_PRORATION) .build() |
これは「定期購入中に違うプランを申し込んだときにどうするか(この場合は直ちにアップグレードまたはダウングレードする)」という処理ですが、今回のバージョンでは2カ所の非推奨ポイントがあります。
簡単に言うと
- setReplaceProrationMode(Int) は使わないでね
- BillingFlowParams.ProrationModeも使わないでね
ドキュメントにもそれぞれ
This method is deprecated.
UsesetSubscriptionReplacementMode(int)
instead.
This @interface is deprecated.
useBillingFlowParams.SubscriptionUpdateParams.ReplacementMode
instead.
https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.SubscriptionUpdateParams.Builder#setReplaceProrationMode(int)
と書かれていました。
って事で推奨される記述の変更します。
1 2 3 4 |
val updateParams = BillingFlowParams.SubscriptionUpdateParams.newBuilder() .setOldPurchaseToken(oldPurchaseToken) .setSubscriptionReplacementMode(WITH_TIME_PRORATION) .build() |
これでバージョン6に対応するようになりました。やったね!
ちなみに…
今回は影響はなかったですが、実は「BillingClient.BillingResponseCode.SERVICE_TIMEOUT」も非推奨になりました。This constant is deprecated. See
SERVICE_UNAVAILABLE
which will be used instead of this code.
[BillingClient.BillingResponseCode.SERVICE_UNAVAILABLE]を代わりに使ってくれと言うことですので、もし使っている方がいたらここも注意しましょう。
最後に
基本的に今はKotlinで記述しており、Javaで書くことは昔のアプリをアップデートする場合以外はほぼ無くなりましたが、ライブラリのアップデートなどを行う事を考えると、JavaのままでいいのかKotlinで書き直した方がいいのか迷ったりします。まぁ2年の猶予があるので未来の自分に任せる方法もアリですが、他のライブラリの件などもあったりするので、随時修正した方が負担も少ないかなと思ったりします。
(最初からKotlinで書いておけば…)