ラベル In-app Billing の投稿を表示しています。 すべての投稿を表示
ラベル In-app Billing の投稿を表示しています。 すべての投稿を表示

2016年1月21日木曜日

[Android] In-app Billing v3を使ってライセンス購入を実装するLicenseManagerをアップデートしました

憂鬱なムックを助ける友の会: [Android] In-app Billing v3を使ってライセンス購入を実装する で紹介していたLicenseManagerクラスですが、onCreateでnewして、onResumeでisLicensePurchased()メソッドにて購入状態を判定するという作りにしていましたが、onCreateからonResumeが走るまでにIn-app Billing APIが結果を返しきる保証は何もないので、判定を誤るという可能性がありました。

そこで、そのバグ(そう、これはバグです!すみませんっ!!)を修正しましたのでご案内します(そして、コミットログ、ミスりました。。。恥ずかしい。。)

https://github.com/shinchit/LicenseManager

使い方はほぼ変わりません。ただ、newした段階でIn-app Billing APIが結果を返し済みであることを確認してから先の処理に進むように改修していますので、newの直後にisLicensePurchased()メソッドを使っても問題ありません。

技術的には、非同期処理の順番、完了待ちを保証するために、JDeferredというライブラリを利用しています。
そのため、appレベルのbuild.gradleのdependenciesに

 compile 'org.jdeferred:jdeferred-android-aar:1.2.4'

といった記述が必要です(バージョンは適宜調整してください。動作確認をとっているのは1.2.4です)。

JDeferredの細かい使い方については、公式、または次のページがわかりやすいです。

Java - Androidの非同期処理を綺麗に書けるjdeferredが便利! - Qiita

LicenseManagerでは、以下の記述でnewの中でIn-app Billing APIへの非同期リクエストが帰ってくるのを待ち合わせています。

ちなみに、ここではJavaのλ式(ラムダ式)を利用しています。が、別に使わなくても問題ないです^^
ただ、見てお分かりの通り、λ式を使うと型の迂遠な明示が省略できるので楽に読み書きでき、スッキリして見えます。

また、GitHub上のLicenseManagerでは、アプリのライセンスキーを暗号化せずにそのまま渡していますが、実際のリリースapkを作る際にはそれはオススメできません。ライセンスキーは暗号化して保持し、これを復号化してLisenceManagerに渡すようにするべきです。とはいえ、暗号化のseedはapk内に持つため、その気になれば簡単に復号化もできてしまうのですが。。。万全を期すなら、seedを外部のサーバ(Webサーバなど)において、SSLでそれを取得してというのが良いのでしょうが、、、そこまでやる必要もないかと(というか、それをやると実装によってはオフラインでアプリを使用できないシーンが出てくるし)。
この辺の、暗号化・復号化の話はまた別エントリーで取り上げます。

2015年5月24日日曜日

[Android] In-app Billing v3を使ってライセンス購入を実装する

Androidアプリでアプリ内課金を行う場合、Google Play In-app Billingを使ってGoogle Playに決済を任せる設計が一般的&楽です。

アプリ内課金には、スポット課金(一度きりの購入)と定期購読(繰り返し自動課金)を使うことができ、スポット課金を利用するとアプリのライセンス購入を表現することができます。

最初は、無料でダウンロードしてもらって使ってみてもらい、気に入ったらライセンスを購入してもらって、加えていた制限(例えば利用期限だったり、機能制限だったり、広告非表示だったり、色々)を解除することが可能というわけです。

このアプリ内課金を実装するための手順は次の記事が参考になります。

Androidのアプリ内課金IABv2のサービス終了と新しいIABv3への移行方法 - Qiita

基本的には、挙げた記事の通り、環境を作って、Googleが提供しているサンプルを取り込んでゴチャゴチャやればOKなのですが、今後はシンプルにやりたいと思いましたので(=今回は初めててで結構苦戦しました)、ライセンス管理を行うユーティリティクラスをGoogleのサンプルをベースに作りましたのでGitHubで公開しておきます。ライセンスはMITです。

https://github.com/shinchit/LicenseManager

使い方は、次の通りです。



onActivityResultメソッドでは、特に購入処理の実行結果によってなんらかの処理を行う必要がなければ、シンプルにスーパークラスのonActivityResultに処理を転送すればOKです。

あと、実装以外にもライセンス購入の組み込みには色々と落とし穴もあるので、次の記事も必読です。

アプリ内課金の実機テストのワナ - GADGET FACTORY 雑記帳