在Codenameone中恢复应用内非消费品

时间:2017-04-24 22:10:29

标签: ios iphone in-app-purchase codenameone

我的问题,我真的需要帮助,是因为我无法使逻辑工作有条件地呈现'恢复购买'按钮。

我已经使用应用程序内购买按钮构建了我的IOS应用程序,该按钮允许用户付费一次以解锁额外功能 - 类型为“非消耗性产品”。使用我的常规家庭用户Apple ID和一些其他测试Apple ID(不是沙箱测试人员),购买功能在TestFlight中正常工作。我没有Mac,因此无法使用Sandbox环境。当试用期结束时,我显示购买按钮,这将调用CN1购买API和PurchaseCallback,然后我使用存储来存储已购买的标志。

        purchaseApp.addActionListener(e -> {
        if (Purchase.getInAppPurchase().wasPurchased("full_product")) {
            ToastBar.showMessage("You have already previously purchased this product.", FontImage.MATERIAL_INFO);
        ...
        } else {
            Purchase p = Purchase.getInAppPurchase();
            p.purchase("full_product");
        }
    });

(我没有对收据或收据存储做任何事情。)

但为了遵守Apple,我需要一个“恢复购买”按钮,因此用户不会再次在新设备上付费。困难在于使逻辑正确,因为我只希望恢复按钮显示他们之前支付过的费用,否则我只想显示购买按钮。

所以我创建了下面的userHasPreviousPurchased()方法来测试要显示的按钮,并根据CN1文档将RestoreCallback接口添加到我的主类。但是下面的方法永远不会在我的IPhone上使用TestFlight构建返回true,因此我的恢复按钮永远不会显示。这是p.getReceipts()总是返回一个空的List,当我期望有一行我的SKU。

    private boolean userHasPreviousPurchased() {

    Purchase p = Purchase.getInAppPurchase();
    if (p.isRestoreSupported()) {
        p.synchronizeReceipts();
        List<Receipt> receipts = p.getReceipts();
        for (Receipt receipt : receipts) {
            if (receipt.getSku().equalsIgnoreCase("full_product")) {
                return true;
            }
        }
    }
    return false;
}

请你指点我正确的方向。使用CN1 API,您如何使用此类型的IAP测试以前的购买?

我尝试创建一个沙箱测试用户,在我的设备上注销后,使用该用户购买了IAP(已被接受)。我在我的应用程序中调试代码,测试上面的方法,但仍然没有返回收据(我没有看到它可能有什么,因为我没有以沙箱用户身份登录)。

非常感谢提前

1 个答案:

答案 0 :(得分:2)

如果您想要跟踪谁已经购买了您的产品,您需要有一个服务器端组件来存储它。 Receipts API依赖于此,并要求您实现ReceiptStore。查看这些详细介绍的博客文章。