// // JXIAPManager.swift // BoJia // // Created by 火山传媒 on 2024/6/3. // import UIKit import StoreKit @objc protocol JXIAPManagerDelegate { /// 获取到可购买商品列表 @objc optional func jx_iapPayGotProducts(productIds: [String]) /// 购买成功 @objc optional func jx_iapPaySuccess(productId: String, receipt: String, transactionIdentifier: String?) /// 购买失败 @objc optional func jx_iapPayFailed(productId: String, code: JXIAPManagerCode) /// 恢复商品(仅限永久有效商品) @objc optional func iapPayRestore(productIds: [String], transactionIds: [String]) // /// 加载 // @objc optional func iapPayShowHud() // /// 系统错误 // @objc optional func iapSysWrong() // /// 验证成功 // @objc optional func verifySuccess() // /// 验证失败 // @objc optional func verifyFailed() } @objc enum JXIAPManagerCode: Int { ///未知错误 case unknown ///取消交易 case cancelled ///没有商品 case noProduct } class JXIAPManager: NSObject { static let manager: JXIAPManager = JXIAPManager() weak var delegate: JXIAPManagerDelegate? private var payment: SKPayment? private var product: SKProduct? private var productId: String = "" private var orderId: String? private var applicationUsername: String? { get { let id = "00000000-0000-0000-0000-000000000000" guard let orderId = orderId else { return nil } var string = "" for i in 0.. Bool { // return true // } /// 恢复购买回调 func paymentQueueRestoreCompletedTransactionsFinished(_ queue: SKPaymentQueue) { } } extension JXIAPManager { private func completeTransaction(transaction: SKPaymentTransaction) { //自动续费 if let _ = transaction.original, transaction.payment.applicationUsername == nil { return } //重新开通自动续费 if let _ = transaction.original, transaction.payment.applicationUsername != nil { self.delegate?.jx_iapPayFailed?(productId: productId, code: .unknown) return } guard let receiptURL = Bundle.main.appStoreReceiptURL else { return } let receiptData = NSData(contentsOf: receiptURL) guard let encodeStr = receiptData?.base64EncodedString(options: .endLineWithLineFeed) else { return } guard let transactionIdentifier = transaction.transactionIdentifier else { return } self.delegate?.jx_iapPaySuccess?(productId: productId, receipt: encodeStr, transactionIdentifier: transactionIdentifier) } private func failedTransaction(transaction: SKPaymentTransaction) { let error = transaction.error as? SKError switch error?.code { case SKError.paymentCancelled: self.delegate?.jx_iapPayFailed?(productId: productId, code: .cancelled) default: self.delegate?.jx_iapPayFailed?(productId: productId, code: .unknown) } } }