再次优化内购
This commit is contained in:
parent
c1ad644d81
commit
ab478455fd
@ -7,6 +7,7 @@
|
|||||||
objects = {
|
objects = {
|
||||||
|
|
||||||
/* Begin PBXBuildFile section */
|
/* 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 */; };
|
1BB91D102E04FD6A00A2C715 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1BB91BBD2E04FD6A00A2C715 /* AppDelegate.swift */; };
|
||||||
1BB91D112E04FD6A00A2C715 /* AppDelegate+APNS.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1BB91BBE2E04FD6A00A2C715 /* AppDelegate+APNS.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 */; };
|
1BB91D122E04FD6A00A2C715 /* AppDelegate+Config.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1BB91BBF2E04FD6A00A2C715 /* AppDelegate+Config.swift */; };
|
||||||
@ -316,6 +317,7 @@
|
|||||||
|
|
||||||
/* Begin PBXFileReference section */
|
/* 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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
1BB91BBF2E04FD6A00A2C715 /* AppDelegate+Config.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AppDelegate+Config.swift"; sourceTree = "<group>"; };
|
||||||
@ -1267,6 +1269,7 @@
|
|||||||
1BB91CC82E04FD6A00A2C715 /* SPIAPOrderModel.swift */,
|
1BB91CC82E04FD6A00A2C715 /* SPIAPOrderModel.swift */,
|
||||||
1BB91CC92E04FD6A00A2C715 /* SPIAPVerifyModel.swift */,
|
1BB91CC92E04FD6A00A2C715 /* SPIAPVerifyModel.swift */,
|
||||||
1BB91CCA2E04FD6A00A2C715 /* SPWaitRestoreModel.swift */,
|
1BB91CCA2E04FD6A00A2C715 /* SPWaitRestoreModel.swift */,
|
||||||
|
1B222BCE2E2B80DD002F5A68 /* SPPayTemplateRequest.swift */,
|
||||||
);
|
);
|
||||||
path = SPIAPManager;
|
path = SPIAPManager;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@ -1874,6 +1877,7 @@
|
|||||||
1BB91D872E04FD6A00A2C715 /* SPAboutUsViewController.swift in Sources */,
|
1BB91D872E04FD6A00A2C715 /* SPAboutUsViewController.swift in Sources */,
|
||||||
1BB91D882E04FD6A00A2C715 /* SPDeleteAccountViewController.swift in Sources */,
|
1BB91D882E04FD6A00A2C715 /* SPDeleteAccountViewController.swift in Sources */,
|
||||||
1BB91D892E04FD6A00A2C715 /* SPFeedbackViewController.swift in Sources */,
|
1BB91D892E04FD6A00A2C715 /* SPFeedbackViewController.swift in Sources */,
|
||||||
|
1B222BCF2E2B80DD002F5A68 /* SPPayTemplateRequest.swift in Sources */,
|
||||||
1BB91D8A2E04FD6A00A2C715 /* SPLanguageViewController.swift in Sources */,
|
1BB91D8A2E04FD6A00A2C715 /* SPLanguageViewController.swift in Sources */,
|
||||||
1BB91D8B2E04FD6A00A2C715 /* SPMineViewController.swift in Sources */,
|
1BB91D8B2E04FD6A00A2C715 /* SPMineViewController.swift in Sources */,
|
||||||
1BB91D8C2E04FD6A00A2C715 /* SPSettingsViewController.swift in Sources */,
|
1BB91D8C2E04FD6A00A2C715 /* SPSettingsViewController.swift in Sources */,
|
||||||
|
@ -16,75 +16,18 @@ class SPWalletAPI: NSObject {
|
|||||||
///获取支付模版
|
///获取支付模版
|
||||||
static func requestPayTemplate(isLoding: Bool = false, isToast: Bool = true, completer: ((_ model: SPPayTemplateModel?) -> Void)?) {
|
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")
|
var param = SPNetworkParameters(path: "/paySettingsV3")
|
||||||
param.method = .get
|
param.method = .get
|
||||||
param.isToast = isToast
|
param.isToast = isToast
|
||||||
|
param.isLoding = false
|
||||||
|
|
||||||
SPNetwork.request(parameters: param) { (response: SPNetworkResponse<SPPayTemplateModel>) in
|
SPNetwork.request(parameters: param) { (response: SPNetworkResponse<SPPayTemplateModel>) in
|
||||||
completer?(response.data)
|
completer?(response.data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
///创建内购订单
|
///创建内购订单
|
||||||
static func requestCreateOrder(payId: String, shortPlayId: String, videoId: String, completer: ((_ orderModel: SPIAPOrderModel?) -> Void)?) {
|
static func requestCreateOrder(payId: String, shortPlayId: String, videoId: String, completer: ((_ orderModel: SPIAPOrderModel?) -> Void)?) {
|
||||||
var param = SPNetworkParameters(path: "/createOrder")
|
var param = SPNetworkParameters(path: "/createOrder")
|
||||||
|
@ -28,6 +28,8 @@ class SPMineViewController: SPViewController {
|
|||||||
private var needShowRewardedAd: Bool = false
|
private var needShowRewardedAd: Bool = false
|
||||||
|
|
||||||
weak var vipAlertView: SPVipAlertView?
|
weak var vipAlertView: SPVipAlertView?
|
||||||
|
|
||||||
|
private var payTemplateRequest: SPPayTemplateRequest?
|
||||||
//MARK: UI 属性
|
//MARK: UI 属性
|
||||||
private lazy var headerView: SPMineHeaderView = {
|
private lazy var headerView: SPMineHeaderView = {
|
||||||
let view = SPMineHeaderView()
|
let view = SPMineHeaderView()
|
||||||
@ -101,7 +103,10 @@ extension SPMineViewController {
|
|||||||
guard SPLoginManager.manager.userInfo?.is_vip != true else { return }
|
guard SPLoginManager.manager.userInfo?.is_vip != true else { return }
|
||||||
guard SPVipAlertView.isShowAlert 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 }
|
guard let list = model?.list_sub_vip, list.count > 0 else { return }
|
||||||
if !self.isDidAppear { return }
|
if !self.isDidAppear { return }
|
||||||
if self.vipAlertView != nil { return }
|
if self.vipAlertView != nil { return }
|
||||||
|
@ -24,6 +24,8 @@ class SPPlayBuyView: HWPanModalContentView {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private var payTemplateRequest: SPPayTemplateRequest?
|
||||||
|
|
||||||
//MARK: UI属性
|
//MARK: UI属性
|
||||||
private lazy var bgView: UIImageView = {
|
private lazy var bgView: UIImageView = {
|
||||||
let view = UIImageView(image: UIImage(named: "buy_bg_image_01"))
|
let view = UIImageView(image: UIImage(named: "buy_bg_image_01"))
|
||||||
@ -246,27 +248,28 @@ extension SPPlayBuyView {
|
|||||||
|
|
||||||
///请求支付模版
|
///请求支付模版
|
||||||
private func requestPayTemplate() {
|
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 }
|
guard let self = self else { return }
|
||||||
self.stackView.removeAllArrangedSubview()
|
self.stackView.removeAllArrangedSubview()
|
||||||
|
|
||||||
if let sort = templateModel?.sort, sort.count > 0 {
|
if let sort = model?.sort, sort.count > 0 {
|
||||||
sort.forEach {
|
sort.forEach {
|
||||||
if $0 == .vip {
|
if $0 == .vip {
|
||||||
self.addMemberView(list: templateModel?.list_sub_vip)
|
self.addMemberView(list: model?.list_sub_vip)
|
||||||
} else if $0 == .coin {
|
} else if $0 == .coin {
|
||||||
self.addCoinView(list: templateModel?.list_coins)
|
self.addCoinView(list: model?.list_coins)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
self.addMemberView(list: templateModel?.list_sub_vip)
|
self.addMemberView(list: model?.list_sub_vip)
|
||||||
self.addCoinView(list: templateModel?.list_coins)
|
self.addCoinView(list: model?.list_coins)
|
||||||
}
|
}
|
||||||
|
|
||||||
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
|
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
|
||||||
self.panModalSetNeedsLayoutUpdate()
|
self.panModalSetNeedsLayoutUpdate()
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9,6 +9,8 @@ import UIKit
|
|||||||
|
|
||||||
class SPStoreViewController: SPViewController {
|
class SPStoreViewController: SPViewController {
|
||||||
|
|
||||||
|
private var payTemplateRequest: SPPayTemplateRequest?
|
||||||
|
|
||||||
//MARK: UI属性
|
//MARK: UI属性
|
||||||
private lazy var scrollView: SPScrollView = {
|
private lazy var scrollView: SPScrollView = {
|
||||||
let scrollView = SPScrollView()
|
let scrollView = SPScrollView()
|
||||||
@ -184,21 +186,23 @@ extension SPStoreViewController {
|
|||||||
|
|
||||||
///请求支付模版
|
///请求支付模版
|
||||||
private func requestPayTemplate() {
|
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 }
|
guard let self = self else { return }
|
||||||
self.stackView.removeAllArrangedSubview()
|
self.stackView.removeAllArrangedSubview()
|
||||||
|
|
||||||
if let sort = templateModel?.sort, sort.count > 0 {
|
if let sort = model?.sort, sort.count > 0 {
|
||||||
sort.forEach {
|
sort.forEach {
|
||||||
if $0 == .vip {
|
if $0 == .vip {
|
||||||
self.addMemberView(list: templateModel?.list_sub_vip)
|
self.addMemberView(list: model?.list_sub_vip)
|
||||||
} else if $0 == .coin {
|
} else if $0 == .coin {
|
||||||
self.addCoinView(list: templateModel?.list_coins)
|
self.addCoinView(list: model?.list_coins)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
self.addMemberView(list: templateModel?.list_sub_vip)
|
self.addMemberView(list: model?.list_sub_vip)
|
||||||
self.addCoinView(list: templateModel?.list_coins)
|
self.addCoinView(list: model?.list_coins)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
101
ThimraTV/Libs/SPIAPManager/SPPayTemplateRequest.swift
Normal file
101
ThimraTV/Libs/SPIAPManager/SPPayTemplateRequest.swift
Normal 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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user