Przeglądaj źródła

3.6.28(6)
1.去除冷启动,主动回复订阅,会引起事务异常变多,进而影响购买视频次数
2.舍弃 PurchaseTimesManager 管理类
3.修正订阅管理类,刷新 UI 的逻辑错误
4.去除VC 业务端的isHandlePurchaseStateChanged判断刷新 UI 的逻辑错误

100Years 1 tydzień temu
rodzic
commit
5b62cd533c

+ 2 - 2
AIEmoji.xcodeproj/project.pbxproj

@@ -3288,7 +3288,7 @@
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				CLANG_ENABLE_MODULES = YES;
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 5;
+				CURRENT_PROJECT_VERSION = 6;
 				DEVELOPMENT_TEAM = 65UD255J84;
 				ENABLE_USER_SCRIPT_SANDBOXING = NO;
 				GENERATE_INFOPLIST_FILE = YES;
@@ -3327,7 +3327,7 @@
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				CLANG_ENABLE_MODULES = YES;
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 5;
+				CURRENT_PROJECT_VERSION = 6;
 				DEVELOPMENT_TEAM = 65UD255J84;
 				ENABLE_USER_SCRIPT_SANDBOXING = NO;
 				GENERATE_INFOPLIST_FILE = YES;

+ 0 - 1
AIEmoji/Business/TSPurchaseMembershipVC/TSPurchaseVC.swift

@@ -109,7 +109,6 @@ class TSPurchaseVC: TSBaseVC {
     }
     
     @objc func closePage(){
-        TSToastShared.hideLoading()
         closePageBlock?()
         self.dismiss(animated: true)
         kPurchaseCountDownTime.isNeedCheck = true

+ 8 - 8
AIEmoji/Business/TSPurchaseMembershipVC/TSPurchaseVideoTimesVC/TSPurchaseVideoTimesVC.swift

@@ -36,7 +36,7 @@ class TSPurchaseVideoTimesVC: TSBaseVC {
     var cancellabel: [AnyCancellable] = []
     var viewModel: TSPurchaseVideoTimesVM = .init()
     var buyPeriod:PremiumPeriod = .year
-    var isHandlePurchaseStateChanged = false //是否处理购买状态变化
+//    var isHandlePurchaseStateChanged = false //是否处理购买状态变化
     
     
     lazy var fullVC: UIHostingController<TSPurchaseVideoTimesView> = {
@@ -73,8 +73,8 @@ class TSPurchaseVideoTimesVC: TSBaseVC {
     func addNotifaction() {
         viewModel.buyPublisher.receive(on: DispatchQueue.main).sink { [weak self] _ in
             guard let self = self else { return }
-            isHandlePurchaseStateChanged = true
-            TSPurchaseTimesManager.default.pay(for: self.viewModel.selectedType)
+//            isHandlePurchaseStateChanged = true
+            PurchaseManager.default.pay(for: self.viewModel.selectedType)
         }.store(in: &cancellabel)
         
         viewModel.closePagePublisher.receive(on: DispatchQueue.main).sink { [weak self] _ in
@@ -123,13 +123,13 @@ extension TSPurchaseVideoTimesVC {
 
 extension TSPurchaseVideoTimesVC {
     func onPurchaseStateChanged(){
-        TSPurchaseTimesManager.default.onPurchaseStateChanged = { [weak self] manager,state,object in
+        PurchaseManager.default.onPurchaseStateChanged = { [weak self] manager,state,object in
             guard let self = self else { return }
         
-            if isHandlePurchaseStateChanged == false {
-                debugPrint("TSPurchaseTimesManager.onPurchaseStateChanged 不处理")
-                return
-            }
+//            if isHandlePurchaseStateChanged == false {
+//                debugPrint("TSPurchaseTimesManager.onPurchaseStateChanged 不处理")
+//                return
+//            }
             
             DispatchQueue.main.async {
                 switch state {

+ 1 - 1
AIEmoji/Common/Purchase/TSPurchaseManager+PurchasedNum.swift

@@ -18,7 +18,7 @@ extension PurchaseManager {
             //从交易成功的本地数据,拿到已购买成功的消耗品数据
             let purchasedArray = in_app.filter{ dict in
                 guard let productId = dict["product_id"] as? String else { return false }
-                return TSPurchaseTimesManager.purchaseNumProducts.contains(productId)
+                return PurchaseManager.purchaseNumProducts.contains(productId)
             }
 
             for dict in purchasedArray {

+ 69 - 41
AIEmoji/Common/Purchase/TSPurchaseManager.swift

@@ -38,6 +38,11 @@ public class PurchaseManager: NSObject {
             PurchaseProduct(productId: "203", period: .purchase(.videoNum3)),
         ]
     }()
+    
+    //购买次数的商品
+    static var purchaseNumProducts: [String] = {
+        return ["201","202","203"]
+    }()
 
     struct Config {
         static let verifyUrl = "https://buy.itunes.apple.com/verifyReceipt"
@@ -59,11 +64,11 @@ public class PurchaseManager: NSObject {
     
     private lazy var onceVerifyPayResult: Void = {
         dePrint("这段代码只会执行一次")
-//#if DEBUG
-//    verifyPayResult(transaction: SKPaymentTransaction(), useSandBox: true,uiBlock:nil)
-//#else
-//    verifyPayResult(transaction: SKPaymentTransaction(), useSandBox: false,uiBlock:nil)
-//#endif
+#if DEBUG
+    verifyPayResult(transaction: SKPaymentTransaction(), useSandBox: true,uiBlock:nil)
+#else
+    verifyPayResult(transaction: SKPaymentTransaction(), useSandBox: false,uiBlock:nil)
+#endif
     }()
     
 
@@ -293,38 +298,48 @@ extension PurchaseManager {
         request.start()
     }
 
-    public func restorePremium() {
+    public func restorePremium(showUI:Bool = true) {
+        if showUI {
+            paymentProductIdentifier = "restoreCompletedTransactions"
+        }
+        
         purchase(self, didChaged: .restoreing, object: nil,transaction: nil)
         SKPaymentQueue.default().restoreCompletedTransactions()
-        paymentProductIdentifier = "restoreCompletedTransactions"
         debugPrint("PurchaseManager restoreCompletedTransactions restorePremium")
-
         subscriptionApple(type: .created, jsonString: "Payment restore")
     }
 
     /// 购买支付
     public func pay(for period: PremiumPeriod) {
+        if let product = product(for: period){
+            paymentProductIdentifier = product.productIdentifier
+        }
+        
         guard SKPaymentQueue.canMakePayments() else {
             purchase(self, didChaged: .payFail, object: "Payment failed, please check your payment account",transaction: nil)
+            debugPrint("PurchaseManager payFail pay failed, please check your payment account")
             return
         }
 
         guard SKPaymentQueue.default().transactions.count <= 0 else {
-            purchase(self, didChaged: .payFail, object: "You have outstanding orders that must be paid for before a new subscription can be placed.",transaction: nil)
-            debugPrint("PurchaseManager pay period restorePremium = \(period)")
-            restorePremium()
+//            purchase(self, didChaged: .payFail, object: "You have outstanding orders that must be paid for before a new subscription can be placed.",transaction: nil)
+            debugPrint("PurchaseManager paymentQueue transactions.count SKPaymentQueue= \(SKPaymentQueue.default().transactions.count)")
+            debugPrint("PurchaseManager payFail pay period restorePremium = \(period)")
+            if isPurchaseTime(productId:paymentProductIdentifier) == false{
+                restorePremium()
+            }
             return
         }
         if let product = product(for: period) {
             purchase(self, didChaged: .paying, object: nil,transaction: nil)
             let payment = SKPayment(product: product)
-            debugPrint("PurchaseManager pay product = \(product.localizedDescription)")
+            debugPrint("PurchaseManager payFail  pay product = \(product.localizedDescription)")
             SKPaymentQueue.default().add(payment)
-            paymentProductIdentifier = payment.productIdentifier
-            debugPrint("PurchaseManager pay period = \(period)")
+            debugPrint("PurchaseManager payFail  pay period = \(period)")
 
             subscriptionApple(type: .created, jsonString: "Payment period = \(product)")
         } else {
+            debugPrint("PurchaseManager payFail  pay 找不到要买的商品 = \(period)")
             purchase(self, didChaged: .payFail, object: "Payment failed, no this item",transaction: nil)
         }
     }
@@ -339,31 +354,37 @@ extension PurchaseManager: SKProductsRequestDelegate {
         NotificationCenter.default.post(name: .kPurchasePrepared, object: nil)
         dePrint("PurchaseManager productsRequest didReceive = \(products)")
         
-        for product in products {
-            dePrint("请求到商品ID: \(product.productIdentifier)")
-            // 获取促销价格
-            if let introductoryPrice = product.introductoryPrice {
-                dePrint("新用户促销价格: \(introductoryPrice.price) \(introductoryPrice.priceLocale.currencySymbol ?? "")")
-                dePrint("新用户促销周期: \(introductoryPrice.subscriptionPeriod.numberOfUnits) \(introductoryPrice.subscriptionPeriod.unit)")
-            }
-            
-            // 获取促销价格
-            for discounts in product.discounts {
-                dePrint("老用户促销价格: \(discounts.price) \(discounts.priceLocale.currencySymbol ?? "")")
-                dePrint("老用户促销周期: \(discounts.subscriptionPeriod.numberOfUnits)")
-            }
-
-        }
+//        for product in products {
+//            dePrint("请求到商品ID: \(product.productIdentifier)")
+//            // 获取促销价格
+//            if let introductoryPrice = product.introductoryPrice {
+//                dePrint("新用户促销价格: \(introductoryPrice.price) \(introductoryPrice.priceLocale.currencySymbol ?? "")")
+//                dePrint("新用户促销周期: \(introductoryPrice.subscriptionPeriod.numberOfUnits) \(introductoryPrice.subscriptionPeriod.unit)")
+//            }
+//            
+//            // 获取促销价格
+//            for discounts in product.discounts {
+//                dePrint("老用户促销价格: \(discounts.price) \(discounts.priceLocale.currencySymbol ?? "")")
+//                dePrint("老用户促销周期: \(discounts.subscriptionPeriod.numberOfUnits)")
+//            }
+//        }
         
         //拿到商品后,主动拉取一次苹果订单,处理会员
         _ = onceVerifyPayResult
         dePrint("PurchaseManager onceVerifyPayResult")
     }
-
+    
     public func request(_ request: SKRequest, didFailWithError error: Error) {
         dePrint("PurchaseManager productsRequest error = \(error)")
         purchase(self, didChaged: .loadFail, object: error.localizedDescription,transaction: nil)
     }
+    
+    func isPurchaseTime(productId:String?) -> Bool{
+        if let productId = productId,PurchaseManager.purchaseNumProducts.contains(productId) == true{
+            return true
+        }
+        return false
+    }
 }
 
 // MARK: 订阅回调
@@ -379,7 +400,6 @@ extension PurchaseManager: SKPaymentTransactionObserver {
 //            debugPrint("PurchaseManager paymentQueue transactions transactionIdentifier original= \(transaction.original?.transactionIdentifier)")
 //            debugPrint("PurchaseManager paymentQueue transactions transactionIdentifier = \(transaction.transactionIdentifier)")
 //            debugPrint("PurchaseManager paymentQueue transactions transactionIdentifier productIdentifier = \(transaction.payment.productIdentifier)")
-
             switch transaction.transactionState {
             case .purchasing:
                 // Transaction is being added to the server queue.
@@ -403,8 +423,9 @@ extension PurchaseManager: SKPaymentTransactionObserver {
 
                 SKPaymentQueue.default().finishTransaction(transaction)
                 
-                //非购买次数类(就是订阅续费类)报错处理
-                if TSPurchaseTimesManager.purchaseNumProducts.contains(transaction.payment.productIdentifier) == false,
+                //对于不包含次数购买的商品,(也就是订阅续费类),做特殊报错处理
+                
+                if isPurchaseTime(productId:transaction.payment.productIdentifier) == false,
                     let error = transaction.error as NSError? {
                     // 1. 检查内层错误
                     if let underlyingError = error.userInfo[NSUnderlyingErrorKey] as? NSError {
@@ -435,7 +456,7 @@ extension PurchaseManager: SKPaymentTransactionObserver {
                     }
                     //error.errorCode == 3532 //用户已订阅,禁止重复购买
                 }
-       
+                dePrint("PurchaseManager payFail failed  message = \(message)")
                 purchase(self, didChaged: .payFail, object: message,transaction: transaction)
                 subscriptionApple(type: .result, jsonString: message)
                 
@@ -494,9 +515,10 @@ extension PurchaseManager: SKPaymentTransactionObserver {
 extension PurchaseManager {
 
     func verifyPayResult(transaction: SKPaymentTransaction, useSandBox: Bool, uiBlock:((PurchaseManager,PremiumRequestState,Any?,SKPaymentTransaction?)->Void)?) {
-        
+        uiBlock?(self,.verifying,nil,transaction)
         guard let url = Bundle.main.appStoreReceiptURL,
               let receiptData = try? Data(contentsOf: url) else {
+            debugPrint("凭证文件为空")
             uiBlock?(self,.verifyFail,"凭证文件为空",transaction)
             return
         }
@@ -506,6 +528,7 @@ extension PurchaseManager {
             "password": AppleSharedKey,
         ]
         guard let requestData = try? JSONSerialization.data(withJSONObject: requestContents) else {
+            debugPrint("凭证文件为空")
             uiBlock?(self,.verifyFail,"凭证文件为空",transaction)
             return
         }
@@ -712,13 +735,18 @@ public extension PurchaseManager {
     }
 
     func purchase(_ manager: PurchaseManager, didChaged state: PremiumRequestState, object: Any?,transaction:SKPaymentTransaction?) {
-        if transaction == nil{
-            onPurchaseStateChanged?(manager, state, object)
-        }else if transaction?.transactionState == .restored,paymentProductIdentifier == "restoreCompletedTransactions"{
-            onPurchaseStateChanged?(manager, state, object)
-        }else if let productIdentifier = transaction?.payment.productIdentifier, productIdentifier == paymentProductIdentifier {
-            onPurchaseStateChanged?(manager, state, object)
+        dePrint("transaction.payment.productIdentifier=\(transaction?.payment.productIdentifier),paymentProductIdentifier=\(paymentProductIdentifier)")
+        
+        if let paymentProductIdentifier = paymentProductIdentifier {
+            if transaction == nil{
+                onPurchaseStateChanged?(manager, state, object)
+            }else if let productIdentifier = transaction?.payment.productIdentifier, productIdentifier == paymentProductIdentifier {
+                onPurchaseStateChanged?(manager, state, object)
+            }else if transaction?.transactionState == .restored,paymentProductIdentifier == "restoreCompletedTransactions"{
+                onPurchaseStateChanged?(manager, state, object)
+            }
         }
+
     }
 }
 

+ 224 - 224
AIEmoji/Common/Purchase/TSPurchaseTimesManager/TSPurchaseTimesManager.swift

@@ -5,229 +5,229 @@
 //  Created by 100Years on 2025/8/10.
 //
 
-import Foundation
-import StoreKit
-
-
-typealias PurchaseTimesStateChangeHandler = (_ manager: TSPurchaseTimesManager, _ state: PremiumRequestState, _ object: Any?) -> Void
-
-public class TSPurchaseTimesManager: NSObject {
-    @objc public static let `default` = TSPurchaseTimesManager()
-    
-    //购买次数的商品
-    static var purchaseNumProducts: [String] = {
-        return ["201","202","203"]
-    }()
-    
-    lazy var products: [SKProduct] = []
-    var paymentProductIdentifier:String?
-    var onPurchaseStateChanged: PurchaseTimesStateChangeHandler?
-
-    // 原始订单交易id dict
-    var originalTransactionIdentifierDict: [String: String] = [:]
-
-    override init() {
-        super.init()
-        SKPaymentQueue.default().add(self)
-    }
-
-}
-
-
-
-// MARK: 商品 & 订阅请求
-extension TSPurchaseTimesManager {
-    /// 购买支付
-    public func pay(for period: PremiumPeriod) {
-        guard SKPaymentQueue.canMakePayments() else {
-            purchase(self, didChaged: .payFail, object: "Payment failed, please check your payment account",transaction: nil)
-            return
-        }
-
-//        guard SKPaymentQueue.default().transactions.count <= 0 else {
-//            purchase(self, didChaged: .payFail, object: "You have outstanding orders that must be paid for before a new subscription can be placed.",transaction: nil)
-//            debugPrint("TSPurchaseTimesManager pay period restorePremium = \(period)")
+//import Foundation
+//import StoreKit
+//
+//
+//typealias PurchaseTimesStateChangeHandler = (_ manager: TSPurchaseTimesManager, _ state: PremiumRequestState, _ object: Any?) -> Void
+//
+//public class TSPurchaseTimesManager: NSObject {
+//    @objc public static let `default` = TSPurchaseTimesManager()
+//    
+//    //购买次数的商品
+//    static var purchaseNumProducts: [String] = {
+//        return ["201","202","203"]
+//    }()
+//    
+//    lazy var products: [SKProduct] = []
+//    var paymentProductIdentifier:String?
+//    var onPurchaseStateChanged: PurchaseTimesStateChangeHandler?
+//
+//    // 原始订单交易id dict
+//    var originalTransactionIdentifierDict: [String: String] = [:]
+//
+//    override init() {
+//        super.init()
+//        SKPaymentQueue.default().add(self)
+//    }
+//
+//}
+//
+//
+//
+//// MARK: 商品 & 订阅请求
+//extension TSPurchaseTimesManager {
+//    /// 购买支付
+//    public func pay(for period: PremiumPeriod) {
+//        guard SKPaymentQueue.canMakePayments() else {
+//            purchase(self, didChaged: .payFail, object: "Payment failed, please check your payment account",transaction: nil)
 //            return
 //        }
-        
-        if let product = kPurchaseDefault.product(for: period) {
-            purchase(self, didChaged: .paying, object: nil,transaction: nil)
-            let payment = SKPayment(product: product)
-            debugPrint("TSPurchaseTimesManager pay product = \(product.localizedDescription)")
-            SKPaymentQueue.default().add(payment)
-            paymentProductIdentifier = payment.productIdentifier
-            debugPrint("TSPurchaseTimesManager pay period = \(period)")
-
-            kPurchaseDefault.subscriptionApple(type: .created, jsonString: "Payment period = \(product)")
-        } else {
-            purchase(self, didChaged: .payFail, object: "Payment failed, no this item",transaction: nil)
-        }
-    }
-}
-
-// MARK: 订阅回调
-
-extension TSPurchaseTimesManager: SKPaymentTransactionObserver {
-    public func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
-        debugPrint("TSPurchaseTimesManager paymentQueue transactions.count = \(transactions.count)")
-        originalTransactionIdentifierDict.removeAll()
-        // 因为只有订阅类的购买项
-        for transaction in transactions {
-            if Self.purchaseNumProducts.contains(transaction.payment.productIdentifier) == false {
-                return
-            }
-    
-            switch transaction.transactionState {
-            case .purchasing:
-                // Transaction is being added to the server queue.
-                purchase(self, didChaged: .paying, object: nil,transaction:transaction)
-
-            case .purchased:
-                SKPaymentQueue.default().finishTransaction(transaction)
-                // 同样的原始订单,只处理一次.
-                guard judgeWhether(transaction: transaction) else {
-                    break
-                }
-
-                // Transaction is in queue, user has been charged.  Client should complete the transaction.
-                #if DEBUG
-                    verifyPayResult(transaction: transaction, useSandBox: true)
-                #else
-                    verifyPayResult(transaction: transaction, useSandBox: false)
-                #endif
-
-            case .failed:
-
-                SKPaymentQueue.default().finishTransaction(transaction)
-                var message = "Payment Failed"
-                if let error = transaction.error as? SKError{
-                    if error.code == SKError.paymentCancelled {
-                        message = "The subscription was canceled"
-                    }else{
-                        message = error.localizedDescription
-                    }
-                }
-       
-                purchase(self, didChaged: .payFail, object: message,transaction:transaction)
-                kPurchaseDefault.subscriptionApple(type: .result, jsonString: message)
-            case .restored:
-                SKPaymentQueue.default().finishTransaction(transaction)
-                // 同样的原始订单,只处理一次.
-                guard judgeWhether(transaction: transaction) else {
-                    break
-                }
-
-                // Transaction was restored from user's purchase history.  Client should complete the transaction.
-                if let original = transaction.original,
-                   original.transactionState == .purchased {
-                    #if DEBUG
-                        verifyPayResult(transaction: transaction, useSandBox: true)
-                    #else
-                        verifyPayResult(transaction: transaction, useSandBox: false)
-                    #endif
-                } else {
-                    purchase(self, didChaged: .restoreFail, object: "Failed to restore subscribe, please try again",transaction:transaction)
-                    kPurchaseDefault.subscriptionApple(type: .result, jsonString: "Failed to restore subscribe, please try again")
-                }
-
-            case .deferred: // The transaction is in the queue, but its final status is pending external action.
-                break
-            @unknown default:
-                SKPaymentQueue.default().finishTransaction(transaction)
-            }
-        }
-    }
-
-    public func paymentQueue(_ queue: SKPaymentQueue, restoreCompletedTransactionsFailedWithError error: Error) {
-        purchase(self, didChaged: .restoreFail, object: nil,transaction:nil)
-    }
-
-    public func paymentQueueRestoreCompletedTransactionsFinished(_ queue: SKPaymentQueue) {
-        if let trans = queue.transactions.first(where: { $0.transactionState == .purchased }) {
-            verifyPayResult(transaction: trans, useSandBox: false)
-        } else if queue.transactions.isEmpty {
-            purchase(self, didChaged: .restoreFail, object: "You don't have an active subscription",transaction:nil)
-        }
-    }
-
-    func judgeWhether(transaction: SKPaymentTransaction) -> Bool {
-        let id = transaction.original?.transactionIdentifier
-        if let id = id {
-            if let value = originalTransactionIdentifierDict[id] {
-                return false
-            }
-            originalTransactionIdentifierDict[id] = "1"
-        }
-        return true
-    }
-}
-
-extension TSPurchaseTimesManager {
-    func verifyPayResult(transaction: SKPaymentTransaction, useSandBox: Bool) {
-        purchase(self, didChaged: .verifying, object: nil,transaction:transaction)
-
-        guard let url = Bundle.main.appStoreReceiptURL,
-              let receiptData = try? Data(contentsOf: url) else {
-            purchase(self, didChaged: .verifyFail, object: "凭证文件为空",transaction:transaction)
-            return
-        }
-
-        let requestContents = [
-            "receipt-data": receiptData.base64EncodedString(),
-            "password": kPurchaseDefault.AppleSharedKey,
-        ]
-        guard let requestData = try? JSONSerialization.data(withJSONObject: requestContents) else {
-            purchase(self, didChaged: .verifyFail, object: "凭证文件为空",transaction:transaction)
-            return
-        }
-
-        let verifyUrlString = useSandBox ? PurchaseManager.Config.sandBoxUrl : PurchaseManager.Config.verifyUrl
-
-        kPurchaseDefault.postRequest(urlString: verifyUrlString, httpBody: requestData) { [weak self] data, _ in
-            guard let self = self else { return }
-            if let data = data,
-               let jsonResponse = try? JSONSerialization.jsonObject(with: data) as? [String: Any] {
-                debugPrint("TSPurchaseTimesManager verifyPayResult = \(jsonResponse)")
-                let status = jsonResponse["status"]
-                if let status = status as? String, status == "21007" {
-                    self.verifyPayResult(transaction: transaction, useSandBox: true)
-                } else if let status = status as? Int, status == 21007 {
-                    self.verifyPayResult(transaction: transaction, useSandBox: true)
-                } else if let status = status as? String, status == "0" {
-                    self.handlerPayResult(transaction: transaction, resp: jsonResponse)
-                } else if let status = status as? Int, status == 0 {
-                    self.handlerPayResult(transaction: transaction, resp: jsonResponse)
-                } else {
-                    self.purchase(self, didChaged: .verifyFail, object: "验证结果状态码错误:\(status.debugDescription)",transaction:transaction)
-                }
-            } else {
-                self.purchase(self, didChaged: .verifyFail, object: "验证结果为空",transaction:transaction)
-                debugPrint("TSPurchaseTimesManager 验证结果为空")
-            }
-        }
-    }
-
-    func handlerPayResult(transaction: SKPaymentTransaction, resp: [String: Any]) {
-        
-        //购买视频次数相关
-        //分析处理购买消耗品的逻辑处理
-        kPurchaseDefault.analyzeDataReceiptForPurchase(resp: resp)
-        
-        DispatchQueue.main.async {
-            self.purchase(self, didChaged: .paySuccess, object: nil,transaction:transaction)
-        }
-
-        kPurchaseDefault.subscriptionApple(type: .result, jsonString: kPurchaseDefault.simplifyVerifyPayResult(resp: resp))
-    }
-    
-}
-
-public extension TSPurchaseTimesManager {
-    func purchase(_ manager: TSPurchaseTimesManager, didChaged state: PremiumRequestState, object: Any?,transaction:SKPaymentTransaction?) {
-        if transaction == nil{
-            onPurchaseStateChanged?(manager, state, object)
-        }else if let productIdentifier = transaction?.payment.productIdentifier,productIdentifier == paymentProductIdentifier {
-            onPurchaseStateChanged?(manager, state, object)
-        }
-    }
-}
+//
+////        guard SKPaymentQueue.default().transactions.count <= 0 else {
+////            purchase(self, didChaged: .payFail, object: "You have outstanding orders that must be paid for before a new subscription can be placed.",transaction: nil)
+////            debugPrint("TSPurchaseTimesManager pay period restorePremium = \(period)")
+////            return
+////        }
+//        
+//        if let product = kPurchaseDefault.product(for: period) {
+//            purchase(self, didChaged: .paying, object: nil,transaction: nil)
+//            let payment = SKPayment(product: product)
+//            debugPrint("TSPurchaseTimesManager pay product = \(product.localizedDescription)")
+//            SKPaymentQueue.default().add(payment)
+//            paymentProductIdentifier = payment.productIdentifier
+//            debugPrint("TSPurchaseTimesManager pay period = \(period)")
+//
+//            kPurchaseDefault.subscriptionApple(type: .created, jsonString: "Payment period = \(product)")
+//        } else {
+//            purchase(self, didChaged: .payFail, object: "Payment failed, no this item",transaction: nil)
+//        }
+//    }
+//}
+//
+//// MARK: 订阅回调
+//
+//extension TSPurchaseTimesManager: SKPaymentTransactionObserver {
+//    public func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
+//        debugPrint("TSPurchaseTimesManager paymentQueue transactions.count = \(transactions.count)")
+//        originalTransactionIdentifierDict.removeAll()
+//        // 因为只有订阅类的购买项
+//        for transaction in transactions {
+//            if Self.purchaseNumProducts.contains(transaction.payment.productIdentifier) == false {
+//                return
+//            }
+//    
+//            switch transaction.transactionState {
+//            case .purchasing:
+//                // Transaction is being added to the server queue.
+//                purchase(self, didChaged: .paying, object: nil,transaction:transaction)
+//
+//            case .purchased:
+//                SKPaymentQueue.default().finishTransaction(transaction)
+//                // 同样的原始订单,只处理一次.
+//                guard judgeWhether(transaction: transaction) else {
+//                    break
+//                }
+//
+//                // Transaction is in queue, user has been charged.  Client should complete the transaction.
+//                #if DEBUG
+//                    verifyPayResult(transaction: transaction, useSandBox: true)
+//                #else
+//                    verifyPayResult(transaction: transaction, useSandBox: false)
+//                #endif
+//
+//            case .failed:
+//
+//                SKPaymentQueue.default().finishTransaction(transaction)
+//                var message = "Payment Failed"
+//                if let error = transaction.error as? SKError{
+//                    if error.code == SKError.paymentCancelled {
+//                        message = "The subscription was canceled"
+//                    }else{
+//                        message = error.localizedDescription
+//                    }
+//                }
+//       
+//                purchase(self, didChaged: .payFail, object: message,transaction:transaction)
+//                kPurchaseDefault.subscriptionApple(type: .result, jsonString: message)
+//            case .restored:
+//                SKPaymentQueue.default().finishTransaction(transaction)
+//                // 同样的原始订单,只处理一次.
+//                guard judgeWhether(transaction: transaction) else {
+//                    break
+//                }
+//
+//                // Transaction was restored from user's purchase history.  Client should complete the transaction.
+//                if let original = transaction.original,
+//                   original.transactionState == .purchased {
+//                    #if DEBUG
+//                        verifyPayResult(transaction: transaction, useSandBox: true)
+//                    #else
+//                        verifyPayResult(transaction: transaction, useSandBox: false)
+//                    #endif
+//                } else {
+//                    purchase(self, didChaged: .restoreFail, object: "Failed to restore subscribe, please try again",transaction:transaction)
+//                    kPurchaseDefault.subscriptionApple(type: .result, jsonString: "Failed to restore subscribe, please try again")
+//                }
+//
+//            case .deferred: // The transaction is in the queue, but its final status is pending external action.
+//                break
+//            @unknown default:
+//                SKPaymentQueue.default().finishTransaction(transaction)
+//            }
+//        }
+//    }
+//
+//    public func paymentQueue(_ queue: SKPaymentQueue, restoreCompletedTransactionsFailedWithError error: Error) {
+//        purchase(self, didChaged: .restoreFail, object: nil,transaction:nil)
+//    }
+//
+//    public func paymentQueueRestoreCompletedTransactionsFinished(_ queue: SKPaymentQueue) {
+//        if let trans = queue.transactions.first(where: { $0.transactionState == .purchased }) {
+//            verifyPayResult(transaction: trans, useSandBox: false)
+//        } else if queue.transactions.isEmpty {
+//            purchase(self, didChaged: .restoreFail, object: "You don't have an active subscription",transaction:nil)
+//        }
+//    }
+//
+//    func judgeWhether(transaction: SKPaymentTransaction) -> Bool {
+//        let id = transaction.original?.transactionIdentifier
+//        if let id = id {
+//            if let value = originalTransactionIdentifierDict[id] {
+//                return false
+//            }
+//            originalTransactionIdentifierDict[id] = "1"
+//        }
+//        return true
+//    }
+//}
+//
+//extension TSPurchaseTimesManager {
+//    func verifyPayResult(transaction: SKPaymentTransaction, useSandBox: Bool) {
+//        purchase(self, didChaged: .verifying, object: nil,transaction:transaction)
+//
+//        guard let url = Bundle.main.appStoreReceiptURL,
+//              let receiptData = try? Data(contentsOf: url) else {
+//            purchase(self, didChaged: .verifyFail, object: "凭证文件为空",transaction:transaction)
+//            return
+//        }
+//
+//        let requestContents = [
+//            "receipt-data": receiptData.base64EncodedString(),
+//            "password": kPurchaseDefault.AppleSharedKey,
+//        ]
+//        guard let requestData = try? JSONSerialization.data(withJSONObject: requestContents) else {
+//            purchase(self, didChaged: .verifyFail, object: "凭证文件为空",transaction:transaction)
+//            return
+//        }
+//
+//        let verifyUrlString = useSandBox ? PurchaseManager.Config.sandBoxUrl : PurchaseManager.Config.verifyUrl
+//
+//        kPurchaseDefault.postRequest(urlString: verifyUrlString, httpBody: requestData) { [weak self] data, _ in
+//            guard let self = self else { return }
+//            if let data = data,
+//               let jsonResponse = try? JSONSerialization.jsonObject(with: data) as? [String: Any] {
+//                debugPrint("TSPurchaseTimesManager verifyPayResult = \(jsonResponse)")
+//                let status = jsonResponse["status"]
+//                if let status = status as? String, status == "21007" {
+//                    self.verifyPayResult(transaction: transaction, useSandBox: true)
+//                } else if let status = status as? Int, status == 21007 {
+//                    self.verifyPayResult(transaction: transaction, useSandBox: true)
+//                } else if let status = status as? String, status == "0" {
+//                    self.handlerPayResult(transaction: transaction, resp: jsonResponse)
+//                } else if let status = status as? Int, status == 0 {
+//                    self.handlerPayResult(transaction: transaction, resp: jsonResponse)
+//                } else {
+//                    self.purchase(self, didChaged: .verifyFail, object: "验证结果状态码错误:\(status.debugDescription)",transaction:transaction)
+//                }
+//            } else {
+//                self.purchase(self, didChaged: .verifyFail, object: "验证结果为空",transaction:transaction)
+//                debugPrint("TSPurchaseTimesManager 验证结果为空")
+//            }
+//        }
+//    }
+//
+//    func handlerPayResult(transaction: SKPaymentTransaction, resp: [String: Any]) {
+//        
+//        //购买视频次数相关
+//        //分析处理购买消耗品的逻辑处理
+//        kPurchaseDefault.analyzeDataReceiptForPurchase(resp: resp)
+//        
+//        DispatchQueue.main.async {
+//            self.purchase(self, didChaged: .paySuccess, object: nil,transaction:transaction)
+//        }
+//
+//        kPurchaseDefault.subscriptionApple(type: .result, jsonString: kPurchaseDefault.simplifyVerifyPayResult(resp: resp))
+//    }
+//    
+//}
+//
+//public extension TSPurchaseTimesManager {
+//    func purchase(_ manager: TSPurchaseTimesManager, didChaged state: PremiumRequestState, object: Any?,transaction:SKPaymentTransaction?) {
+//        if transaction == nil{
+//            onPurchaseStateChanged?(manager, state, object)
+//        }else if let productIdentifier = transaction?.payment.productIdentifier,productIdentifier == paymentProductIdentifier {
+//            onPurchaseStateChanged?(manager, state, object)
+//        }
+//    }
+//}

+ 2 - 3
AIEmoji/TSLaunchVC.swift

@@ -55,13 +55,12 @@ class TSLaunchVC: UIViewController {
             switch status {
             case .reachable:
                 manager?.stopListening()
+                PurchaseManager.default.requestProducts()
+//                PurchaseManager.default.restorePremium(showUI: false)
                 break
             default:
                 break
             }
-            
-            PurchaseManager.default.requestProducts()
-            PurchaseManager.default.restorePremium()
         }
     }