【问题标题】:In App Purchase - detect whether user has already made that purchaseIn App Purchase - 检测用户是否已经购买
【发布时间】:2019-11-05 13:30:43
【问题描述】:

我有以下代码来进行应用内购买。一切正常,用户可以通过点击按钮购买(非消耗品)。

目前我在 AppDelegate 内部调用 getProducts()restorePurchases() - 当用户已经购买时,我假设它将使用 restorePurchases() 获取 - 我如何检测特定产品是否与其ID 已购买隐藏那个按钮。

import Foundation
import StoreKit

class IAPService: NSObject {

    private override init() {}
    static let shared = IAPService() 
    var products = [SKProduct]()
    let paymentQueue = SKPaymentQueue.default() 
    private var purchasedProductIdentifiers: Set<String> = []

    func getProducts() {
        let product: Set = ["123456"]
        let request = SKProductsRequest(productIdentifiers: product)
        request.delegate = self
        request.start()
        paymentQueue.add(self)
    }

    func purchase() {
        guard let productToPurchase = products.first else { return }
        print(productToPurchase)
        let payment = SKPayment(product: productToPurchase)
        paymentQueue.add(payment)
    }

    func restorePurchases() {
        paymentQueue.restoreCompletedTransactions()
    }

}

extension IAPService: SKProductsRequestDelegate {

    func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) {
        self.products = response.products
        for product in response.products {
            print(product.localizedTitle)
        }
    }

}

extension IAPService: SKPaymentTransactionObserver {

    func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
        for transaction in transactions {
            print(transaction.transactionState.status(), transaction.payment.productIdentifier)
            switch transaction.transactionState {
            case .purchasing: break
            default: queue.finishTransaction(transaction)
            }
        }
    }

}

extension SKPaymentTransactionState {
    func status() -> String {
        switch self {
        case .deferred: return "deferred"
        case .failed: return "failed"
        case .purchased: return "purchased"
        case .purchasing: return "purchasing"
        case .restored: return "restored"
        }
    }
}

【问题讨论】:

    标签: ios swift in-app-purchase


    【解决方案1】:

    您需要检查updatedTransactions 的回调以获取所需的productIdentifier 及其状态purchased/restored

    func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
        for transaction in transactions {
            if transaction.payment.productIdentifier == "someId" && ( transaction.transactionState == .purchased || transaction.transactionState == .restored ) {
                // purchased / resorted
            } 
        }
    }
    

    有用的链接

    https://www.raywenderlich.com/5456-in-app-purchase-tutorial-getting-started

    in-app purchase in Swift with a single product

    【讨论】:

    • 某事似乎造成了错误 - 当我致电 restorePurchases() 时 - 无论我是否更改帐户,都将恢复购买 - 一旦购买,它就会始终在设备上恢复。有旁路吗?
    • 如果您在某个帐户中购买了它,如果删除该应用并重新安装,您将能够恢复
    • 我卸载了应用程序,用另一个 iTunes 帐户登录并再次安装 - 购买仍在恢复,即使新帐户尚未购买..
    • 你可以尝试第三个测试帐户看看吗?
    猜你喜欢
    • 1970-01-01
    • 2011-12-23
    • 2010-12-14
    • 2013-10-15
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 2012-09-10
    • 1970-01-01
    相关资源
    最近更新 更多