OStack程序员社区-中国程序员成长平台

标题: ios - 在 Codenameone 中恢复应用内非消耗性产品 [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-13 01:16
标题: ios - 在 Codenameone 中恢复应用内非消耗性产品

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

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

        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 接口(interface)添加到我的主类中。但是下面的方法永远不会在我的 iPhone 上使用 TestFlight 构建返回 true,所以我的恢复按钮永远不会显示。这是 p.getReceipts() 总是返回一个空列表,当我期望 1 行包含我的 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(已被接受)。我在我的应用程序中有调试代码,并测试了上述方法,但仍然没有返回收据(由于我没有以沙盒用户身份登录,我看不到它是如何产生的)。

在此先感谢



Best Answer-推荐答案


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

关于ios - 在 Codenameone 中恢复应用内非消耗性产品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43598522/






欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) Powered by Discuz! X3.4