颤振:storekit_duplicate_product_object。有相同产品标识符的待处理交易

Posted

技术标签:

【中文标题】颤振:storekit_duplicate_product_object。有相同产品标识符的待处理交易【英文标题】:Flutter: storekit_duplicate_product_object. There is a pending transaction for the same product identifier 【发布时间】:2021-07-25 19:14:59 【问题描述】:

我正在使用应用内购买官方插件。但是当我尝试在 ios 上购买订阅时,我看到了以下错误:

Unhandled Exception: PlatformException(storekit_duplicate_product_object, There is a pending transaction for the same product identifier. Please either wait for it to be finished or finish it manually using `completePurchase` to avoid edge cases., applicationUsername: null, requestData: null, quantity: 1, productIdentifier: in_app_test, simulatesAskToBuyInSandbox: false, null)

我正在使用 in_app_purchase 包的 in_app_purchase: ^0.5.2 版本

我调用它的代码如下所示:

   TextButton(
      child: Text(productDetails.price),
      style: flatButtonStyle,
      onPressed: () async 
        PurchaseParam purchaseParam = PurchaseParam(
            productDetails: productDetails,
            applicationUserName: null,
            sandboxTesting: false);
        if (productDetails.id == _kConsumableId) 
          _connection.buyConsumable(
              purchaseParam: purchaseParam,
              autoConsume: kAutoConsume || Platform.isIOS);
         else 
          _connection.buyNonConsumable(
              purchaseParam: purchaseParam);

        ,
    )

【问题讨论】:

【参考方案1】:

请关注#60763

你可以使用SKPaymentQueueWrapper().finishTransaction(skPaymentTransactionWrapper)完成那些交易

为避免此错误,请将下面的代码放在buyNonConsumable 之前并开始工作:

var transactions = await SKPaymentQueueWrapper().transactions();
 transactions.forEach((skPaymentTransactionWrapper) 
    SKPaymentQueueWrapper().finishTransaction(skPaymentTransactionWrapper);
);

完整示例

TextButton(
  child: Text(productDetails.price),
  style: flatButtonStyle,
  onPressed: () async 
    PurchaseParam purchaseParam = PurchaseParam(
        productDetails: productDetails,
        applicationUserName: null,
        sandboxTesting: false);
    if (productDetails.id == _kConsumableId) 
      _connection.buyConsumable(
          purchaseParam: purchaseParam,
          autoConsume: kAutoConsume || Platform.isIOS);
     else 
      _connection.buyNonConsumable(
          purchaseParam: purchaseParam);
      var transactions = await SKPaymentQueueWrapper().transactions();
      transactions.forEach((skPaymentTransactionWrapper) 
        SKPaymentQueueWrapper().finishTransaction(skPaymentTransactionWrapper);
      );
    
  ,
)

答案来自siloebb's answer

【讨论】:

这个SKPaymentQueueWrapper在哪里?好像没找到。 没关系,我找到了。它在package:in_app_purchase_ios/store_kit_wrappers.dart 我认为我们需要在_connection.buyNonConsumable() 之前调用SKPaymentQueueWrapper().finishTransaction(skPaymentTransactionWrapper);,而不是之后。

以上是关于颤振:storekit_duplicate_product_object。有相同产品标识符的待处理交易的主要内容,如果未能解决你的问题,请参考以下文章

颤振——哎呀;颤振意外退出:“FileSystemException:删除失败,路径='...\.ios')

命令“颤振:新项目”导致错误(找不到命令“颤振.createProject”),我无法在 VSCODE 上调试颤振项目

在你的颤振项目中找不到颤振 sdk 中的飞镖?

颤振给我错误(不知道为啥)(使用颤振和Android Studio)

构建颤振项目时如何将飞镖和颤振设置为默认值

升级颤振后颤振标签栏错误“getter'key'被称为null”