【问题标题】:Gdx-Pay find previous purchasesGdx-Pay 查找以前的购买
【发布时间】:2016-01-14 18:40:08
【问题描述】:

我正在使用 Gdx-Pay 跨平台处理我的 IAP。 一切都是从 Libgdx 的 wiki 设置的,例如:

if(PurchaseSystem.hasManager()){
        config = new PurchaseManagerConfig();
        config.addOffer(new Offer().setType(OfferType.ENTITLEMENT).setIdentifier(item1));
        config.addOffer(new Offer().setType(OfferType.ENTITLEMENT).setIdentifier(item2));
        config.addOffer(new Offer().setType(OfferType.ENTITLEMENT).setIdentifier(item3));
        config.addOffer(new Offer().setType(OfferType.ENTITLEMENT).setIdentifier(item4));

        //Stores
        config.addStoreParam(PurchaseManagerConfig.STORE_NAME_ANDROID_GOOGLE, base64EncodedKey);
        config.addStoreParam(PurchaseManagerConfig.STORE_NAME_IOS_APPLE, base64EncodedKey); // <-- CHANGE KEY

        PurchaseSystem.install(new PurchaseObserver() {
            @Override
            public void handleInstall() {
                message(" - purchase manager installed: " + PurchaseSystem.storeName() + ".\n");

                // restore purchases
                message(" - do a restore to check inventory\n");
                //PurchaseSystem.purchaseRestore();
            }

            @Override
            public void handleInstallError(Throwable e) {
                message(" - error installing purchase manager: " + e + "\n");

                // throw error
                throw new GdxRuntimeException(e);
            }

            @Override
            public void handleRestore(Transaction[] transactions) {
                // keep note of our purchases
                message(" - totally " + transactions.length + " purchased products\n");
                for (int i = 0; i < transactions.length; i++) {
                    if(transactions[i].getIdentifier().equals(item1)) {
                        item1_purchased = true;
                    }
                    if(transactions[i].getIdentifier().equals(item2)) {
                        item2_purchased = true;
                    }
                    if(transactions[i].getIdentifier().equals(item3)) {
                        item3_purchased = true;
                    }
                    if(transactions[i].getIdentifier().equals(item4)) {
                        item4_purchased = true;
                    }
                }

            }

            @Override
            public void handleRestoreError(Throwable e) {
                message(" - error during purchase manager restore: " + e + "\n");

                // throw error
                throw new GdxRuntimeException(e);
            }

            @Override
            public void handlePurchase(Transaction transaction) {
                message(" - purchased: " + transaction.getIdentifier() + "\n");

                // dispose the purchase system
                Gdx.app.postRunnable(new Runnable() {
                    @Override
                    public void run () {
                        message(" - disposing the purchase manager.\n");
                        PurchaseSystem.dispose();
                        message("Testing InApp System: COMPLETED\n");
                    }
                });
            }

            @Override
            public void handlePurchaseError(Throwable e) {
                message(" - error purchasing: " + e + "\n");
                // throw error
                throw new GdxRuntimeException(e);
            }

            @Override
            public void handlePurchaseCanceled() {
                message(" - purchase cancelled.\n");

                // dispose the purchase system
                Gdx.app.postRunnable(new Runnable() {
                    @Override
                    public void run () {
                        message(" - user canceled! - disposing the purchase manager.\n");
                        PurchaseSystem.dispose();
                        message("Testing InApp System: COMPLETED\n");
                    }
                });
            }
        },config);

    } else {
        utils.toast_error("Connection failure, check your internet's connection");
    }

这是在核心类中的“create()”方法上执行的。

我无法解决的是 Android 和 IOS IAP 之间的关系。 苹果有严格的规定,购买只能在一个按钮上“恢复”。 但我发现每次用户想要在我的应用中使用产品时都强制按下按钮非常不方便。

我有一张产品表,每个产品下方都有按钮,上面写着“购买”/“使用”,具体取决于他们是否购买了该产品。 所以我会觉得非常令人高兴的是有一种方法可以在应用启动时简单地“检查”用户是否拥有每个产品的所有权,并在我遍历列表时应用标志(布尔值)。

我认为我可以使用“handleRestore()”,如我的代码所示。但显然(我不确定),遍历该列表以检查购买将使 Apple 拒绝我的应用程序,因为它会在没有用户请求的情况下发生。

那么我是否可以在不执行 RESTORE 请求的情况下以某种方式检查用户 Google/Apple 帐户的购买情况?

【问题讨论】:

标签: libgdx in-app-purchase


【解决方案1】:

另一种方法是将购买状态存储在首选项文件中,并在应用启动时从中读取。这将适用于 android 和 ios。

【讨论】:

    【解决方案2】:

    在 iOS 上,您应该跟踪自己购买的内容。例如当用户购买东西时,写一个文件或偏好或其他一些持久的东西来跟踪。

    Apple 在这里拼写出来:https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/StoreKitGuide/Chapters/DeliverProduct.html#//apple_ref/doc/uid/TP40008267-CH5-SW3

    在使产品可用后,您的应用需要创建一个 持久的购买记录。您的应用使用该持久性 在发布时记录以继续使产品可用。它也是 使用该记录来恢复购买,如恢复中所述 购买的产品。你的应用的持久化策略取决于类型 您销售的产品数量和 iOS 版本。

    在 Android 上您也可以这样做,或者在 Android 上您基本上可以在启动时调用“恢复购买”并让 Android 跟踪所购买的内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-17
      • 2023-03-24
      相关资源
      最近更新 更多