【问题标题】:Flutter in_app_purchase queryPastPurchases() returns empty list on iOSFlutter in_app_purchase queryPastPurchases() 在 iOS 上返回空列表
【发布时间】:2019-12-12 16:26:58
【问题描述】:

为什么 queryPastPurchases() 在 android 上返回一个包含我订阅的填充列表,但在 iOS 上返回一个空列表?

我有一部 iOS SE 实体手机,我的苹果用户在 testflight 中被添加为测试人员,我在 App Store Connect 中添加了订阅,我可以购买订阅(在 testflight 中)。然而 queryPastPurchases() 返回一个空列表...

  // Gets past purchases
  Future<void> _getPastPurchases() async {
    QueryPurchaseDetailsResponse response =
        await _iap.queryPastPurchases();

    for (PurchaseDetails purchase in response.pastPurchases) {
      if (Platform.isIOS) {
        InAppPurchaseConnection.instance.completePurchase(purchase);
      }
    }

    setState(() {
      _purchases = response.pastPurchases;
    });
  }

【问题讨论】:

    标签: flutter


    【解决方案1】:

    不幸的是,这是目前插件的一个已知错误,截至目前,除了使用非官方插件之外没有其他解决方案更好......

    可以查看bug的当前状态here和非官方插件here

    【讨论】:

    • 不确定我是否应该使用解决方法在 Firebase 上持续购买。
    • 我通常会说不,通常 IAP 应该能够可靠地为您处理这个问题(例如,在恢复购买的情况下)但我偏执的一面不知何故告诉我复制用户在我的数据库中的某个地方购买以防万一......在2个不同的地方复制这些东西通常是一个坏主意,因为你会遇到保持它们同步的问题。信任的来源应该是 IAP 在正常工作时返回给您的内容。
    • 特别是因为取消。我知道 iPhone 用户联系 Apple 取消儿童购买的情况 - Apple 恢复了。不知道花了多长时间,但我可以想象几个星期。就我而言,由于购买非常便宜,我选择在 Firebase 中重复购买,如果应用程序在 iAP 或 Firebase 中找到它,我认为没问题。我不时手动检查差异。
    【解决方案2】:

    结果证明代码没有任何问题。

    为了让它工作,我必须创建一个沙盒用户。 然后我不得不从手机上当前登录的 AppID 中注销。 然后我不得不在 Xcode 中从发布到调试“编辑方案”。 然后我在终端运行“flutter run”。 然后我购买了 NonConsumable 订阅,在对话框中我必须输入沙盒用户电子邮件和密码。

    更新: 此外,我还必须在 app store connect 中创建一个全新的订阅,因为原始订阅陷入了一种既没有购买也没有购买的状态。这是因为 completePurchase 在我的代码中的错误位置完成。 不应该在_getPastPurchases()里做,而是在实际的购买逻辑里做。

    所以把completePurchase放在这里:

    _subscription = _iap.purchaseUpdatedStream.listen((data) => setState(() {
        _purchases.addAll(data);
        for(PurchaseDetails purchase in _purchases){
            if(purchase.productID == 'subName'){
                //SOLUTION
                if (Platform.isIOS) {
                    InAppPurchaseConnection.instance.completePurchase(purchase);
                }
            }
        }   
    }));
    

    PS:我不记得我是否在 for 循环中或外部有 completePurchse...

    【讨论】:

    • 我有同样的问题,但这些步骤似乎没有帮助。我可以使用沙盒用户购买订阅,并且成功,但是当我查询PastPurchases() 之后,它返回一个空数组。你还做了什么吗?
    • 遗憾的是它不再起作用了...我不知道是什么让 queryPastPurchases 包含购买:/ 我想我会删除这个答案。我的解决方案是创建一个消耗品,这是我必须存储在数据库中的订阅。使用此解决方案,我将无法自动续订,而苹果将获得更大的收益...
    • 我注意到 Appstore 不会返回“Non Renowable Subscription”,而是让您自己处理到期。
    • 另请注意,试飞用户在测试应用程序时会获得自动生成的沙盒帐户。这意味着他们将像沙盒帐户一样处理,而不是像“普通帐户”那样处理。如果您和您的试飞员遇到不同的结果,这可能就是原因。
    • 你们中有人找到解决方案了吗?我目前面临同样的问题。
    猜你喜欢
    • 2019-12-14
    • 2023-02-03
    • 2022-12-18
    • 2021-08-12
    • 1970-01-01
    • 2019-12-20
    • 2020-03-21
    • 2021-07-07
    • 2022-01-05
    相关资源
    最近更新 更多