再次优化内购

This commit is contained in:
zeng 2025-07-19 15:39:24 +08:00
parent c1ad644d81
commit ab478455fd
6 changed files with 134 additions and 74 deletions

View File

@ -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 = "<group>"; };
1B222BCE2E2B80DD002F5A68 /* SPPayTemplateRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SPPayTemplateRequest.swift; sourceTree = "<group>"; };
1BB91BBD2E04FD6A00A2C715 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
1BB91BBE2E04FD6A00A2C715 /* AppDelegate+APNS.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AppDelegate+APNS.swift"; sourceTree = "<group>"; };
1BB91BBF2E04FD6A00A2C715 /* AppDelegate+Config.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AppDelegate+Config.swift"; sourceTree = "<group>"; };
@ -1267,6 +1269,7 @@
1BB91CC82E04FD6A00A2C715 /* SPIAPOrderModel.swift */,
1BB91CC92E04FD6A00A2C715 /* SPIAPVerifyModel.swift */,
1BB91CCA2E04FD6A00A2C715 /* SPWaitRestoreModel.swift */,
1B222BCE2E2B80DD002F5A68 /* SPPayTemplateRequest.swift */,
);
path = SPIAPManager;
sourceTree = "<group>";
@ -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 */,

View File

@ -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<SPPayTemplateModel>) in
completer?(response.data)
}
}
///
static func requestCreateOrder(payId: String, shortPlayId: String, videoId: String, completer: ((_ orderModel: SPIAPOrderModel?) -> Void)?) {
var param = SPNetworkParameters(path: "/createOrder")

View File

@ -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 }

View File

@ -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()
}
}
}

View File

@ -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)
}
}
}

View File

@ -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)
}
}
}