2016-12-02 198 views
2

我正尝试在Swift 3的应用内购买产品。我可以成功在我的测试设备上进行付款。点击时,屏幕顶部的恢复按钮应恢复所有以前的购买。这里是我用来恢复的代码。我的队列中的函数总是空的。请帮我解决这个问题。使用Swift恢复应用内购买3

func paymentQueueRestoreCompletedTransactionsFinished(_ queue: SKPaymentQueue) { 
    for transaction in queue.transactions{ 
     let trans: SKPaymentTransaction = transaction as SKPaymentTransaction 

      let prodID = trans.payment.productIdentifier as String 
      switch prodID { 
      case "some_iap": 
       print("Do something") 
       finishTransaction(trans) 

      default: break 
      } 
    } 
    updatePurchases() 
} 

func paymentQueue(_ queue: SKPaymentQueue, restoreCompletedTransactionsFailedWithError error: Error) { 
    print("error in restore") 
} 

func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) { 

    for trans in queue.transactions{ 
     let trans: SKPaymentTransaction = trans as SKPaymentTransaction 
     print(trans.transactionState.rawValue) 
     switch (trans.transactionState) { 
     case .purchased: 
      let prodID = p.productIdentifier as String 
      switch prodID { 
      case "some_iap": 
       print("do something") 
       updatePurchases() 
       finishTransaction(trans) 

      default: 
       print("defualt") 
       finishTransaction(trans) 
      } 

     case .failed: break 

     default: break 
     } 
    } 
} 

func finishTransaction(_ trans:SKPaymentTransaction){ 
    SKPaymentQueue.default().finishTransaction(trans) 
    SKPaymentQueue.default().remove(self) 
} 

func paymentQueue(_ queue: SKPaymentQueue, removedTransactions transactions: [SKPaymentTransaction]) { 
} 

回答

4

解决方案斯威夫特3

//Step 1 Call from button Restore Purchase 
func restore() { 
    SKPaymentQueue.default().add(self) 
    SKPaymentQueue.default().restoreCompletedTransactions() 
} 

//Step 2 Get transactions 
public func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) { 

    for transaction in transactions { 

     switch transaction.transactionState { 
     case .purchased: 
       print("Product Purchased") 
       unlockApp() 
       SKPaymentQueue.default().finishTransaction(transaction as! SKPaymentTransaction) 

       break; 
      case .failed: 
       print("Purchased Failed"); 
       SKPaymentQueue.default().finishTransaction(transaction as! SKPaymentTransaction) 
       break; 
      case .restored: 
       print("Already Purchased") 
       unlockApp() 

       SKPaymentQueue.default().finishTransaction(transaction as! SKPaymentTransaction) 
     default: 
      break 
     } 
    } 
} 




//If an error occurs, the code will go to this function 
func paymentQueue(_ queue: SKPaymentQueue, restoreCompletedTransactionsFailedWithError error: Error) { 
    //Handle Error 
} 
+0

已表示,该代码可能是脆弱的,并可能允许任何人恢复自由购买,而不在第一时间为他们支付。真的吗? –

+0

是的。每次点击恢复按钮时都会调用paymentQueueRestoreCompletedTransactionsFinished。所以你需要检查标识符,然后恢复 –

+0

@BradLarson正确实施的更新答案。它只会在用户已经购买时恢复。备查 –