菜鸟教程小白 发表于 2022-12-13 01:16:02

ios - 在 Codenameone 中恢复应用内非消耗性产品


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

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

<pre><code>      purchaseApp.addActionListener(e -&gt; {
      if (Purchase.getInAppPurchase().wasPurchased(&#34;full_product&#34;)) {
            ToastBar.showMessage(&#34;You have already previously purchased this product.&#34;, FontImage.MATERIAL_INFO);
      ...
      } else {
            Purchase p = Purchase.getInAppPurchase();
            p.purchase(&#34;full_product&#34;);
      }
    });
</code></pre>

<p>(我没有对收据或收据商店做任何事情。)</p>

<p>但为了符合 Apple 的要求,我需要一个“恢复购买”按钮,这样用户就不会在新设备上再次付款。困难在于逻辑正确,因为我只希望在他们之前支付过费用的情况下显示“恢复”按钮,否则我只希望显示“购买”按钮。</p>

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

<pre><code>    private boolean userHasPreviousPurchased() {

    Purchase p = Purchase.getInAppPurchase();
    if (p.isRestoreSupported()) {
      p.synchronizeReceipts();
      List&lt;Receipt&gt; receipts = p.getReceipts();
      for (Receipt receipt : receipts) {
            if (receipt.getSku().equalsIgnoreCase(&#34;full_product&#34;)) {
                return true;
            }
      }
    }
    return false;
}
</code></pre>

<p>请您指出正确的方向。使用 CN1 API,您如何使用此类 IAP 测试以前的购买?</p>

<p>我尝试创建一个沙盒测试用户,并在我的设备上注销后,使用该用户购买 IAP(已被接受)。我在我的应用程序中有调试代码,并测试了上述方法,但仍然没有返回收据(由于我没有以沙盒用户身份登录,我看不到它是如何产生的)。</p>

<p>在此先感谢</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>如果您想跟踪谁已经购买了您的产品,您需要有一个服务器端组件来存储它。 Receipts API 依赖于此,并要求您实现 ReceiptStore。查看这些详细介绍此内容的博客文章。</p>

<ul>
<li> <a href="https://www.codenameone.com/blog/intro-to-in-app-purchase.html" rel="noreferrer noopener nofollow">Introduction to In-App Purchase</a> </li>
<li> <a href="https://www.codenameone.com/blog/in-app-purchase-non-renewable-subscriptions.html" rel="noreferrer noopener nofollow">Non-renewable Subscriptions</a> - 这将向您介绍 ReceiptStores 及其工作原理。</li>
<li> <a href="https://www.codenameone.com/blog/autorenewing-subscriptions-in-ios-and-android.html" rel="noreferrer noopener nofollow">Auto-renewing Subscriptions in iOS and Android</a> - 这包括适用于 Android 和 iOS 的客户端和服务器的完整示例代码。</li>
</ul></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 在 Codenameone 中恢复应用内非消耗性产品,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/43598522/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/43598522/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 在 Codenameone 中恢复应用内非消耗性产品