【问题标题】:How to save the state of inApp purchase如何保存inApp购买状态
【发布时间】:2013-12-03 05:29:16
【问题描述】:

我在我的游戏应用中实现了应用内购买,前三个级别是免费的,然后用户必须付费才能解锁剩余的 7 个级别。

应用内购买运行良好。但是一旦用户购买了该物品,我应该如何处理它,以便下次他可以看到已解锁的关卡。我是否应该将其保存在 sharedPreferences 中并每次检查。或者我应该每次从谷歌控制台查询以检查特定 id 的状态。

如果有人可以建议我正确的方法,将非常感谢..

如果用户卸载应用并在同一设备上再次安装,该行为应该如何?

【问题讨论】:

    标签: android in-app-purchase in-app-billing


    【解决方案1】:

    如果您使用托管购买,则使用 RESTORE_TRANSACTION 是唯一的方法。如果您使用非托管购买,您可以将购买状态存储在自己的服务器上,但这并不简单。

    RESTORE_TRANSACTIONS 并不复杂:您只需触发命令,就会收到与您首次购买商品时格式完全相同的交易信息通知。您应该以完全相同的方式处理它,并且很可能您的应用程序中已经有了相应的代码。对此进行测试有点困难,因为它实际上不适用于测试帐户,并且您需要一个实时应用。

    再次查看official 文档以了解其工作原理。

    管理应用程序产品数据的三种方式。

    1)SharedPrefrence:您可以使用share prefrence值并检查它是否被购买。如果万一用户卸载了应用程序然后重新安装了应用程序,那么您可以检查用户是否已购买,此时您会得到该项目已经购买。而且您必须管理用户才能访问您的应用程序数据。

    2)本地数据库:您也可以使用本地sqlite数据库来存储购买细节和购买状态。和上面一样,如果用户清除数据或卸载应用程序然后再次请求购买物品并检查用户是否购买了物品。

    2) 服务器数据库: 如果您使用网络服务器来存储用户数据,这是比上面更好的方法。在这种情况下,如果用户卸载应用或清除应用数据,您甚至不需要第二次管理。

    3) 混淆:(与共享偏好相比最有效的方式)

    更多实现详情请查看HERE

    这里是如何恢复交易的 sn-p:

    private void restoreTransactions() {
        if (!mBillingObserver.isTransactionsRestored()) {
            BillingController.restoreTransactions(this);
            Toast.makeText(this, R.string.restoring_transactions, Toast.LENGTH_LONG).show();
        }
    }
    

    已编辑:

    api 的 V3 不再需要恢复购买。可以直接查询购买的商品。

    请阅读查询已购买项目部分: http://developer.android.com/google/play/billing/billing_integrate.html
    getPurchases() method description

    要获取已购买的商品详情,请尝试如下:

    IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() {
        public void onQueryInventoryFinished(IabResult result,
                Inventory inventory) {
            if (result.isFailure()) {
                complain("Failed to query inventory: " + result);
                return;
            }
    
            mIsPremium = inventory.hasPurchase(SKU_PREMIUM); ------> By here you can get information 
    
        }
    };
    

    【讨论】:

    • 感谢您的回答。您能否更详细地告诉我如何使用 RESTORE_TRANSACTIONS。我正在使用 V3 版本
    • 我使用“IabHelper”来购买商品。我可以调用 getPurchases() 吗?或者 sud 我将 mService 公开然后使用它?使用“IabHelper”时有标准方法吗?谢谢你的回答。
    • 总是乐于助人.. :)
    • @GrIsHu 在没有互联网连接的情况下无法查询购买的商品。
    【解决方案2】:

    是的,您可以将其保存在 sharedPreferences 中,但是如果用户重新安装应用程序,这些将被删除。使用 sharedPreferences 很聪明,因为用户不必在每次使用您的应用时都在线。但是,如果他们在线,您将希望管理购买(请参阅下面的网站源),以便您的应用程序将在打开时检查他们购买的内容。

    如果您使用的是 API 3 或更高版本,则该信息已缓存在设备上。如果网络可用,调用服务器仍然是明智的,但您也可以使用getPurchases 进行检查。

    请看:来源http://developer.android.com/google/play/billing/api.html

    【讨论】:

    • 但是使用共享首选项可以很容易地被任何有根的手机破解,对吧?
    猜你喜欢
    • 2014-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多