【问题标题】:Restore in-app purchase with Swift 3使用 Swift 3 恢复应用内购买
【发布时间】:2017-04-17 21:41:48
【问题描述】:

我正在尝试在 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]) {
}

【问题讨论】:

    标签: ios in-app-purchase swift3


    【解决方案1】:

    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
    }
    

    【讨论】:

    • 已经表示此代码可能存在漏洞,并且可以允许任何人免费恢复购买,而无需首先支付费用。这是真的吗?
    • 是的,这是真的。每次点击恢复按钮时都会调用paymentQueueRestoreCompletedTransactionsFinished 。所以你需要检查标识符然后恢复
    • @BradLarson 更新了正确实施的答案。只有在用户已经购买时才会恢复。供日后参考
    猜你喜欢
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 2012-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多