Flutter in_app_purchase queryPastPurchase 在 iOS 上返回 null

Chr*_*ter 5 in-app-purchase flutter

为什么 queryPastPurchase 在 iOS Testflight 用户上返回 null,而在 Android 上它是成功的。

请帮我解决这个问题。

这是我的代码:

...
InAppPurchaseConnection _iap = InAppPurchaseConnection.instance;

  @override
  initState() {
    _initialize();
    super.initState();
  }

    void _initialize() async {

    // Check availability of In App Purchases
    _available = await _iap.isAvailable();

    if (_available) {
      await _getProducts();
      await _getPastPurchases();
      _getSubscriptionPrice();
    }

    _subscription = _iap.purchaseUpdatedStream.listen((data) => setState(() {
      _purchases.addAll(data);

      for(PurchaseDetails purchase in _purchases){
        if(purchase.productID == 'subName'){
          setState(() {
            showSubscriptionDialog = false;
          });
        }
      }
      _verifyPurchase();
    }));
  }

  /// Get all products available for sale
  Future<void> _getProducts() async {
    Set<String> ids = Set.from(['subName']);
    ProductDetailsResponse response = await _iap.queryProductDetails(ids);

    setState(() {
      _products = response.productDetails;
    });

    if(response.error != null && response.error.message.length > 0){
      _iapStoreProblem = response.error.message;
    }
  }

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

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

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

    for(PurchaseDetails purchase in _purchases){
      if(purchase.billingClientPurchase.sku == "subName"){
        hasSub = true;
      }
    }

    if(hasSub){
      setState(() {
        showSubscriptionDialog = false;
        firstTimeBuySub = false;
      });
    }else{
      setState(() {
        showSubscriptionDialog = true;
        firstTimeBuySub = true;
      });
    }
  }
Run Code Online (Sandbox Code Playgroud)

执行buyProduct() 时,它会在_initialize() 中找到订阅购买,只有当我尝试执行_getPastPurchases() 时,它才无法在iOS 上返回任何产品。

...
InAppPurchaseConnection _iap = InAppPurchaseConnection.instance;

  @override
  initState() {
    _initialize();
    super.initState();
  }

    void _initialize() async {

    // Check availability of In App Purchases
    _available = await _iap.isAvailable();

    if (_available) {
      await _getProducts();
      await _getPastPurchases();
      _getSubscriptionPrice();
    }

    _subscription = _iap.purchaseUpdatedStream.listen((data) => setState(() {
      _purchases.addAll(data);

      for(PurchaseDetails purchase in _purchases){
        if(purchase.productID == 'subName'){
          setState(() {
            showSubscriptionDialog = false;
          });
        }
      }
      _verifyPurchase();
    }));
  }

  /// Get all products available for sale
  Future<void> _getProducts() async {
    Set<String> ids = Set.from(['subName']);
    ProductDetailsResponse response = await _iap.queryProductDetails(ids);

    setState(() {
      _products = response.productDetails;
    });

    if(response.error != null && response.error.message.length > 0){
      _iapStoreProblem = response.error.message;
    }
  }

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

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

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

    for(PurchaseDetails purchase in _purchases){
      if(purchase.billingClientPurchase.sku == "subName"){
        hasSub = true;
      }
    }

    if(hasSub){
      setState(() {
        showSubscriptionDialog = false;
        firstTimeBuySub = false;
      });
    }else{
      setState(() {
        showSubscriptionDialog = true;
        firstTimeBuySub = true;
      });
    }
  }
Run Code Online (Sandbox Code Playgroud)