使用Swift 3恢复应用内购买

Chi*_*hah 2 in-app-purchase ios swift3

我正在尝试使用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]) {
}
Run Code Online (Sandbox Code Playgroud)

小智 6

Swift 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
}
Run Code Online (Sandbox Code Playgroud)