From ab478455fd96c80b8c494abfe8baad0e732e8ca2 Mon Sep 17 00:00:00 2001 From: zeng Date: Sat, 19 Jul 2025 15:39:24 +0800 Subject: [PATCH] =?UTF-8?q?=E5=86=8D=E6=AC=A1=E4=BC=98=E5=8C=96=E5=86=85?= =?UTF-8?q?=E8=B4=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ThimraTV.xcodeproj/project.pbxproj | 4 + .../Base/Networking/API/SPWalletAPI.swift | 63 +---------- .../Controller/SPMineViewController.swift | 7 +- .../Class/Player/View/SPPlayBuyView.swift | 17 +-- .../Controller/SPStoreViewController.swift | 16 +-- .../SPIAPManager/SPPayTemplateRequest.swift | 101 ++++++++++++++++++ 6 files changed, 134 insertions(+), 74 deletions(-) create mode 100644 ThimraTV/Libs/SPIAPManager/SPPayTemplateRequest.swift diff --git a/ThimraTV.xcodeproj/project.pbxproj b/ThimraTV.xcodeproj/project.pbxproj index 35a864e..ab545fa 100644 --- a/ThimraTV.xcodeproj/project.pbxproj +++ b/ThimraTV.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 1B222BCF2E2B80DD002F5A68 /* SPPayTemplateRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B222BCE2E2B80DD002F5A68 /* SPPayTemplateRequest.swift */; }; 1BB91D102E04FD6A00A2C715 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1BB91BBD2E04FD6A00A2C715 /* AppDelegate.swift */; }; 1BB91D112E04FD6A00A2C715 /* AppDelegate+APNS.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1BB91BBE2E04FD6A00A2C715 /* AppDelegate+APNS.swift */; }; 1BB91D122E04FD6A00A2C715 /* AppDelegate+Config.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1BB91BBF2E04FD6A00A2C715 /* AppDelegate+Config.swift */; }; @@ -316,6 +317,7 @@ /* Begin PBXFileReference section */ 0538826A0638D33FEF3A2E38 /* Pods-ThimraTV.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ThimraTV.debug.xcconfig"; path = "Target Support Files/Pods-ThimraTV/Pods-ThimraTV.debug.xcconfig"; sourceTree = ""; }; + 1B222BCE2E2B80DD002F5A68 /* SPPayTemplateRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SPPayTemplateRequest.swift; sourceTree = ""; }; 1BB91BBD2E04FD6A00A2C715 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 1BB91BBE2E04FD6A00A2C715 /* AppDelegate+APNS.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AppDelegate+APNS.swift"; sourceTree = ""; }; 1BB91BBF2E04FD6A00A2C715 /* AppDelegate+Config.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AppDelegate+Config.swift"; sourceTree = ""; }; @@ -1267,6 +1269,7 @@ 1BB91CC82E04FD6A00A2C715 /* SPIAPOrderModel.swift */, 1BB91CC92E04FD6A00A2C715 /* SPIAPVerifyModel.swift */, 1BB91CCA2E04FD6A00A2C715 /* SPWaitRestoreModel.swift */, + 1B222BCE2E2B80DD002F5A68 /* SPPayTemplateRequest.swift */, ); path = SPIAPManager; sourceTree = ""; @@ -1874,6 +1877,7 @@ 1BB91D872E04FD6A00A2C715 /* SPAboutUsViewController.swift in Sources */, 1BB91D882E04FD6A00A2C715 /* SPDeleteAccountViewController.swift in Sources */, 1BB91D892E04FD6A00A2C715 /* SPFeedbackViewController.swift in Sources */, + 1B222BCF2E2B80DD002F5A68 /* SPPayTemplateRequest.swift in Sources */, 1BB91D8A2E04FD6A00A2C715 /* SPLanguageViewController.swift in Sources */, 1BB91D8B2E04FD6A00A2C715 /* SPMineViewController.swift in Sources */, 1BB91D8C2E04FD6A00A2C715 /* SPSettingsViewController.swift in Sources */, diff --git a/ThimraTV/Base/Networking/API/SPWalletAPI.swift b/ThimraTV/Base/Networking/API/SPWalletAPI.swift index eafe9a7..07113d5 100644 --- a/ThimraTV/Base/Networking/API/SPWalletAPI.swift +++ b/ThimraTV/Base/Networking/API/SPWalletAPI.swift @@ -16,75 +16,18 @@ class SPWalletAPI: NSObject { ///获取支付模版 static func requestPayTemplate(isLoding: Bool = false, isToast: Bool = true, completer: ((_ model: SPPayTemplateModel?) -> Void)?) { - if isLoding { - SPHUD.show() - } - - _requestPayTemplate(isToast: isToast) { model in - guard let model = model else { - if isLoding { - SPHUD.dismiss() - } - completer?(nil) - return - } - var productIdArr: [String] = [] - model.list_sub_vip?.forEach { item in - productIdArr.append(SPIAPManager.manager.getProductId(templateId: item.ios_template_id) ?? "") - } - model.list_coins?.forEach { item in - productIdArr.append(SPIAPManager.manager.getProductId(templateId: item.ios_template_id) ?? "") - } - - SPIAPManager.manager.requestProductList(productIdArr: productIdArr) { products in - if isLoding { - SPHUD.dismiss() - } - - var newCoinList: [SPPayTemplateItem] = [] - var newVipList: [SPPayTemplateItem] = [] - - model.list_coins?.forEach { item in - let productId = SPIAPManager.manager.getProductId(templateId: item.ios_template_id) ?? "" - for product in products { - if productId == product.productIdentifier { - item.price = product.price.stringValue - item.currency = product.priceLocale.currencySymbol - newCoinList.append(item) - break - } - } - } - model.list_sub_vip?.forEach { item in - let productId = SPIAPManager.manager.getProductId(templateId: item.ios_template_id) ?? "" - for product in products { - if productId == product.productIdentifier { - item.price = product.price.stringValue - item.currency = product.priceLocale.currencySymbol - newVipList.append(item) - break - } - } - } - model.list_coins = newCoinList - model.list_sub_vip = newVipList - - completer?(model) - } - - } - } - - private static func _requestPayTemplate(isToast: Bool = true, completer: ((_ model: SPPayTemplateModel?) -> Void)?) { var param = SPNetworkParameters(path: "/paySettingsV3") param.method = .get param.isToast = isToast + param.isLoding = false SPNetwork.request(parameters: param) { (response: SPNetworkResponse) in completer?(response.data) } } + + ///创建内购订单 static func requestCreateOrder(payId: String, shortPlayId: String, videoId: String, completer: ((_ orderModel: SPIAPOrderModel?) -> Void)?) { var param = SPNetworkParameters(path: "/createOrder") diff --git a/ThimraTV/Class/Mine/Controller/SPMineViewController.swift b/ThimraTV/Class/Mine/Controller/SPMineViewController.swift index 5df9dd0..69783d2 100644 --- a/ThimraTV/Class/Mine/Controller/SPMineViewController.swift +++ b/ThimraTV/Class/Mine/Controller/SPMineViewController.swift @@ -28,6 +28,8 @@ class SPMineViewController: SPViewController { private var needShowRewardedAd: Bool = false weak var vipAlertView: SPVipAlertView? + + private var payTemplateRequest: SPPayTemplateRequest? //MARK: UI 属性 private lazy var headerView: SPMineHeaderView = { let view = SPMineHeaderView() @@ -101,7 +103,10 @@ extension SPMineViewController { guard SPLoginManager.manager.userInfo?.is_vip != true else { return } guard SPVipAlertView.isShowAlert else { return } - SPWalletAPI.requestPayTemplate { model in + self.payTemplateRequest = SPPayTemplateRequest() + self.payTemplateRequest?.requestProducts(isToast: false) { [weak self] model in + guard let self = self else { return } + guard let list = model?.list_sub_vip, list.count > 0 else { return } if !self.isDidAppear { return } if self.vipAlertView != nil { return } diff --git a/ThimraTV/Class/Player/View/SPPlayBuyView.swift b/ThimraTV/Class/Player/View/SPPlayBuyView.swift index dd97fa8..5924726 100644 --- a/ThimraTV/Class/Player/View/SPPlayBuyView.swift +++ b/ThimraTV/Class/Player/View/SPPlayBuyView.swift @@ -24,6 +24,8 @@ class SPPlayBuyView: HWPanModalContentView { } } + private var payTemplateRequest: SPPayTemplateRequest? + //MARK: UI属性 private lazy var bgView: UIImageView = { let view = UIImageView(image: UIImage(named: "buy_bg_image_01")) @@ -246,27 +248,28 @@ extension SPPlayBuyView { ///请求支付模版 private func requestPayTemplate() { - SPWalletAPI.requestPayTemplate { [weak self] templateModel in + + self.payTemplateRequest = SPPayTemplateRequest() + self.payTemplateRequest?.requestProducts { [weak self] model in guard let self = self else { return } self.stackView.removeAllArrangedSubview() - if let sort = templateModel?.sort, sort.count > 0 { + if let sort = model?.sort, sort.count > 0 { sort.forEach { if $0 == .vip { - self.addMemberView(list: templateModel?.list_sub_vip) + self.addMemberView(list: model?.list_sub_vip) } else if $0 == .coin { - self.addCoinView(list: templateModel?.list_coins) + self.addCoinView(list: model?.list_coins) } } } else { - self.addMemberView(list: templateModel?.list_sub_vip) - self.addCoinView(list: templateModel?.list_coins) + self.addMemberView(list: model?.list_sub_vip) + self.addCoinView(list: model?.list_coins) } DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { self.panModalSetNeedsLayoutUpdate() } - } } diff --git a/ThimraTV/Class/Wallet/Controller/SPStoreViewController.swift b/ThimraTV/Class/Wallet/Controller/SPStoreViewController.swift index 81d4c48..b2dacba 100644 --- a/ThimraTV/Class/Wallet/Controller/SPStoreViewController.swift +++ b/ThimraTV/Class/Wallet/Controller/SPStoreViewController.swift @@ -9,6 +9,8 @@ import UIKit class SPStoreViewController: SPViewController { + private var payTemplateRequest: SPPayTemplateRequest? + //MARK: UI属性 private lazy var scrollView: SPScrollView = { let scrollView = SPScrollView() @@ -184,21 +186,23 @@ extension SPStoreViewController { ///请求支付模版 private func requestPayTemplate() { - SPWalletAPI.requestPayTemplate { [weak self] templateModel in + + self.payTemplateRequest = SPPayTemplateRequest() + self.payTemplateRequest?.requestProducts { [weak self] model in guard let self = self else { return } self.stackView.removeAllArrangedSubview() - if let sort = templateModel?.sort, sort.count > 0 { + if let sort = model?.sort, sort.count > 0 { sort.forEach { if $0 == .vip { - self.addMemberView(list: templateModel?.list_sub_vip) + self.addMemberView(list: model?.list_sub_vip) } else if $0 == .coin { - self.addCoinView(list: templateModel?.list_coins) + self.addCoinView(list: model?.list_coins) } } } else { - self.addMemberView(list: templateModel?.list_sub_vip) - self.addCoinView(list: templateModel?.list_coins) + self.addMemberView(list: model?.list_sub_vip) + self.addCoinView(list: model?.list_coins) } } } diff --git a/ThimraTV/Libs/SPIAPManager/SPPayTemplateRequest.swift b/ThimraTV/Libs/SPIAPManager/SPPayTemplateRequest.swift new file mode 100644 index 0000000..3f05dc5 --- /dev/null +++ b/ThimraTV/Libs/SPIAPManager/SPPayTemplateRequest.swift @@ -0,0 +1,101 @@ +// +// SPPayTemplateRequest.swift +// ThimraTV +// +// Created by 长沙佳儿 on 2025/7/19. +// + +import UIKit +import StoreKit + +class SPPayTemplateRequest: NSObject { + + private var oldTemplateModel: SPPayTemplateModel? + + private var completerBlock: ((_ model: SPPayTemplateModel?) -> Void)? + + private var isLoding = false + private var isToast = false + + + func requestProducts(isLoding: Bool = false, isToast: Bool = true, completer: ((_ model: SPPayTemplateModel?) -> Void)?) { + self.completerBlock = completer + self.isLoding = isLoding + self.isToast = isToast + + if isLoding { + SPHUD.show() + } + + SPWalletAPI.requestPayTemplate(isToast: isToast) { [weak self] model in + guard let self = self else { return } + guard let model = model else { + if isLoding { + SPHUD.dismiss() + } + self.completerBlock?(nil) + return + } + self.oldTemplateModel = model + + var productIdArr: [String] = [] + model.list_sub_vip?.forEach { item in + productIdArr.append(SPIAPManager.manager.getProductId(templateId: item.ios_template_id) ?? "") + } + model.list_coins?.forEach { item in + productIdArr.append(SPIAPManager.manager.getProductId(templateId: item.ios_template_id) ?? "") + } + + let set = Set(productIdArr) + let productsRequest = SKProductsRequest(productIdentifiers: set) + productsRequest.delegate = self + productsRequest.start() + + } + } +} + +//MARK: -------------- SKProductsRequestDelegate -------------- +extension SPPayTemplateRequest: SKProductsRequestDelegate { + + func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) { + if isLoding { + SPHUD.dismiss() + } + + guard let templateModel = self.oldTemplateModel else { return } + let products = response.products + + var newCoinList: [SPPayTemplateItem] = [] + var newVipList: [SPPayTemplateItem] = [] + + templateModel.list_coins?.forEach { item in + let productId = SPIAPManager.manager.getProductId(templateId: item.ios_template_id) ?? "" + for product in products { + if productId == product.productIdentifier { + item.price = product.price.stringValue + item.currency = product.priceLocale.currencySymbol + newCoinList.append(item) + break + } + } + } + templateModel.list_sub_vip?.forEach { item in + let productId = SPIAPManager.manager.getProductId(templateId: item.ios_template_id) ?? "" + for product in products { + if productId == product.productIdentifier { + item.price = product.price.stringValue + item.currency = product.priceLocale.currencySymbol + newVipList.append(item) + break + } + } + } + templateModel.list_coins = newCoinList + templateModel.list_sub_vip = newVipList + + DispatchQueue.main.async { + self.completerBlock?(templateModel) + } + } +}