使用 swift、iOS 恢复 InApp 购买

Restore InApp purchase using swift, iOS

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

@IBAction func restorePurchases(send : AnyObject){

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

我的问题是

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

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

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
    }
  }
}

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

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

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

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

即使从用户的角度考虑,他们没有再次收费,Apple拒绝了我们的应用程序,因为没有添加恢复场景。

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

func paymentQueueRestoreCompletedTransactionsFinished(_ queue: SKPaymentQueue) {
  handleSuccess()
}

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