This commit is contained in:
湖北秦九 2026-01-13 15:04:43 +08:00
parent 008d5b55b8
commit 2a015361d9
11 changed files with 430 additions and 1 deletions

View File

@ -40,6 +40,7 @@
031FDEEA2EB35D2600F4CAC7 /* FACoinPackCanReceiveModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 031FDEE92EB35D2600F4CAC7 /* FACoinPackCanReceiveModel.swift */; }; 031FDEEA2EB35D2600F4CAC7 /* FACoinPackCanReceiveModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 031FDEE92EB35D2600F4CAC7 /* FACoinPackCanReceiveModel.swift */; };
031FDEEC2EB35DF600F4CAC7 /* FACoinsPackAlert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 031FDEEB2EB35DF600F4CAC7 /* FACoinsPackAlert.swift */; }; 031FDEEC2EB35DF600F4CAC7 /* FACoinsPackAlert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 031FDEEB2EB35DF600F4CAC7 /* FACoinsPackAlert.swift */; };
031FDEEE2EB3682000F4CAC7 /* FAVipRetainAlert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 031FDEED2EB3682000F4CAC7 /* FAVipRetainAlert.swift */; }; 031FDEEE2EB3682000F4CAC7 /* FAVipRetainAlert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 031FDEED2EB3682000F4CAC7 /* FAVipRetainAlert.swift */; };
035589332F161E6E00FAEF4A /* FAPayRetainAlert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 035589322F161E6E00FAEF4A /* FAPayRetainAlert.swift */; };
039CE6042EAA2621007B5EED /* AppDelegate+FAAdjust.swift in Sources */ = {isa = PBXBuildFile; fileRef = 039CE6032EAA2612007B5EED /* AppDelegate+FAAdjust.swift */; }; 039CE6042EAA2621007B5EED /* AppDelegate+FAAdjust.swift in Sources */ = {isa = PBXBuildFile; fileRef = 039CE6032EAA2612007B5EED /* AppDelegate+FAAdjust.swift */; };
039CE6092EAA2F71007B5EED /* FAAdjustStateManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 039CE6082EAA2F62007B5EED /* FAAdjustStateManager.swift */; }; 039CE6092EAA2F71007B5EED /* FAAdjustStateManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 039CE6082EAA2F62007B5EED /* FAAdjustStateManager.swift */; };
039CE60B2EAA31CB007B5EED /* FAStatAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 039CE60A2EAA31CB007B5EED /* FAStatAPI.swift */; }; 039CE60B2EAA31CB007B5EED /* FAStatAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 039CE60A2EAA31CB007B5EED /* FAStatAPI.swift */; };
@ -413,6 +414,7 @@
031FDEE92EB35D2600F4CAC7 /* FACoinPackCanReceiveModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FACoinPackCanReceiveModel.swift; sourceTree = "<group>"; }; 031FDEE92EB35D2600F4CAC7 /* FACoinPackCanReceiveModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FACoinPackCanReceiveModel.swift; sourceTree = "<group>"; };
031FDEEB2EB35DF600F4CAC7 /* FACoinsPackAlert.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FACoinsPackAlert.swift; sourceTree = "<group>"; }; 031FDEEB2EB35DF600F4CAC7 /* FACoinsPackAlert.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FACoinsPackAlert.swift; sourceTree = "<group>"; };
031FDEED2EB3682000F4CAC7 /* FAVipRetainAlert.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FAVipRetainAlert.swift; sourceTree = "<group>"; }; 031FDEED2EB3682000F4CAC7 /* FAVipRetainAlert.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FAVipRetainAlert.swift; sourceTree = "<group>"; };
035589322F161E6E00FAEF4A /* FAPayRetainAlert.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FAPayRetainAlert.swift; sourceTree = "<group>"; };
039CE6032EAA2612007B5EED /* AppDelegate+FAAdjust.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AppDelegate+FAAdjust.swift"; sourceTree = "<group>"; }; 039CE6032EAA2612007B5EED /* AppDelegate+FAAdjust.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AppDelegate+FAAdjust.swift"; sourceTree = "<group>"; };
039CE6082EAA2F62007B5EED /* FAAdjustStateManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FAAdjustStateManager.swift; sourceTree = "<group>"; }; 039CE6082EAA2F62007B5EED /* FAAdjustStateManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FAAdjustStateManager.swift; sourceTree = "<group>"; };
039CE60A2EAA31CB007B5EED /* FAStatAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FAStatAPI.swift; sourceTree = "<group>"; }; 039CE60A2EAA31CB007B5EED /* FAStatAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FAStatAPI.swift; sourceTree = "<group>"; };
@ -767,6 +769,7 @@
03E9A73D2EB460F2000D1067 /* FAApnsAlert.swift */, 03E9A73D2EB460F2000D1067 /* FAApnsAlert.swift */,
03E9A73F2EB49BE6000D1067 /* FAUpdatesAlert.swift */, 03E9A73F2EB49BE6000D1067 /* FAUpdatesAlert.swift */,
03E9A7472EB5D2CB000D1067 /* FALogoutAlert.swift */, 03E9A7472EB5D2CB000D1067 /* FALogoutAlert.swift */,
035589322F161E6E00FAEF4A /* FAPayRetainAlert.swift */,
); );
path = Alert; path = Alert;
sourceTree = "<group>"; sourceTree = "<group>";
@ -2370,6 +2373,7 @@
031FDEDC2EB3141E00F4CAC7 /* FASettingFooterView.swift in Sources */, 031FDEDC2EB3141E00F4CAC7 /* FASettingFooterView.swift in Sources */,
031FDEBE2EB0C99900F4CAC7 /* FANewVideoRechargeView.swift in Sources */, 031FDEBE2EB0C99900F4CAC7 /* FANewVideoRechargeView.swift in Sources */,
03E239932EAA1A29004A8CEC /* Date+FAAdd.swift in Sources */, 03E239932EAA1A29004A8CEC /* Date+FAAdd.swift in Sources */,
035589332F161E6E00FAEF4A /* FAPayRetainAlert.swift in Sources */,
031FDEDA2EB30D6E00F4CAC7 /* FASettingCell.swift in Sources */, 031FDEDA2EB30D6E00F4CAC7 /* FASettingCell.swift in Sources */,
03E239942EAA1A29004A8CEC /* UserDefaults+FAAdd.swift in Sources */, 03E239942EAA1A29004A8CEC /* UserDefaults+FAAdd.swift in Sources */,
039CE6322EAB796F007B5EED /* FALabel.swift in Sources */, 039CE6322EAB796F007B5EED /* FALabel.swift in Sources */,

View File

@ -0,0 +1,114 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "2600"
wasCreatedForAppExtension = "YES"
version = "2.0">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES"
buildArchitectures = "Automatic">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "03E9A76C2EC1950F000D1067"
BuildableName = "FAWidgetExtension.appex"
BlueprintName = "FAWidgetExtension"
ReferencedContainer = "container:Fableon.xcodeproj">
</BuildableReference>
</BuildActionEntry>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "F3F6B3Q1BI331E859340M109"
BuildableName = "Fableon.app"
BlueprintName = "Fableon"
ReferencedContainer = "container:Fableon.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
shouldAutocreateTestPlan = "YES">
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = ""
selectedLauncherIdentifier = "Xcode.IDEFoundation.Launcher.PosixSpawn"
launchStyle = "0"
askForAppToLaunch = "Yes"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES"
launchAutomaticallySubstyle = "2">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "F3F6B3Q1BI331E859340M109"
BuildableName = "Fableon.app"
BlueprintName = "Fableon"
ReferencedContainer = "container:Fableon.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
<EnvironmentVariables>
<EnvironmentVariable
key = "_XCWidgetKind"
value = ""
isEnabled = "YES">
</EnvironmentVariable>
<EnvironmentVariable
key = "_XCWidgetDefaultView"
value = "timeline"
isEnabled = "YES">
</EnvironmentVariable>
<EnvironmentVariable
key = "_XCWidgetFamily"
value = "systemMedium"
isEnabled = "YES">
</EnvironmentVariable>
</EnvironmentVariables>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES"
askForAppToLaunch = "Yes"
launchAutomaticallySubstyle = "2">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "F3F6B3Q1BI331E859340M109"
BuildableName = "Fableon.app"
BlueprintName = "Fableon"
ReferencedContainer = "container:Fableon.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>

View File

@ -0,0 +1,78 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "2600"
version = "1.7">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES"
buildArchitectures = "Automatic">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "F3F6B3Q1BI331E859340M109"
BuildableName = "Fableon.app"
BlueprintName = "Fableon"
ReferencedContainer = "container:Fableon.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
shouldAutocreateTestPlan = "YES">
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "F3F6B3Q1BI331E859340M109"
BuildableName = "Fableon.app"
BlueprintName = "Fableon"
ReferencedContainer = "container:Fableon.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "F3F6B3Q1BI331E859340M109"
BuildableName = "Fableon.app"
BlueprintName = "Fableon"
ReferencedContainer = "container:Fableon.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>

View File

@ -0,0 +1,97 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "2600"
wasCreatedForAppExtension = "YES"
version = "2.0">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES"
buildArchitectures = "Automatic">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "03E9A7562EC19101000D1067"
BuildableName = "NotificationService.appex"
BlueprintName = "NotificationService"
ReferencedContainer = "container:Fableon.xcodeproj">
</BuildableReference>
</BuildActionEntry>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "F3F6B3Q1BI331E859340M109"
BuildableName = "Fableon.app"
BlueprintName = "Fableon"
ReferencedContainer = "container:Fableon.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
shouldAutocreateTestPlan = "YES">
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = ""
selectedLauncherIdentifier = "Xcode.IDEFoundation.Launcher.PosixSpawn"
launchStyle = "0"
askForAppToLaunch = "Yes"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES"
launchAutomaticallySubstyle = "2">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "F3F6B3Q1BI331E859340M109"
BuildableName = "Fableon.app"
BlueprintName = "Fableon"
ReferencedContainer = "container:Fableon.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES"
askForAppToLaunch = "Yes"
launchAutomaticallySubstyle = "2">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "F3F6B3Q1BI331E859340M109"
BuildableName = "Fableon.app"
BlueprintName = "Fableon"
ReferencedContainer = "container:Fableon.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>

View File

@ -197,4 +197,21 @@ class FAStoreAPI: NSObject {
} }
} }
} }
///
static func requestPayRetainInfo(completer: ((_ model: FAPayAlertModel?) -> Void)?) {
FANetworkManager.manager.request(FABaseURL + "/payRetrieveSettings",
method: .get,
parameters: nil,
isLoding: true,
isToast: true,
) { (response: FANetworkManager.Response<FAPayAlertModel>) in
if let _ = response.data?.info {
completer?(response.data)
} else {
completer?(nil)
}
}
}
} }

View File

@ -201,7 +201,7 @@ extension FAShortDetailViewModel {
} }
view.didDismissHandle = { [weak self] in view.didDismissHandle = { [weak self] in
guard let self = self else { return } guard let self = self else { return }
self._showVipRetainAlert(videoInfo) self._showPayRetainAlert(videoInfo)
} }
view.present(in: nil) view.present(in: nil)
self.popView = view self.popView = view
@ -233,6 +233,26 @@ extension FAShortDetailViewModel {
view.show(in: FATool.keyWindow) view.show(in: FATool.keyWindow)
} }
} }
private func _showPayRetainAlert(_ videoInfo: FAVideoInfoModel) {
let view = FAPayRetainAlert()
view.show(in: FATool.keyWindow)
// payDataRequest = FAPayDataRequest()
// payDataRequest?.requestPayRetainInfo { [weak self] model in
// guard let self = self else { return }
// guard let model = model else { return }
// let view = FAVipRetainAlert()
// view.model = model
// view.videoInfo = videoInfo
// view.buyFinishHandle = { [weak self] in
// guard let self = self else { return }
// self.requestDetailData(indexPath: self.currentIndexPath, completer: nil)
// }
// view.show(in: FATool.keyWindow)
// }
}
} }
extension FAShortDetailViewModel { extension FAShortDetailViewModel {

View File

@ -0,0 +1,56 @@
//
// FAPayRetainAlert.swift
// Fableon
//
// Created by on 2026/1/13.
//
import UIKit
class FAPayRetainAlert: FABaseAlert {
private lazy var bgView: UIImageView = {
let imageView = UIImageView(image: UIImage(named: "pay_retain_bg_image"))
return imageView
}()
private lazy var titleLabel: UILabel = {
let label = UILabel()
return label
}()
override init(frame: CGRect) {
super.init(frame: frame)
fa_setupLayout()
}
@MainActor required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
extension FAPayRetainAlert {
private func fa_setupLayout() {
contentView.backgroundColor = .clear
contentView.layer.cornerRadius = 0
contentView.addSubview(bgView)
contentView.addSubview(titleLabel)
bgView.snp.makeConstraints { make in
make.edges.equalToSuperview()
}
titleLabel.snp.makeConstraints { make in
make.top.equalToSuperview().offset(160)
make.centerX.equalToSuperview()
make.right.lessThanOrEqualToSuperview().offset(-1)
}
}
}

View File

@ -104,6 +104,27 @@ class FAPayDataRequest: NSObject {
} }
} }
func requestPayRetainInfo(completer: ((_ model: FAPayAlertModel?) -> Void)?) {
self.completerBlock = nil
self.payAlertBlock = completer
FAStoreAPI.requestPayRetainInfo { [weak self] model in
guard let self = self else { return }
guard let model = model else {
self.payAlertBlock?(nil)
return
}
self.payAlertModel = model
let productId = FAIapManager.manager.getProductId(templateId: model.info?.ios_template_id) ?? ""
let set = Set([productId])
let productsRequest = SKProductsRequest(productIdentifiers: set)
productsRequest.delegate = self
productsRequest.start()
}
}
} }
//MARK: SKProductsRequestDelegate //MARK: SKProductsRequestDelegate

View File

@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "弹窗背景@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "弹窗背景@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 330 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 629 KiB