如何处理应用内购买取消 iOS (Flutter)

问题描述 投票:0回答:1

当用户完成交易(使用 flutter 中的应用内购买包)时,我知道我应该打电话:

.completePurchase(Purchase)

但是,当提示用户购买商品但他们取消时,我是否还应该调用completePurchase?

我问这个问题是因为如果用户随后尝试在同一个应用程序会话中再次购买相同的非消耗品(应用程序尚未关闭),则会出现一个输出:

[VERBOSE-2:ui_dart_state.cc(177)] 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: 1, simulatesAskToBuyInSandbox: true}, null)

遇到以下情况,如何处理:

purchases[0].status == PurchaseStatus.canceled

当我就已取消的交易拨打

.completePurchase(Purchase)
时,一切似乎都正常,这意味着用户可以再次尝试购买非消耗性产品。但我不确定这是否是处理这种情况的正确方法

ios flutter dart in-app-purchase
1个回答
0
投票

这就是你处理它的方式。只有在购买或恢复状态时才调用完成,否则会抛出异常:

@override
void initState() {
  final Stream purchaseUpdated = InAppPurchase.instance.purchaseStream;
  _subscription = purchaseUpdated.listen((purchaseDetailsList) async {
    _listenToPurchaseUpdated(purchaseDetailsList);
  }, onDone: () {
    log('On Done Called');
  }, onError: (error) {
    log('On Error Called');
  });
  super.initState();
}

void _listenToPurchaseUpdated(List<PurchaseDetails> purchaseDetailsList) async {
  log('in App Purchase Listener Called');
  for (var purchaseDetails in purchaseDetailsList) {
    if (purchaseDetails.status == PurchaseStatus.pending) {
      // _showPendingUI();
    } else {
      if (purchaseDetails.status == PurchaseStatus.error) {
        log('Some Error While Purchasing ${purchaseDetails.error!}');
        //Handle Error Here
        // _handleError(purchaseDetails.error!);
      } else if (purchaseDetails.status == PurchaseStatus.canceled) {
        log('Purchase Cancelled');
        //Handle cancelled purchase
      } else if (purchaseDetails.status == PurchaseStatus.purchased ||
          purchaseDetails.status == PurchaseStatus.restored) {
        //Deliver Product Here
        log('Product Purchased Or Restored');
        InAppPurchase.instance.completePurchase(purchaseDetails);
        //handle purchased product
      }
      if (purchaseDetails.pendingCompletePurchase) {
        await InAppPurchase.instance.completePurchase(purchaseDetails);
      }
    }
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.