【Kotlin】Google Play Billing Library 6 でアプリ内課金を実装し直したお話

  • このエントリーをはてなブックマークに追加

毎年恒例のアップデート

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 とかは非推奨

「これを使え」と言われてすぐに非推奨になる微妙な感じがありますが、非推奨と言われたら直すしかない

これは「定期購入中に違うプランを申し込んだときにどうするか(この場合は直ちにアップグレードまたはダウングレードする)」という処理ですが、今回のバージョンでは2カ所の非推奨ポイントがあります。

簡単に言うと

  • setReplaceProrationMode(Int) は使わないでね
  • BillingFlowParams.ProrationModeも使わないでね
といった感じです。

ドキュメントにもそれぞれ

This method is deprecated.
Use setSubscriptionReplacementMode(int) instead.

https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.ProrationMode

This @interface is deprecated.
use BillingFlowParams.SubscriptionUpdateParams.ReplacementMode instead.

https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.SubscriptionUpdateParams.Builder#setReplaceProrationMode(int)

と書かれていました。

って事で推奨される記述の変更します。

これでバージョン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で書いておけば…)

 

執筆者:松本[ エンジニア ]

関連記事

プログラミング

SharePointではできないこと 4選

「これってSharePointでできないの!?」なんていう瞬間、開発やカスタマイズの現場では意外と多くあります。SharePointはとても柔軟なプラットフォームですが、実は“万能ツール”ではありません。「コードを書けば何とかなる」と思って構築を進めると、モダンページの仕様や制限に阻まれて苦い思いをすることもしばしば。今回は、実際のプロジェクトや運用の中で見えてきた「SharePointではできないこと」をまとめて紹介します。 目次1 1.CSSとJSが直接使えない1.1 ク […]

Webサイト制作

WordPress納品後にクライアントが安心して運用できる仕組みづくりをしよう

ホームページ制作において、更新機能を手軽に導入できるのがWordPressです。 専門知識がなくても記事の投稿やページ編集を行いやすい一方で、クライアントが自分で運用するには、が欠かせません。 今回は、そのための仕組みづくりについてご紹介します。 制作側の方はもちろん、クライアント側でホームページ運用を担当される方も、制作時のご相談などにぜひ参考にしてみてください。 目次1 管理画面のロゴを企業ロゴに変更する2 管理画面のURLを変更する・認証などを付けてセキュリティ面を強化 […]

Webデザイン

アプリのロゴアニメーションをAfter Effectsで作成→Lottieに変換【iOS/Android対応】

こちらは、当社でリリースしたアプリ「ピンピタ」で使用しているロゴアニメーションです。 スプラッシュ画面でロゴが動くと、ぐっとアプリらしい印象になりますし、作ってみたいですよね。 今回は、After Effects(以降AE)でロゴアニメーションを作成し、アプリに組み込むまでをご紹介します。 AEと聞くと難しい印象がありますが、PremiereやFlashなどを触った経験がある方なら、すぐに慣れます。 もう一度再生 目次1 作業フロー1.1 注意点:グラデーションが使用不可2 […]

株式会社8bit (エイトビット)

東京都目黒区でWebサイト制作、Webシステム開発などを行っております。
コーポレートサイトやWebサービスの企画・提案を得意としており、自社での経験を元にアイデアをカタチにするお手伝いをさせていただいております。

Web制作に関するご相談はお気軽にどうぞ

弊社に制作をご依頼いただく際の費用感をご確認いただける、
見積りシミュレーションをご用意いたしました。