2016-12-02 199 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正確實施的更新答案。它只會在用戶已經購買時恢復。備查 –