web-dev-qa-db-ja.com

queryPurchases()とqueryPurchaseHistoryAsync()を比較して、機能を「復元」しますか?

Play課金ライブラリを使用して、購入をトリガーおよび管理し、それによりアプリ内の追加機能のロックを解除しました。この部分は機能しています。

ただし、購入を「復元」するための最良の方法は何ですか。たとえば、アプリを購入した人が新しい電話を購入したとします。 Playストアにログインし、アプリをダウンロードして、「アップグレード」するための支払い画面が表示されていることを確認します。 iOSにはこのための特定の方法がありますが、Android用の方法は知りません。

私の考えは、Playストアをクエリして、アカウントが以前に正常にアイテムを購入したかどうかを確認することです。購入した場合は、アプリ内のローカルアップグレード機能を呼び出します。

2つの同様の方法があるようです。しかし、このシナリオではどちらを使用すればよいですか?ユーザーがスマートフォンを拭いたか、新しいスマートフォンを購入した場所はどこですか?

queryPurchases()?またはqueryPurchaseHistoryAsync()

17
laurie

ドキュメントごとにqueryPurchasesはPlayストアアプリのキャッシュを使用して結果を取得し、queryPurchaseHistoryAsyncは実際にPurchase APで最新の購入を確認します。したがって、あなたの場合はAsyncmethodを確認する必要があります。

queryPurchases

アプリ内で購入したすべてのアイテムの購入の詳細を取得します。このメソッドは、ネットワークリクエストを開始せずに、Google Playストアアプリのキャッシュを使用します。

queryPurchaseHistoryAsync

購入が期限切れ、キャンセル、または消費されている場合でも、ユーザーがSKUごとに行った最新の購入を返します。

また、ドキュメントも確認してください。 Cache purchase details on your servershttps://developer.Android.com/google/play/developer-api.html#practices

8
daniribalbert

queryPurchasesを使用する必要があります。これにより、各SKUの現在のアクティブな(消費されず、キャンセルされず、期限切れにならない)購入がすべて得られます。

queryPurchaseHistoryAsyncは、各SKUの最新購入のリストを提供するだけなので、必要なことを行いません。有効期限が切れているか、キャンセルされているか、消費されている可能性があり、通知する方法がありません。したがって、このレスポンスを使用して、アプリに適用する購入を特定することはできません。

私の知る限り、queryPurchaseHistoryAsyncの唯一の有効な使用法は、ユーザーに購入履歴のリストを提供することです。それはちょっと変わったボールです。

注:queryPurchasesは同期的であるため、ほとんどの場合、なんらかのバックグラウンドワーカースレッドで実行する必要があります。私はAsyncTaskで実行します。

12
HughHughTeotl

onBillingSetupFinished()メソッドに以下を記述します。

_billingClient.querySkuDetailsAsync(params.build(), (responseCodeQuery, skuDetailsList) ->
{
    if (responseCodeQuery == BillingClient.BillingResponse.OK && skuDetailsList != null)
    {
        SkuDetails skuDetails = skuDetailsList.get(0);
        BillingFlowParams flowParams = BillingFlowParams.newBuilder()
                .setSkuDetails(skuDetails)
                .build();
        billingClient.launchBillingFlow(MainActivity.this, flowParams);
    }
});
_

ユーザーが以前に購入したことがある場合は、onPurchasesUpdated()メソッドでresponseCodeを次のように使用できます。

_@Override
public void onPurchasesUpdated(int responseCode, @Nullable List<Purchase> purchases)
{
    if (responseCode == BillingClient.BillingResponse.ITEM_ALREADY_OWNED)
    {
        // already owns item
    }
}
_
0
CopsOnRoad