【问题标题】:Restore InApp purchase using swift, iOS使用 swift,iOS 恢复应用内购买
【发布时间】:2023-03-27 09:48:01
【问题描述】:

我正在应用购买中实施恢复。我有一个按钮,其动作是

@IBAction func restorePurchases(send : AnyObject){

SKPaymentQueue.defaultQueue().restoreCompletedTransactions()
// if (success) { 
// I want to do something here      
// }
}

我的问题是。

  1. 这是正确的恢复方式吗?
  2. 我们如何验证恢复购买的成功操作?

【问题讨论】:

    标签: ios swift in-app-purchase storekit


    【解决方案1】:

    别忘了检查是否可以付款:

    if (SKPaymentQueue.canMakePayments()) {
      SKPaymentQueue.default().restoreCompletedTransactions()
    }
    

    为了检查恢复是否良好,您必须遵循协议: SKPaymentTransactionObserver 然后实现方法:

    func paymentQueue(queue: SKPaymentQueue!, updatedTransactions transactions: [AnyObject]!)
    

    并通过以下方式订阅事件:

    SKPaymentQueue.default().add(self)
    

    最后是我如何检查结果的示例:

    func paymentQueue(_ queue: SKPaymentQueue!, updatedTransactions transactions: [AnyObject]!)    {
      print("Received Payment Transaction Response from Apple");
      for transaction in transactions {
        switch transaction.transactionState {
        case .purchased, .restored:
          print("Purchased purchase/restored")
          SKPaymentQueue.default().finishTransaction(transaction as SKPaymentTransaction)
          break
        case .failed:
          print("Purchased Failed")
          SKPaymentQueue.default().finishTransaction(transaction as SKPaymentTransaction)
          break
        default:
          print("default")
          break
        }
      }
    }
    

    【讨论】:

    • 为什么需要调用canMakePayments?在当前设备上的付款受到限制之前,用户可能更早购买了商品。在这种情况下,虽然无法授权新的付款,但用户应该能够恢复之前的购买。
    【解决方案2】:

    出于某种原因,即使在尝试SKPaymentQueue.default().restoreCompletedTransactions() 之后,在恢复过程中也从未为我调用以下函数。

    func paymentQueue(queue: SKPaymentQueue!, 
                      updatedTransactions transactions: [AnyObject]!)
    

    添加这行代码SKPaymentQueue.default().add(self) 是为了让我的班级成为观察者,但仍然没有更新。

    如果您尝试重新付款,并且 StoreKit API 会自动决定是否应该购买或恢复此功能并相应地显示消息,似乎会在恢复的场景中调用此函数。

    即使从用户的角度来看,他们也不会再次收费,Apple 拒绝了我们的应用,因为没有添加恢复场景。

    因此,如果您在代码中调用 SKPaymentQueue.default().restoreCompletedTransactions(),似乎需要处理这些额外的 StoreKit 委托来管理您的恢复:

    func paymentQueueRestoreCompletedTransactionsFinished(_ queue: SKPaymentQueue) {
      handleSuccess()
    }
    
    func paymentQueue(_ queue: SKPaymentQueue, 
                      restoreCompletedTransactionsFailedWithError error: Error) {
      handleError()
    }
    

    【讨论】:

    • paymentQueueRestoreCompletedTransactionsFinished 调用时不保证是成功案例。所以 handleSuccess() 对那个方法有点误导。
    猜你喜欢
    • 1970-01-01
    • 2017-04-17
    • 1970-01-01
    • 2017-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-21
    相关资源
    最近更新 更多