2017年9月22日金曜日

Play Billing Library 1.0 がリリースされました

2017年9月19日に Play Billing Library の 1.0 がリリースされました(Android Developers Blog : Google Play Billing Library 1.0 released)。



Play Billing Library 1.0 では自動で com.android.vending.BILLING Permission が追加されるので手動で追加する必要はありません。

ライブラリの設定
  1. compile 'com.android.billingclient:billing:1.0'  
  2. or  
  3. implementation 'com.android.billingclient:billing:1.0'  
BillingClient というクラスを利用します。
  1. val billingClient : BillingClient = BillingClient.newBuilder(context)  
  2.         .setListener(this// PurchasesUpdatedListener  
  3.         .build()  
Builder パターンになっていますが、PurchasesUpdatedListener を設定しないと build() を呼んだときに IllegalArgumentException が起こります。
IabHelper にあった enableDebugLogging() に相当するメソッドは BillingClient にはありません。


開始と終了

IabHelper の startSetup() に相当するのが BillingClient.startConnection() です。 startConnection() で開始して endConnection() で終了します。
  1. private lateinit var billingClient: BillingClient  
  2. private var isBillingClientConnected: Boolean = false  
  3.   
  4. override fun onCreate(savedInstanceState: Bundle?) {  
  5.     super.onCreate(savedInstanceState)  
  6.   
  7.     billingClient = BillingClient.newBuilder(this)  
  8.             .setListener(this)  
  9.             .build()  
  10.   
  11.     startServiceConnection(null)  
  12. }  
  13.   
  14. private fun startServiceConnection(executeOnSuccess: Runnable?) {  
  15.     billingClient.startConnection(object : BillingClientStateListener {  
  16.         override fun onBillingSetupFinished(@BillingClient.BillingResponse response: Int) {  
  17.             when (response) {  
  18.                 OK -> {  
  19.                     isBillingClientConnected = true  
  20.                     executeOnSuccess?.run()  
  21.                 }  
  22.                 else -> {  
  23.                     ...  
  24.                 }  
  25.             }  
  26.         }  
  27.   
  28.         override fun onBillingServiceDisconnected() {  
  29.             isBillingClientConnected = false  
  30.         }  
  31.     })  
  32. }  
  33.   
  34. override fun onDestroy() {  
  35.     billingClient.endConnection()  
  36.     super.onDestroy()  
  37. }  


購入

購入処理は BillingClient の launchBillingFlow() で開始します。
  1. val params = BillingFlowParams.newBuilder()  
  2.         .setType(BillingClient.SkuType.INAPP)  
  3.         .setSku(SKU_INAPP)  
  4.         .build()  
  5.   
  6. val responseCode = billingClient.launchBillingFlow(activity, params)  
  1. val params = BillingFlowParams.newBuilder()  
  2.         .setType(BillingClient.SkuType.SUBS)  
  3.         .setSku(SKU_SUBS)  
  4.         .addOldSku(SKU_OLD_SUBS) // replace するときは必須  
  5.         .setReplaceSkusProration(true// Optional : デフォルトは false  
  6.         .setAccountId(hashedUserAccountId) // Optional : 難読化されたユーザー別の文字列  
  7.         .setVrPurchaseFlow(false// Optional : デフォルトは false  
  8.         .build()  
  9.   
  10. val responseCode = billingClient.launchBillingFlow(activity, params)  
BillingFlowParams の各設定値については BillingFlowParams.Builder のドキュメントをよく読みましょう。

購入処理の結果は PurchasesUpdatedListener の onPurchasesUpdated() で通知されます。

launchBillingFlow() の戻り値と PurchasesUpdatedListener.onPurchasesUpdated() の第1引数は @BillingClient.BillingResponse です。
  1. override fun onPurchasesUpdated(@BillingClient.BillingResponse responseCode: Int, purchases: List<Purchase>?) {  
  2.     when (responseCode) {  
  3.         OK -> {  
  4.             if (purchases != null) {  
  5.                 purchases.forEach {  
  6.                     handlePurchase(it)  
  7.                 }  
  8.             } else {  
  9.                 ...  
  10.             }  
  11.         }  
  12.         ITEM_ALREADY_OWNED -> {  
  13.             ...  
  14.         }  
  15.         USER_CANCELED -> {  
  16.             // do nothing  
  17.         }  
  18.   
  19.         ...  
  20.   
  21.         else -> {  
  22.             ...  
  23.         }  
  24.     }  
  25. }  
第2引数は最新の購入(Purchase)リストです。

IabHelper のときは com.android.vending.billing.PURCHASES_UPDATED を受け取るために IabBroadcastReceiver を用意していましたが、その必要はなくなりました。代わりに、アプリからの購入だけでなく Play Store で開始された購入のときも onPurchasesUpdated() に通知されます。


購入済みアイテムの問い合わせ

BillingClient の queryPurchases() で行います。 このメソッドは Google Play Store アプリが提供するキャッシュから結果(PurchasesResult)を受け取ります。ネットワーク処理は開始されません。
  1. val result : PurchasesResult = billingClient.queryPurchases(BillingClient.SkuType.INAPP)  


購入可能なアイテムの問い合わせ

BillingClient の querySkuDetailsAsync() で行います。 問い合わせるアイテムは SkuDetailsParams で設定します。
  1. fun querySkuDetailsAsync() {  
  2.     val executeOnConnectedService = Runnable {  
  3.         val params = SkuDetailsParams.newBuilder()  
  4.                 .setType(BillingClient.SkuType.INAPP)  
  5.                 .setSkusList(listOf("gas""premium"))  
  6.                 .build()  
  7.   
  8.         billingClient.querySkuDetailsAsync(params) { responseCode, skuDetailsList ->  
  9.             when (responseCode) {  
  10.                 OK -> {  
  11.                     skuDetailsList?.forEach {  
  12.                         ...  
  13.                     }  
  14.                 }  
  15.                 else -> {  
  16.                     ...  
  17.                 }  
  18.             }  
  19.         }  
  20.     }  
  21.   
  22.     if (isBillingClientConnected) {  
  23.         executeOnConnectedService.run()  
  24.     } else {  
  25.         startServiceConnection(executeOnConnectedService)  
  26.     }  
  27. }  


注意

2017年9月22日時点では、https://codelabs.developers.google.com/codelabs/play-billing-codelab は dp-1 の内容なので古いです(Builder インスタンスの生成方法や購入可能なアイテムの問い合わせのAPIが 1.0 で変わっています)。https://github.com/googlecodelabs/play-billing-codelab は新しくなっています。

追記: https://codelabs.developers.google.com/codelabs/play-billing-codelab も更新されました。



0 件のコメント:

コメントを投稿