【问题标题】:flutter IAP how to "Restore Purchases"扑动 IAP 如何“恢复购买”
【发布时间】:2019-05-15 12:22:01
【问题描述】:

我正在使用 flutter_inapp_purchase 作为我的 Flutter 应用的非消耗品 IAP。对于 IOS,它确实需要包含“恢复购买”功能,以允许用户恢复之前购买的应用内购买。我可以知道如何创建“恢复”按钮并在用户点击“恢复”按钮时启动恢复过程吗?

  Future<Null> _buyProduct(IAPItem item) async {
    try {
      PurchasedItem purchased= await 
  FlutterInappPurchase.buyProduct(item.productId);
      print('purcuased - ${purchased.toString()}');
    } catch (error) {
      print('$error');
    }
  }

  Future<Null> _getProduct() async {
    List<IAPItem> items = await FlutterInappPurchase.getProducts(_productLists);
    for (var item in items) {
      print('${item.toString()}');
      this._items.add(item);
    }

    setState(() {
      this._items = items;
    });
  }

【问题讨论】:

    标签: flutter in-app-purchase restore


    【解决方案1】:

    对于使用官方 Flutter 开发包的开发者https://pub.dev/packages/in_app_purchase

    恢复购买(iOS 非消耗性、自动续订订阅需要,或 非续订)只是调用

    Future&lt;QueryPurchaseDetailsResponse&gt; queryPastPurchases

    在后台调用

    _observer.getRestoredTransactions

    你应该在这里做的是迭代所有状态为 PurchaseStatus.purchased 或 Purchase.error 的购买并调用

    InAppPurchaseConnection.instance.completePurchase(purchase);

    然后与 Apple 验证收据并交付自有购买

    取自 InAppPurchaseConnection 类:

    /// 您有责任完成每一个 [PurchaseDetails] /// [PurchaseDetails.status] 是 [PurchaseStatus.purchased] 或 /// [[PurchaseStatus.error]。完成 [PurchaseStatus.pending] 购买 /// 将导致异常。 /// /// 这会抛出一个 Android 上的 [UnsupportedError]。

    • 如果未完成购买([completePurchase] 未完成 在上次应用会话中调用购买对象)。 新应用会话开始时将发生购买更新 而是。

    无论如何,您可能会在应用启动时这样做,但 Apple 现在要求所有非消耗性和自动更新应用内产品的恢复购买选项,否则您的应用将在审核过程中被拒绝。

    https://developer.apple.com/documentation/storekit/in-app_purchase/offering_completing_and_restoring_in-app_purchases

    如果您的应用销售非消耗型、可自动续订的订阅,或者 非续订订阅产品,您必须提供允许 他们要恢复。您的客户希望您的内容是 在他们的所有设备上无限期可用;请参阅应用内购买 了解更多信息。

    【讨论】:

    • 那么,你能提供一个具体的解决方案吗?我是否应该在我的 UI 中创建“恢复”按钮并将 completePurchase 行为复制到其点击?
    【解决方案2】:

    根据插件documentation可以使用API​​

    getAvailablePurchases
    

    查看库原生代码,这个方法是链接到

    // getAvailablePurchases
    - (void)getAvailableItems:(FlutterResult)result {
        [[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
        flutterResult = result;
    }
    

    来自苹果docs

    声明

    func restoreCompletedTransactions()
    

    讨论

    使用此方法恢复已完成的事务——即事务 你已经为它调用了finishTransaction(_:)。你叫这个 在下列情况之一的情况下使用方法: 将购买安装在 其他设备 恢复购买的应用程序, 用户删除并重新安装

    因此,添加一个小部件按钮(您最喜欢的那个)由您决定,您可以将它放在任何您想要的地方。

    然后在 onClick 事件中调用getAvailableItems 并管理用户之前购买的购买并将它们重新安装到用户的设备中。

    【讨论】:

    • 嘿,你最后一句是什么意思“管理以前购买的购买并重新安装它们”?除了“getAvailableItems()”还有什么可做的吗?
    • @FrederikWitte 只是在设备上本地保存这些购买的行为。
    • 这不是自动完成的吗?我从未见过有人将它们保存在本地存储或其他地方
    • @FrederikWitte 实际上我自己没有尝试过,也从未使用过 iap。我只报告了医生所说的。如果您知道 ios 原生体验成功调用该方法就足够了,那么好吧......就是这样! [-;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    相关资源
    最近更新 更多