// // 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 // } spLog(message: "transactionDate = \(String(describing: transaction.transactionDate))") spLog(message: "nowDate = \(Date())") spLog(message: "productIdentifier = \(transaction.payment.productIdentifier)") guard let productId = self.productId, productId == transaction.payment.productIdentifier else { return } self.productId = nil 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 guard let productId = self.productId else { return } self.productId = nil switch error?.code { case SKError.paymentCancelled: self.delegate?.jx_iapPayFailed?(productId: productId, code: .cancelled) default: self.delegate?.jx_iapPayFailed?(productId: productId, code: .unknown) } } }