Swift 需要帮助从helper类实现应用内购买吗

Swift 需要帮助从helper类实现应用内购买吗,swift,in-app-purchase,Swift,In App Purchase,我第一次尝试IAP,我需要一些连接点的帮助 我的应用程序有两个不同的非消耗性IAP,我在“产品”类中设置了这两个IAP,如果它自己是这样的: enum IAPProduct: String{ case tempoLevels = ".....TempoLevels" case timingLevels = ".....TimingLevels" } class IAPService: NSObject { private override init() {}

我第一次尝试IAP,我需要一些连接点的帮助

我的应用程序有两个不同的非消耗性IAP,我在“产品”类中设置了这两个IAP,如果它自己是这样的:

enum IAPProduct: String{
    case tempoLevels  = ".....TempoLevels"
    case timingLevels = ".....TimingLevels"
}
class IAPService: NSObject  {
    private override init() {}
    static let shared = IAPService()

    var products = [SKProduct]()
    let paymentQueue = SKPaymentQueue.default()

    func getProducts() {
        let products: Set = [IAPProduct.tempoLevels.rawValue, IAPProduct.timingLevels.rawValue]

        let request = SKProductsRequest(productIdentifiers: products)
        request.delegate = self
        request.start()
        paymentQueue.add(self)
    }

    func purchase(product: IAPProduct) {
        guard let productToPurchase = products.filter({ $0.productIdentifier == product.rawValue }).first
            else {return}
        let payment = SKPayment(product: productToPurchase)
        paymentQueue.add(payment)
    }
}

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" 

        @unknown default:
            return("Something is wrong...")
        }
    }
}
func isPurchased() -> Bool {
    let purchaseStatus = UserDefaults.standard.bool(forKey: ??)

    if purchaseStatus == true {
        print("Previously purchased!")
        return true
    }else{
        print("Never purchased!")
        return false
    }
}
然后,我通过我找到的教程设置了一个帮助器类,如下所示:

enum IAPProduct: String{
    case tempoLevels  = ".....TempoLevels"
    case timingLevels = ".....TimingLevels"
}
class IAPService: NSObject  {
    private override init() {}
    static let shared = IAPService()

    var products = [SKProduct]()
    let paymentQueue = SKPaymentQueue.default()

    func getProducts() {
        let products: Set = [IAPProduct.tempoLevels.rawValue, IAPProduct.timingLevels.rawValue]

        let request = SKProductsRequest(productIdentifiers: products)
        request.delegate = self
        request.start()
        paymentQueue.add(self)
    }

    func purchase(product: IAPProduct) {
        guard let productToPurchase = products.filter({ $0.productIdentifier == product.rawValue }).first
            else {return}
        let payment = SKPayment(product: productToPurchase)
        paymentQueue.add(payment)
    }
}

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" 

        @unknown default:
            return("Something is wrong...")
        }
    }
}
func isPurchased() -> Bool {
    let purchaseStatus = UserDefaults.standard.bool(forKey: ??)

    if purchaseStatus == true {
        print("Previously purchased!")
        return true
    }else{
        print("Never purchased!")
        return false
    }
}
我想在购买产品时在另一个视图控制器中触发一些功能。我该怎么做

我在其中一个视图控制器中设置了一个函数,用于检查其中一个视图控制器中的用户默认值,如下所示:

enum IAPProduct: String{
    case tempoLevels  = ".....TempoLevels"
    case timingLevels = ".....TimingLevels"
}
class IAPService: NSObject  {
    private override init() {}
    static let shared = IAPService()

    var products = [SKProduct]()
    let paymentQueue = SKPaymentQueue.default()

    func getProducts() {
        let products: Set = [IAPProduct.tempoLevels.rawValue, IAPProduct.timingLevels.rawValue]

        let request = SKProductsRequest(productIdentifiers: products)
        request.delegate = self
        request.start()
        paymentQueue.add(self)
    }

    func purchase(product: IAPProduct) {
        guard let productToPurchase = products.filter({ $0.productIdentifier == product.rawValue }).first
            else {return}
        let payment = SKPayment(product: productToPurchase)
        paymentQueue.add(payment)
    }
}

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" 

        @unknown default:
            return("Something is wrong...")
        }
    }
}
func isPurchased() -> Bool {
    let purchaseStatus = UserDefaults.standard.bool(forKey: ??)

    if purchaseStatus == true {
        print("Previously purchased!")
        return true
    }else{
        print("Never purchased!")
        return false
    }
}

我不确定如何使用此功能,但如果我可以,我的应用程序中有代码,如果可能的话可以使用它。

您可以直接使用
SKPaymentTransactionState
进行购买检查

如果想要Bool值,可以在创建事务后调用like thi

func isPurchased(transaction: SKPaymentTransaction) -> Bool {
  return transaction.transactionState == .purchased
}
或者直接从KpaymentTransactionState扩展名中获取字符串值

func isPurchased(transaction: SKPaymentTransaction) -> String {
      return transaction.status
    }

同时,您不应该存储一个布尔值来检查用户是否在UserDefaults中购买了应用内购买。用户可以很容易地更改它(无需越狱)并免费获得您的商品您应该使用Keychain而不是UserDefaults。

您可以直接使用
SKPaymentTransactionState
进行采购检查

如果想要Bool值,可以在创建事务后调用like thi

func isPurchased(transaction: SKPaymentTransaction) -> Bool {
  return transaction.transactionState == .purchased
}
或者直接从KpaymentTransactionState扩展名中获取字符串值

func isPurchased(transaction: SKPaymentTransaction) -> String {
      return transaction.status
    }

同时,您不应该存储一个布尔值来检查用户是否在UserDefaults中购买了应用内购买。用户可以很容易地更改它(无需越狱)并免费获得您的商品您应该使用Keychain而不是UserDefaults。

“用户可以很容易地更改它”用户将如何做到这一点?@matt iExplorer和iFunBox是两个软件示例,它们允许您在不越狱的情况下浏览iOS文件系统。我错了吗?他们真的允许你访问UserDefaults的内容吗?嗨,谢谢你的帮助。我尝试将这个返回bool的函数放在我正在使用的视图控制器中,但我得到一个错误,错误是:无法将类型为“SKPaymentTransactionState”的返回表达式转换为返回类型“bool”。是的,我找到了一个关于在键链中存储此信息的教程:“用户可以非常轻松地更改它”用户将如何做到这一点?@matt iExplorer和iFunBox是两个软件示例,它们允许您在不越狱的情况下浏览iOS文件系统。我错了吗?他们真的允许你访问UserDefaults的内容吗?嗨,谢谢你的帮助。我曾尝试将此函数放置在我正在使用的视图控制器中,该函数返回bool,但出现了一个错误,错误是:无法将类型为“SKPaymentTransactionState”的返回表达式转换为返回类型“bool”。是的,我找到了一个关于在钥匙链中存储此信息的教程: