From e0163dabe3d32cac46204442e4e6eb6557ecbbdf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B9=96=E5=8C=97=E7=A7=A6=E4=B9=9D?= Date: Fri, 31 Oct 2025 13:36:20 +0800 Subject: [PATCH] 1 --- Fableon.xcodeproj/project.pbxproj | 159 ++++++++- Fableon/App/AppDelegate+FAAdjust.swift | 2 +- Fableon/App/AppDelegate+FAApns.swift | 123 +++++++ Fableon/App/AppDelegate+FAConfig.swift | 6 + Fableon/App/AppDelegate.swift | 3 + Fableon/App/SceneDelegate.swift | 43 ++- Fableon/Fableon.entitlements | 6 + .../Base/Define/FAUserDefaultsKey.swift | 2 + .../Object/Base/Extension/Date+FAAdd.swift | 2 +- Fableon/Object/Base/Request/FAAPI/FAAPI.swift | 29 ++ .../Object/Base/Request/FAAPI/FAStatAPI.swift | 93 ++++++ .../Base/Request/FAAPI/FAStoreAPI.swift | 66 ++++ Fableon/Object/Base/Request/FAAPIPath.swift | 3 + .../Base/Request/FANetworkManager.swift | 3 +- .../Base/WebView/FAAppWebViewController.swift | 5 +- .../FABaseWebViewController+Script.swift | 8 +- Fableon/Object/Base/WebView/FAWebView.swift | 1 + .../Class/Home/C/FAHomeViewController.swift | 37 +++ .../Class/Home/V/FAHomeCoinsPackButton.swift | 50 +++ .../Class/Me/C/FACoinPackViewController.swift | 216 ++++++++++++ .../Class/Me/C/FAMeListViewController.swift | 3 +- .../Class/Me/C/FASettingViewController.swift | 73 ++++- Fableon/Object/Class/Me/M/FAMeItemModel.swift | 1 + .../Class/Me/V/FACoinPackHeaderView.swift | 266 +++++++++++++++ .../Class/Me/V/FACoinPackTitleView.swift | 91 ++++++ .../Class/Me/V/FACoinsPackBuyView.swift | 112 +++++++ .../Class/Me/V/FACoinsPackClaimListCell.swift | 280 ++++++++++++++++ .../Class/Me/V/FACoinsPackClaimListView.swift | 106 ++++++ Fableon/Object/Class/Me/V/FALoginView.swift | 121 +++++++ .../Class/Me/V/FAMeCoinsPackButton.swift | 95 ++++++ .../Object/Class/Me/V/FAMeHeaderView.swift | 46 ++- Fableon/Object/Class/Me/V/FASettingCell.swift | 26 ++ Fableon/Object/Class/Me/V/FASettingCell.xib | 72 ++++ .../Class/Me/V/FASettingFooterView.swift | 48 +++ .../MyShort/C/FACollectViewController.swift | 25 +- .../Class/Player/V/FAEpSelectorView.swift | 16 +- .../Player/V/FAOldVideoRechargeView.swift | 40 ++- .../Player/VM/FAShortDetailViewModel.swift | 23 ++ .../Store/M/FACoinPackCanReceiveModel.swift | 13 + .../Class/Store/M/FACoinsPackModel.swift | 25 ++ .../Store/M/FACoinsPackReceiveModel.swift | 25 ++ .../FAAdjustStateManager.swift | 5 +- Fableon/Object/Libs/Alert/FAApnsAlert.swift | 104 ++++++ Fableon/Object/Libs/Alert/FABaseAlert.swift | 169 ++++++++++ .../Object/Libs/Alert/FACoinsPackAlert.swift | 117 +++++++ .../Libs/Alert/FARemoveCollectAlert.swift | 93 ++++++ .../Object/Libs/Alert/FAVipRetainAlert.swift | 307 ++++++++++++++++++ .../Object/Libs/FAIap/FAPayDataRequest.swift | 32 +- .../Object/Libs/FALogin/FALogin+Apple.swift | 115 +++++++ .../Libs/FALogin/FALogin+Facebook.swift | 58 ++++ Fableon/Object/Libs/FALogin/FALogin.swift | 73 +++++ .../Libs/FALogin/FAThirdSignModel.swift | 23 ++ Fableon/Object/Libs/FATool/FATool.swift | 39 +++ .../color/#404040.colorset/Contents.json | 20 ++ .../color/#629DFA.colorset/Contents.json | 20 ++ .../color/#6D6D6D.colorset/Contents.json | 20 ++ .../color/#BCBCBC.colorset/Contents.json | 20 ++ .../color/#DFEFFF.colorset/Contents.json | 20 ++ .../color/#F6CF87.colorset/Contents.json | 20 ++ .../color/#FFFEE9.colorset/Contents.json | 20 ++ .../Group 2072750470.imageset/Contents.json | 22 ++ .../Group 2072750470.imageset/浮窗@2x.png | Bin 0 -> 31379 bytes .../Group 2072750470.imageset/浮窗@3x.png | Bin 0 -> 62612 bytes .../image/__magnifying.imageset/Contents.json | 22 ++ .../__magnifying.imageset/__magnifying@2x.png | Bin 0 -> 39957 bytes .../__magnifying.imageset/__magnifying@3x.png | Bin 0 -> 64172 bytes .../alert_image_01.imageset/Contents.json | 22 ++ .../__to remove 1@2x.png | Bin 0 -> 29235 bytes .../__to remove 1@3x.png | Bin 0 -> 46435 bytes .../apple_logo_icon_01.imageset/Contents.json | 22 ++ .../apple_logo_icon_01.imageset/Vector@2x.png | Bin 0 -> 696 bytes .../apple_logo_icon_01.imageset/Vector@3x.png | Bin 0 -> 994 bytes .../image/arrow.imageset/Contents.json | 22 ++ .../image/arrow.imageset/arrow@2x.png | Bin 0 -> 399 bytes .../image/arrow.imageset/arrow@3x.png | Bin 0 -> 537 bytes .../close_icon_03.imageset/Contents.json | 22 ++ .../close_icon_03.imageset/关闭按钮@2x.png | Bin 0 -> 1381 bytes .../close_icon_03.imageset/关闭按钮@3x.png | Bin 0 -> 1955 bytes ...3390209096846c76-uqCzGu_fw240webp 1@2x.png | Bin 0 -> 45948 bytes ...3390209096846c76-uqCzGu_fw240webp 1@3x.png | Bin 0 -> 90269 bytes .../coin_attachment_03.imageset/Contents.json | 22 ++ .../coin_attachment_04.imageset/Contents.json | 22 ++ .../Ellipse 2325@2x.png | Bin 0 -> 169874 bytes .../Ellipse 2325@3x.png | Bin 0 -> 352373 bytes .../coin_attachment_05.imageset/Contents.json | 22 ++ .../Ellipse 2326@2x.png | Bin 0 -> 124367 bytes .../Ellipse 2326@3x.png | Bin 0 -> 269451 bytes .../coins_icon_09.imageset/Contents.json | 22 ++ .../image/coins_icon_09.imageset/金币@2x.png | Bin 0 -> 3371 bytes .../image/coins_icon_09.imageset/金币@3x.png | Bin 0 -> 6636 bytes .../coins_icon_10.imageset/Contents.json | 22 ++ .../image/coins_icon_10.imageset/金币@2x.png | Bin 0 -> 5393 bytes .../image/coins_icon_10.imageset/金币@3x.png | Bin 0 -> 10878 bytes .../Contents.json | 22 ++ .../Vector@2x 2.png | Bin 0 -> 804 bytes .../Vector@3x 2.png | Bin 0 -> 1093 bytes .../logo_image_02.imageset/Contents.json | 22 ++ .../logo_image_02.imageset/Group 2414@2x.png | Bin 0 -> 13751 bytes .../logo_image_02.imageset/Group 2414@3x.png | Bin 0 -> 24773 bytes .../image/按钮.imageset/Contents.json | 22 ++ .../image/按钮.imageset/按钮@2x.png | Bin 0 -> 7473 bytes .../image/按钮.imageset/按钮@3x.png | Bin 0 -> 14806 bytes .../image/查看图片 25.imageset/Contents.json | 22 ++ .../Group 2072750462@2x.png | Bin 0 -> 211416 bytes .../Group 2072750462@3x.png | Bin 0 -> 416563 bytes .../image/横间隔虚线.imageset/Contents.json | 22 ++ .../横间隔虚线.imageset/横间隔虚线@2x.png | Bin 0 -> 250 bytes .../横间隔虚线.imageset/横间隔虚线@3x.png | Bin 0 -> 308 bytes .../image/皇冠-金.imageset/Contents.json | 22 ++ .../image/皇冠-金.imageset/皇冠-金@2x.png | Bin 0 -> 3704 bytes .../image/皇冠-金.imageset/皇冠-金@3x.png | Bin 0 -> 6933 bytes .../image/礼物11.imageset/Contents.json | 22 ++ .../image/礼物11.imageset/礼物11@2x.png | Bin 0 -> 11023 bytes .../image/礼物11.imageset/礼物11@3x.png | Bin 0 -> 21505 bytes .../image/签到.imageset/Contents.json | 22 ++ .../image/签到.imageset/签到@2x.png | Bin 0 -> 64453 bytes .../image/签到.imageset/签到@3x.png | Bin 0 -> 123222 bytes .../image/间隔线.imageset/Contents.json | 22 ++ .../image/间隔线.imageset/间隔线@2x.png | Bin 0 -> 144 bytes .../image/间隔线.imageset/间隔线@3x.png | Bin 0 -> 158 bytes Fableon/Source/GoogleService-Info.plist | 30 ++ Fableon/Source/Info.plist | 16 + Fableon/Source/en.lproj/Localizable.strings | 39 +++ 123 files changed, 4118 insertions(+), 46 deletions(-) create mode 100644 Fableon/App/AppDelegate+FAApns.swift create mode 100644 Fableon/Object/Class/Home/V/FAHomeCoinsPackButton.swift create mode 100644 Fableon/Object/Class/Me/C/FACoinPackViewController.swift create mode 100644 Fableon/Object/Class/Me/V/FACoinPackHeaderView.swift create mode 100644 Fableon/Object/Class/Me/V/FACoinPackTitleView.swift create mode 100644 Fableon/Object/Class/Me/V/FACoinsPackBuyView.swift create mode 100644 Fableon/Object/Class/Me/V/FACoinsPackClaimListCell.swift create mode 100644 Fableon/Object/Class/Me/V/FACoinsPackClaimListView.swift create mode 100644 Fableon/Object/Class/Me/V/FALoginView.swift create mode 100644 Fableon/Object/Class/Me/V/FAMeCoinsPackButton.swift create mode 100644 Fableon/Object/Class/Me/V/FASettingCell.swift create mode 100644 Fableon/Object/Class/Me/V/FASettingCell.xib create mode 100644 Fableon/Object/Class/Me/V/FASettingFooterView.swift create mode 100644 Fableon/Object/Class/Store/M/FACoinPackCanReceiveModel.swift create mode 100644 Fableon/Object/Class/Store/M/FACoinsPackModel.swift create mode 100644 Fableon/Object/Class/Store/M/FACoinsPackReceiveModel.swift create mode 100644 Fableon/Object/Libs/Alert/FAApnsAlert.swift create mode 100644 Fableon/Object/Libs/Alert/FABaseAlert.swift create mode 100644 Fableon/Object/Libs/Alert/FACoinsPackAlert.swift create mode 100644 Fableon/Object/Libs/Alert/FARemoveCollectAlert.swift create mode 100644 Fableon/Object/Libs/Alert/FAVipRetainAlert.swift create mode 100644 Fableon/Object/Libs/FALogin/FALogin+Apple.swift create mode 100644 Fableon/Object/Libs/FALogin/FALogin+Facebook.swift create mode 100644 Fableon/Object/Libs/FALogin/FAThirdSignModel.swift create mode 100644 Fableon/Source/Assets.xcassets/color/#404040.colorset/Contents.json create mode 100644 Fableon/Source/Assets.xcassets/color/#629DFA.colorset/Contents.json create mode 100644 Fableon/Source/Assets.xcassets/color/#6D6D6D.colorset/Contents.json create mode 100644 Fableon/Source/Assets.xcassets/color/#BCBCBC.colorset/Contents.json create mode 100644 Fableon/Source/Assets.xcassets/color/#DFEFFF.colorset/Contents.json create mode 100644 Fableon/Source/Assets.xcassets/color/#F6CF87.colorset/Contents.json create mode 100644 Fableon/Source/Assets.xcassets/color/#FFFEE9.colorset/Contents.json create mode 100644 Fableon/Source/Assets.xcassets/image/Group 2072750470.imageset/Contents.json create mode 100644 Fableon/Source/Assets.xcassets/image/Group 2072750470.imageset/浮窗@2x.png create mode 100644 Fableon/Source/Assets.xcassets/image/Group 2072750470.imageset/浮窗@3x.png create mode 100644 Fableon/Source/Assets.xcassets/image/__magnifying.imageset/Contents.json create mode 100644 Fableon/Source/Assets.xcassets/image/__magnifying.imageset/__magnifying@2x.png create mode 100644 Fableon/Source/Assets.xcassets/image/__magnifying.imageset/__magnifying@3x.png create mode 100644 Fableon/Source/Assets.xcassets/image/alert_image_01.imageset/Contents.json create mode 100644 Fableon/Source/Assets.xcassets/image/alert_image_01.imageset/__to remove 1@2x.png create mode 100644 Fableon/Source/Assets.xcassets/image/alert_image_01.imageset/__to remove 1@3x.png create mode 100644 Fableon/Source/Assets.xcassets/image/apple_logo_icon_01.imageset/Contents.json create mode 100644 Fableon/Source/Assets.xcassets/image/apple_logo_icon_01.imageset/Vector@2x.png create mode 100644 Fableon/Source/Assets.xcassets/image/apple_logo_icon_01.imageset/Vector@3x.png create mode 100644 Fableon/Source/Assets.xcassets/image/arrow.imageset/Contents.json create mode 100644 Fableon/Source/Assets.xcassets/image/arrow.imageset/arrow@2x.png create mode 100644 Fableon/Source/Assets.xcassets/image/arrow.imageset/arrow@3x.png create mode 100644 Fableon/Source/Assets.xcassets/image/close_icon_03.imageset/Contents.json create mode 100644 Fableon/Source/Assets.xcassets/image/close_icon_03.imageset/关闭按钮@2x.png create mode 100644 Fableon/Source/Assets.xcassets/image/close_icon_03.imageset/关闭按钮@3x.png create mode 100644 Fableon/Source/Assets.xcassets/image/coin_attachment_03.imageset/90ad09d41707261a78f7b0c4f06813390209096846c76-uqCzGu_fw240webp 1@2x.png create mode 100644 Fableon/Source/Assets.xcassets/image/coin_attachment_03.imageset/90ad09d41707261a78f7b0c4f06813390209096846c76-uqCzGu_fw240webp 1@3x.png create mode 100644 Fableon/Source/Assets.xcassets/image/coin_attachment_03.imageset/Contents.json create mode 100644 Fableon/Source/Assets.xcassets/image/coin_attachment_04.imageset/Contents.json create mode 100644 Fableon/Source/Assets.xcassets/image/coin_attachment_04.imageset/Ellipse 2325@2x.png create mode 100644 Fableon/Source/Assets.xcassets/image/coin_attachment_04.imageset/Ellipse 2325@3x.png create mode 100644 Fableon/Source/Assets.xcassets/image/coin_attachment_05.imageset/Contents.json create mode 100644 Fableon/Source/Assets.xcassets/image/coin_attachment_05.imageset/Ellipse 2326@2x.png create mode 100644 Fableon/Source/Assets.xcassets/image/coin_attachment_05.imageset/Ellipse 2326@3x.png create mode 100644 Fableon/Source/Assets.xcassets/image/coins_icon_09.imageset/Contents.json create mode 100644 Fableon/Source/Assets.xcassets/image/coins_icon_09.imageset/金币@2x.png create mode 100644 Fableon/Source/Assets.xcassets/image/coins_icon_09.imageset/金币@3x.png create mode 100644 Fableon/Source/Assets.xcassets/image/coins_icon_10.imageset/Contents.json create mode 100644 Fableon/Source/Assets.xcassets/image/coins_icon_10.imageset/金币@2x.png create mode 100644 Fableon/Source/Assets.xcassets/image/coins_icon_10.imageset/金币@3x.png create mode 100644 Fableon/Source/Assets.xcassets/image/facebook_logo_icon_01.imageset/Contents.json create mode 100644 Fableon/Source/Assets.xcassets/image/facebook_logo_icon_01.imageset/Vector@2x 2.png create mode 100644 Fableon/Source/Assets.xcassets/image/facebook_logo_icon_01.imageset/Vector@3x 2.png create mode 100644 Fableon/Source/Assets.xcassets/image/logo_image_02.imageset/Contents.json create mode 100644 Fableon/Source/Assets.xcassets/image/logo_image_02.imageset/Group 2414@2x.png create mode 100644 Fableon/Source/Assets.xcassets/image/logo_image_02.imageset/Group 2414@3x.png create mode 100644 Fableon/Source/Assets.xcassets/image/按钮.imageset/Contents.json create mode 100644 Fableon/Source/Assets.xcassets/image/按钮.imageset/按钮@2x.png create mode 100644 Fableon/Source/Assets.xcassets/image/按钮.imageset/按钮@3x.png create mode 100644 Fableon/Source/Assets.xcassets/image/查看图片 25.imageset/Contents.json create mode 100644 Fableon/Source/Assets.xcassets/image/查看图片 25.imageset/Group 2072750462@2x.png create mode 100644 Fableon/Source/Assets.xcassets/image/查看图片 25.imageset/Group 2072750462@3x.png create mode 100644 Fableon/Source/Assets.xcassets/image/横间隔虚线.imageset/Contents.json create mode 100644 Fableon/Source/Assets.xcassets/image/横间隔虚线.imageset/横间隔虚线@2x.png create mode 100644 Fableon/Source/Assets.xcassets/image/横间隔虚线.imageset/横间隔虚线@3x.png create mode 100644 Fableon/Source/Assets.xcassets/image/皇冠-金.imageset/Contents.json create mode 100644 Fableon/Source/Assets.xcassets/image/皇冠-金.imageset/皇冠-金@2x.png create mode 100644 Fableon/Source/Assets.xcassets/image/皇冠-金.imageset/皇冠-金@3x.png create mode 100644 Fableon/Source/Assets.xcassets/image/礼物11.imageset/Contents.json create mode 100644 Fableon/Source/Assets.xcassets/image/礼物11.imageset/礼物11@2x.png create mode 100644 Fableon/Source/Assets.xcassets/image/礼物11.imageset/礼物11@3x.png create mode 100644 Fableon/Source/Assets.xcassets/image/签到.imageset/Contents.json create mode 100644 Fableon/Source/Assets.xcassets/image/签到.imageset/签到@2x.png create mode 100644 Fableon/Source/Assets.xcassets/image/签到.imageset/签到@3x.png create mode 100644 Fableon/Source/Assets.xcassets/image/间隔线.imageset/Contents.json create mode 100644 Fableon/Source/Assets.xcassets/image/间隔线.imageset/间隔线@2x.png create mode 100644 Fableon/Source/Assets.xcassets/image/间隔线.imageset/间隔线@3x.png create mode 100644 Fableon/Source/GoogleService-Info.plist diff --git a/Fableon.xcodeproj/project.pbxproj b/Fableon.xcodeproj/project.pbxproj index 73b94e6..d2428a9 100644 --- a/Fableon.xcodeproj/project.pbxproj +++ b/Fableon.xcodeproj/project.pbxproj @@ -17,6 +17,29 @@ 031FDEBA2EB0B82600F4CAC7 /* FACoinPackConfirmItem2View.swift in Sources */ = {isa = PBXBuildFile; fileRef = 031FDEB92EB0B82600F4CAC7 /* FACoinPackConfirmItem2View.swift */; }; 031FDEBC2EB0C97A00F4CAC7 /* FAOldVideoRechargeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 031FDEBB2EB0C97A00F4CAC7 /* FAOldVideoRechargeView.swift */; }; 031FDEBE2EB0C99900F4CAC7 /* FANewVideoRechargeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 031FDEBD2EB0C99900F4CAC7 /* FANewVideoRechargeView.swift */; }; + 031FDEC02EB1C08900F4CAC7 /* FAMeCoinsPackButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 031FDEBF2EB1C08900F4CAC7 /* FAMeCoinsPackButton.swift */; }; + 031FDEC22EB1E19D00F4CAC7 /* FACoinPackViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 031FDEC12EB1E19D00F4CAC7 /* FACoinPackViewController.swift */; }; + 031FDEC42EB1E45300F4CAC7 /* FACoinPackHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 031FDEC32EB1E45300F4CAC7 /* FACoinPackHeaderView.swift */; }; + 031FDEC62EB1E4E600F4CAC7 /* FACoinPackTitleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 031FDEC52EB1E4E600F4CAC7 /* FACoinPackTitleView.swift */; }; + 031FDEC82EB1F89F00F4CAC7 /* FACoinsPackModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 031FDEC72EB1F89F00F4CAC7 /* FACoinsPackModel.swift */; }; + 031FDECA2EB1F8F200F4CAC7 /* FACoinsPackReceiveModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 031FDEC92EB1F8F200F4CAC7 /* FACoinsPackReceiveModel.swift */; }; + 031FDECC2EB1FDF500F4CAC7 /* FACoinsPackClaimListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 031FDECB2EB1FDF500F4CAC7 /* FACoinsPackClaimListView.swift */; }; + 031FDECE2EB2006000F4CAC7 /* FACoinsPackClaimListCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 031FDECD2EB2006000F4CAC7 /* FACoinsPackClaimListCell.swift */; }; + 031FDED02EB2167200F4CAC7 /* FACoinsPackBuyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 031FDECF2EB2167200F4CAC7 /* FACoinsPackBuyView.swift */; }; + 031FDED22EB2F69200F4CAC7 /* FALoginView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 031FDED12EB2F69200F4CAC7 /* FALoginView.swift */; }; + 031FDED42EB2FF4000F4CAC7 /* FALogin+Apple.swift in Sources */ = {isa = PBXBuildFile; fileRef = 031FDED32EB2FF3A00F4CAC7 /* FALogin+Apple.swift */; }; + 031FDED62EB300F400F4CAC7 /* FAThirdSignModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 031FDED52EB300F400F4CAC7 /* FAThirdSignModel.swift */; }; + 031FDED92EB30D6E00F4CAC7 /* FASettingCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 031FDED82EB30D6E00F4CAC7 /* FASettingCell.xib */; }; + 031FDEDA2EB30D6E00F4CAC7 /* FASettingCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 031FDED72EB30D6E00F4CAC7 /* FASettingCell.swift */; }; + 031FDEDC2EB3141E00F4CAC7 /* FASettingFooterView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 031FDEDB2EB3141E00F4CAC7 /* FASettingFooterView.swift */; }; + 031FDEDF2EB3423000F4CAC7 /* FacebookLogin in Frameworks */ = {isa = PBXBuildFile; productRef = 031FDEDE2EB3423000F4CAC7 /* FacebookLogin */; }; + 031FDEE12EB344AB00F4CAC7 /* FALogin+Facebook.swift in Sources */ = {isa = PBXBuildFile; fileRef = 031FDEE02EB344A200F4CAC7 /* FALogin+Facebook.swift */; }; + 031FDEE42EB348AA00F4CAC7 /* FABaseAlert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 031FDEE32EB348AA00F4CAC7 /* FABaseAlert.swift */; }; + 031FDEE62EB34FBC00F4CAC7 /* FARemoveCollectAlert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 031FDEE52EB34FBC00F4CAC7 /* FARemoveCollectAlert.swift */; }; + 031FDEE82EB358AE00F4CAC7 /* FAHomeCoinsPackButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 031FDEE72EB358AE00F4CAC7 /* FAHomeCoinsPackButton.swift */; }; + 031FDEEA2EB35D2600F4CAC7 /* FACoinPackCanReceiveModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 031FDEE92EB35D2600F4CAC7 /* FACoinPackCanReceiveModel.swift */; }; + 031FDEEC2EB35DF600F4CAC7 /* FACoinsPackAlert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 031FDEEB2EB35DF600F4CAC7 /* FACoinsPackAlert.swift */; }; + 031FDEEE2EB3682000F4CAC7 /* FAVipRetainAlert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 031FDEED2EB3682000F4CAC7 /* FAVipRetainAlert.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 */; }; 039CE60B2EAA31CB007B5EED /* FAStatAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 039CE60A2EAA31CB007B5EED /* FAStatAPI.swift */; }; @@ -189,6 +212,11 @@ 03E23AB72EAA1A7F004A8CEC /* FALocalized.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03E23A9C2EAA1A7F004A8CEC /* FALocalized.swift */; }; 03E23AB82EAA1A7F004A8CEC /* FAWaterfallFlowLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03E23AAA2EAA1A7F004A8CEC /* FAWaterfallFlowLayout.swift */; }; 03E23ABA2EAA1D85004A8CEC /* MNNItemController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03E23AB92EAA1D85004A8CEC /* MNNItemController.swift */; }; + 03E9A7362EB44F26000D1067 /* FirebaseMessaging in Frameworks */ = {isa = PBXBuildFile; productRef = 03E9A7352EB44F26000D1067 /* FirebaseMessaging */; }; + 03E9A7382EB44F26000D1067 /* FirebasePerformance in Frameworks */ = {isa = PBXBuildFile; productRef = 03E9A7372EB44F26000D1067 /* FirebasePerformance */; }; + 03E9A73A2EB45154000D1067 /* AppDelegate+FAApns.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03E9A7392EB45149000D1067 /* AppDelegate+FAApns.swift */; }; + 03E9A73C2EB45507000D1067 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 03E9A73B2EB45507000D1067 /* GoogleService-Info.plist */; }; + 03E9A73E2EB460F2000D1067 /* FAApnsAlert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03E9A73D2EB460F2000D1067 /* FAApnsAlert.swift */; }; B86XD3O90WO2R4725L084287 /* Pods_Fableon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C4THBP0A1283PFXW440071Q5 /* Pods_Fableon.framework */; }; F3019606DA7P36H41G408X13 /* ZStreamCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F38E33739F391364D0151P7Z /* ZStreamCell.swift */; }; F30470W590T8274E1642349G /* CControlCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F32MR5F8X6Q3HSZ560BD0159 /* CControlCell.swift */; }; @@ -306,6 +334,28 @@ 031FDEB92EB0B82600F4CAC7 /* FACoinPackConfirmItem2View.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FACoinPackConfirmItem2View.swift; sourceTree = ""; }; 031FDEBB2EB0C97A00F4CAC7 /* FAOldVideoRechargeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FAOldVideoRechargeView.swift; sourceTree = ""; }; 031FDEBD2EB0C99900F4CAC7 /* FANewVideoRechargeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FANewVideoRechargeView.swift; sourceTree = ""; }; + 031FDEBF2EB1C08900F4CAC7 /* FAMeCoinsPackButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FAMeCoinsPackButton.swift; sourceTree = ""; }; + 031FDEC12EB1E19D00F4CAC7 /* FACoinPackViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FACoinPackViewController.swift; sourceTree = ""; }; + 031FDEC32EB1E45300F4CAC7 /* FACoinPackHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FACoinPackHeaderView.swift; sourceTree = ""; }; + 031FDEC52EB1E4E600F4CAC7 /* FACoinPackTitleView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FACoinPackTitleView.swift; sourceTree = ""; }; + 031FDEC72EB1F89F00F4CAC7 /* FACoinsPackModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FACoinsPackModel.swift; sourceTree = ""; }; + 031FDEC92EB1F8F200F4CAC7 /* FACoinsPackReceiveModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FACoinsPackReceiveModel.swift; sourceTree = ""; }; + 031FDECB2EB1FDF500F4CAC7 /* FACoinsPackClaimListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FACoinsPackClaimListView.swift; sourceTree = ""; }; + 031FDECD2EB2006000F4CAC7 /* FACoinsPackClaimListCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FACoinsPackClaimListCell.swift; sourceTree = ""; }; + 031FDECF2EB2167200F4CAC7 /* FACoinsPackBuyView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FACoinsPackBuyView.swift; sourceTree = ""; }; + 031FDED12EB2F69200F4CAC7 /* FALoginView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FALoginView.swift; sourceTree = ""; }; + 031FDED32EB2FF3A00F4CAC7 /* FALogin+Apple.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "FALogin+Apple.swift"; sourceTree = ""; }; + 031FDED52EB300F400F4CAC7 /* FAThirdSignModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FAThirdSignModel.swift; sourceTree = ""; }; + 031FDED72EB30D6E00F4CAC7 /* FASettingCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FASettingCell.swift; sourceTree = ""; }; + 031FDED82EB30D6E00F4CAC7 /* FASettingCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = FASettingCell.xib; sourceTree = ""; }; + 031FDEDB2EB3141E00F4CAC7 /* FASettingFooterView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FASettingFooterView.swift; sourceTree = ""; }; + 031FDEE02EB344A200F4CAC7 /* FALogin+Facebook.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "FALogin+Facebook.swift"; sourceTree = ""; }; + 031FDEE32EB348AA00F4CAC7 /* FABaseAlert.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FABaseAlert.swift; sourceTree = ""; }; + 031FDEE52EB34FBC00F4CAC7 /* FARemoveCollectAlert.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FARemoveCollectAlert.swift; sourceTree = ""; }; + 031FDEE72EB358AE00F4CAC7 /* FAHomeCoinsPackButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FAHomeCoinsPackButton.swift; sourceTree = ""; }; + 031FDEE92EB35D2600F4CAC7 /* FACoinPackCanReceiveModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FACoinPackCanReceiveModel.swift; sourceTree = ""; }; + 031FDEEB2EB35DF600F4CAC7 /* FACoinsPackAlert.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FACoinsPackAlert.swift; sourceTree = ""; }; + 031FDEED2EB3682000F4CAC7 /* FAVipRetainAlert.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FAVipRetainAlert.swift; sourceTree = ""; }; 039CE6032EAA2612007B5EED /* AppDelegate+FAAdjust.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AppDelegate+FAAdjust.swift"; sourceTree = ""; }; 039CE6082EAA2F62007B5EED /* FAAdjustStateManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FAAdjustStateManager.swift; sourceTree = ""; }; 039CE60A2EAA31CB007B5EED /* FAStatAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FAStatAPI.swift; sourceTree = ""; }; @@ -479,6 +529,9 @@ 03E23AA82EAA1A7F004A8CEC /* FAToast.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FAToast.swift; sourceTree = ""; }; 03E23AAA2EAA1A7F004A8CEC /* FAWaterfallFlowLayout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FAWaterfallFlowLayout.swift; sourceTree = ""; }; 03E23AB92EAA1D85004A8CEC /* MNNItemController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MNNItemController.swift; sourceTree = ""; }; + 03E9A7392EB45149000D1067 /* AppDelegate+FAApns.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AppDelegate+FAApns.swift"; sourceTree = ""; }; + 03E9A73B2EB45507000D1067 /* GoogleService-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; + 03E9A73D2EB460F2000D1067 /* FAApnsAlert.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FAApnsAlert.swift; sourceTree = ""; }; 19196I43BR665O55RD205171 /* Pods-Fableon.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Fableon.debug.xcconfig"; path = "Target Support Files/Pods-Fableon/Pods-Fableon.debug.xcconfig"; sourceTree = ""; }; C4THBP0A1283PFXW440071Q5 /* Pods_Fableon.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Fableon.framework; sourceTree = BUILT_PRODUCTS_DIR; }; DCD59738B6J31K33W4Z524S0 /* Pods-Fableon.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Fableon.release.xcconfig"; path = "Target Support Files/Pods-Fableon/Pods-Fableon.release.xcconfig"; sourceTree = ""; }; @@ -594,6 +647,9 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 03E9A7362EB44F26000D1067 /* FirebaseMessaging in Frameworks */, + 031FDEDF2EB3423000F4CAC7 /* FacebookLogin in Frameworks */, + 03E9A7382EB44F26000D1067 /* FirebasePerformance in Frameworks */, B86XD3O90WO2R4725L084287 /* Pods_Fableon.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -601,6 +657,18 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 031FDEE22EB3487700F4CAC7 /* Alert */ = { + isa = PBXGroup; + children = ( + 031FDEE32EB348AA00F4CAC7 /* FABaseAlert.swift */, + 031FDEE52EB34FBC00F4CAC7 /* FARemoveCollectAlert.swift */, + 031FDEEB2EB35DF600F4CAC7 /* FACoinsPackAlert.swift */, + 031FDEED2EB3682000F4CAC7 /* FAVipRetainAlert.swift */, + 03E9A73D2EB460F2000D1067 /* FAApnsAlert.swift */, + ); + path = Alert; + sourceTree = ""; + }; 039CE6072EAA2F37007B5EED /* AdjustStateManager */ = { isa = PBXGroup; children = ( @@ -645,6 +713,9 @@ 031FDEAD2EB093B100F4CAC7 /* FABuyRecordsModel.swift */, 031FDEAF2EB09AB300F4CAC7 /* FARechargeRecordModel.swift */, 031FDEB12EB0A5AF00F4CAC7 /* FASendCoinRecordModel.swift */, + 031FDEC72EB1F89F00F4CAC7 /* FACoinsPackModel.swift */, + 031FDEC92EB1F8F200F4CAC7 /* FACoinsPackReceiveModel.swift */, + 031FDEE92EB35D2600F4CAC7 /* FACoinPackCanReceiveModel.swift */, ); path = M; sourceTree = ""; @@ -849,6 +920,7 @@ 03E239DF2EAA1A4E004A8CEC /* FASearchResultCell.swift */, 03E239E02EAA1A4E004A8CEC /* FASearchResultCell.xib */, 03E239E12EAA1A4E004A8CEC /* FASearchResultView.swift */, + 031FDEE72EB358AE00F4CAC7 /* FAHomeCoinsPackButton.swift */, ); path = V; sourceTree = ""; @@ -882,6 +954,7 @@ 03E239E92EAA1A4E004A8CEC /* FAMeListViewController.swift */, 03E239EA2EAA1A4E004A8CEC /* FAMeViewController.swift */, 03E239EB2EAA1A4E004A8CEC /* FASettingViewController.swift */, + 031FDEC12EB1E19D00F4CAC7 /* FACoinPackViewController.swift */, ); path = C; sourceTree = ""; @@ -905,6 +978,16 @@ 03E239F42EAA1A4E004A8CEC /* FAMeCoinsView.swift */, 03E239F52EAA1A4E004A8CEC /* FAMeHeaderView.swift */, 03E239F62EAA1A4E004A8CEC /* FAMeTableViewHeaderView.swift */, + 031FDEBF2EB1C08900F4CAC7 /* FAMeCoinsPackButton.swift */, + 031FDEC52EB1E4E600F4CAC7 /* FACoinPackTitleView.swift */, + 031FDEC32EB1E45300F4CAC7 /* FACoinPackHeaderView.swift */, + 031FDECB2EB1FDF500F4CAC7 /* FACoinsPackClaimListView.swift */, + 031FDECD2EB2006000F4CAC7 /* FACoinsPackClaimListCell.swift */, + 031FDECF2EB2167200F4CAC7 /* FACoinsPackBuyView.swift */, + 031FDED12EB2F69200F4CAC7 /* FALoginView.swift */, + 031FDED72EB30D6E00F4CAC7 /* FASettingCell.swift */, + 031FDED82EB30D6E00F4CAC7 /* FASettingCell.xib */, + 031FDEDB2EB3141E00F4CAC7 /* FASettingFooterView.swift */, ); path = V; sourceTree = ""; @@ -1101,6 +1184,7 @@ 03E23A962EAA1A65004A8CEC /* Libs */ = { isa = PBXGroup; children = ( + 031FDEE22EB3487700F4CAC7 /* Alert */, 039CE6122EAB0DE1007B5EED /* FAIap */, 039CE60F2EAB0D2D007B5EED /* JXIAPManager */, 039CE6072EAA2F37007B5EED /* AdjustStateManager */, @@ -1145,8 +1229,11 @@ isa = PBXGroup; children = ( 03E23A9E2EAA1A7F004A8CEC /* FALogin.swift */, + 031FDED32EB2FF3A00F4CAC7 /* FALogin+Apple.swift */, + 031FDEE02EB344A200F4CAC7 /* FALogin+Facebook.swift */, 03E23A9F2EAA1A7F004A8CEC /* FATokenModel.swift */, 03E23AA02EAA1A7F004A8CEC /* FAUserInfo.swift */, + 031FDED52EB300F400F4CAC7 /* FAThirdSignModel.swift */, ); path = FALogin; sourceTree = ""; @@ -1555,6 +1642,7 @@ isa = PBXGroup; children = ( F32J2363K02108Z62849Y019 /* Assets.xcassets */, + 03E9A73B2EB45507000D1067 /* GoogleService-Info.plist */, F3718184F516RJ76435E1IQ3 /* Info.plist */, F3S22333V8I503E2Z4YYN165 /* LaunchScreen.storyboard */, F3A0557617AU32W3L218F159 /* Localizable.strings */, @@ -1600,9 +1688,10 @@ isa = PBXGroup; children = ( 03E239602EAA1945004A8CEC /* AppDelegate.swift */, + 03E239622EAA1945004A8CEC /* SceneDelegate.swift */, 03E239612EAA1945004A8CEC /* AppDelegate+FAConfig.swift */, 039CE6032EAA2612007B5EED /* AppDelegate+FAAdjust.swift */, - 03E239622EAA1945004A8CEC /* SceneDelegate.swift */, + 03E9A7392EB45149000D1067 /* AppDelegate+FAApns.swift */, ); path = App; sourceTree = ""; @@ -1713,6 +1802,10 @@ ); mainGroup = F31ABI705806054356280I22; minimizedProjectReferenceProxies = 1; + packageReferences = ( + 031FDEDD2EB3423000F4CAC7 /* XCRemoteSwiftPackageReference "facebook-ios-sdk" */, + 03E9A7342EB44F26000D1067 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */, + ); preferredProjectObjectVersion = 77; productRefGroup = F3B536I6734E05L319J6654P /* Products */; projectDirPath = ""; @@ -1744,6 +1837,7 @@ 03E23A862EAA1A4E004A8CEC /* FAHistoryCell.xib in Resources */, 03E23A872EAA1A4E004A8CEC /* FAHomeRecommendedCell.xib in Resources */, 03E23A882EAA1A4E004A8CEC /* FAMeCell.xib in Resources */, + 031FDED92EB30D6E00F4CAC7 /* FASettingCell.xib in Resources */, 03E23A892EAA1A4E004A8CEC /* FASearchResultCell.xib in Resources */, 03E23A8A2EAA1A4E004A8CEC /* FASearchRecommendCell.xib in Resources */, 03E23A8B2EAA1A4E004A8CEC /* FAHomeSectionTitleView.xib in Resources */, @@ -1756,6 +1850,7 @@ 03E23A922EAA1A4E004A8CEC /* FAConsumptionRecordsCell.xib in Resources */, 03E23A932EAA1A4E004A8CEC /* FASearchRecordCell.xib in Resources */, 03E23A942EAA1A4E004A8CEC /* FARankingListCell.xib in Resources */, + 03E9A73C2EB45507000D1067 /* GoogleService-Info.plist in Resources */, 03E23A952EAA1A4E004A8CEC /* FAAboutCell.xib in Resources */, F3R81ZR0ZIP4Q85CX4Z5J3I4 /* LaunchScreen.storyboard in Resources */, F362972840Y56X1RPFI92W64 /* XKRefreshCell.xib in Resources */, @@ -1838,12 +1933,14 @@ F336143N569M8JG811WM9549 /* XHEedbackDetailView.swift in Sources */, F3F0952W592747Y1H6263E06 /* UCVBbfdebaffdFlowCell.swift in Sources */, F3SUP8DL68BIIEF1B8Z6U863 /* CFQConfigView.swift in Sources */, + 031FDEE12EB344AB00F4CAC7 /* FALogin+Facebook.swift in Sources */, F30E153206675C3SJ3974VL1 /* OJQUnechoSectionView.swift in Sources */, F381909BQ5JWXYI119A49469 /* DREychainCell.swift in Sources */, F39R66F983517825QO331145 /* QCenterEfineView.swift in Sources */, F3II3AF834346F516W51V693 /* GAMainRecommendedView.swift in Sources */, 031FDEAE2EB093B100F4CAC7 /* FABuyRecordsModel.swift in Sources */, F377Y22Z3J44H22J23963544 /* CDNewsController.swift in Sources */, + 031FDEC22EB1E19D00F4CAC7 /* FACoinPackViewController.swift in Sources */, F358686093028548K00WQIO1 /* NGleeVionView.swift in Sources */, F3019606DA7P36H41G408X13 /* ZStreamCell.swift in Sources */, F392T441X031FH7N0HA03SZ7 /* WPSectionView.swift in Sources */, @@ -1865,6 +1962,7 @@ F3P4D170962A2JAF14W0520R /* ADCheckMageView.swift in Sources */, 031FDEBA2EB0B82600F4CAC7 /* FACoinPackConfirmItem2View.swift in Sources */, F3206101P0DVK224N85S1W62 /* XIPathEviceController.swift in Sources */, + 031FDEC82EB1F89F00F4CAC7 /* FACoinsPackModel.swift in Sources */, F31N0S2575E3YC5AOG80WE90 /* TYElyon.swift in Sources */, F3JX29E3JQ40V23245TS8Z36 /* YRegisterController.swift in Sources */, F381171472542RD403O12925 /* QZOast.swift in Sources */, @@ -1882,6 +1980,7 @@ 03E23AAC2EAA1A7F004A8CEC /* FALogin.swift in Sources */, 03E23AAD2EAA1A7F004A8CEC /* FAKeychainHelper.swift in Sources */, 03E23AAE2EAA1A7F004A8CEC /* FATool.swift in Sources */, + 031FDECC2EB1FDF500F4CAC7 /* FACoinsPackClaimListView.swift in Sources */, 039CE6262EAB2A72007B5EED /* FAPayAlertModel.swift in Sources */, 03E23AAF2EAA1A7F004A8CEC /* FSPagerSwiftUIView.swift in Sources */, 03E23AB02EAA1A7F004A8CEC /* FADeviceIDManager.swift in Sources */, @@ -1896,6 +1995,7 @@ 03E23AB72EAA1A7F004A8CEC /* FALocalized.swift in Sources */, 039CE6222EAB1340007B5EED /* FAUserDefaultsKey.swift in Sources */, 03E23AB82EAA1A7F004A8CEC /* FAWaterfallFlowLayout.swift in Sources */, + 031FDEC62EB1E4E600F4CAC7 /* FACoinPackTitleView.swift in Sources */, F3K238643L913I6RK4G7S006 /* CSceneRegister.swift in Sources */, F3ZT3I4VAGB5405FWL36UW12 /* ZFGEtworkCell.swift in Sources */, F35O71332554S53191121042 /* UOModalCell.swift in Sources */, @@ -1908,6 +2008,7 @@ 03E23A352EAA1A4E004A8CEC /* FARecommendPlayerControlView.swift in Sources */, 03E23A362EAA1A4E004A8CEC /* FAHomeMustSeeView.swift in Sources */, 03E23A372EAA1A4E004A8CEC /* FAHomeItem.swift in Sources */, + 03E9A73E2EB460F2000D1067 /* FAApnsAlert.swift in Sources */, 03E23A382EAA1A4E004A8CEC /* FACategoryModel.swift in Sources */, 03E23A392EAA1A4E004A8CEC /* FANewListViewController.swift in Sources */, 03E23A3A2EAA1A4E004A8CEC /* FAHomeRecommendedCell.swift in Sources */, @@ -1928,12 +2029,14 @@ 03E23A492EAA1A4E004A8CEC /* FAVideoInfoModel.swift in Sources */, 039CE6202EAB114B007B5EED /* FAPayDateModel.swift in Sources */, 03E23A4A2EAA1A4E004A8CEC /* FAConsumptionRecordsViewController.swift in Sources */, + 031FDED02EB2167200F4CAC7 /* FACoinsPackBuyView.swift in Sources */, 03E23A4B2EAA1A4E004A8CEC /* FAMeCoinsView.swift in Sources */, 03E23A4C2EAA1A4E004A8CEC /* FAHomeViewModel.swift in Sources */, 03E23A4D2EAA1A4E004A8CEC /* FAGenresViewController.swift in Sources */, 03E23A4E2EAA1A4E004A8CEC /* FAHomeBannerContentCell.swift in Sources */, 03E23A4F2EAA1A4E004A8CEC /* FAEpSelectorView.swift in Sources */, 03E23A502EAA1A4E004A8CEC /* FAMeHeaderView.swift in Sources */, + 031FDEC02EB1C08900F4CAC7 /* FAMeCoinsPackButton.swift in Sources */, 03E23A512EAA1A4E004A8CEC /* FAConsumptionRecordsCell.swift in Sources */, 03E23A522EAA1A4E004A8CEC /* FARankingListHeaderView.swift in Sources */, 03E23A532EAA1A4E004A8CEC /* FAVideoLockView.swift in Sources */, @@ -1941,20 +2044,25 @@ 03E23A552EAA1A4E004A8CEC /* FAPopularListViewController.swift in Sources */, 039CE6042EAA2621007B5EED /* AppDelegate+FAAdjust.swift in Sources */, 03E23A562EAA1A4E004A8CEC /* FAPlayerEpUIButton.swift in Sources */, + 031FDEE42EB348AA00F4CAC7 /* FABaseAlert.swift in Sources */, 03E23A572EAA1A4E004A8CEC /* FAHistoryCell.swift in Sources */, 03E23A582EAA1A4E004A8CEC /* FASearchViewController.swift in Sources */, 03E23A592EAA1A4E004A8CEC /* FAWalletCell.swift in Sources */, 03E23A5A2EAA1A4E004A8CEC /* FASearchInputView.swift in Sources */, + 031FDEE82EB358AE00F4CAC7 /* FAHomeCoinsPackButton.swift in Sources */, 03E23A5B2EAA1A4E004A8CEC /* FAAboutCell.swift in Sources */, 03E23A5C2EAA1A4E004A8CEC /* FAGenresListViewController.swift in Sources */, 03E23A5D2EAA1A4E004A8CEC /* FARecommendViewModel.swift in Sources */, 03E23A5E2EAA1A4E004A8CEC /* FAHomeMustSeeContentView.swift in Sources */, 03E23A5F2EAA1A4E004A8CEC /* FAEpSelectorCell.swift in Sources */, + 031FDEEC2EB35DF600F4CAC7 /* FACoinsPackAlert.swift in Sources */, 03E23A602EAA1A4E004A8CEC /* FASearchResultView.swift in Sources */, 03E23A612EAA1A4E004A8CEC /* FAHomeMustSeeContentCell.swift in Sources */, 03E23A622EAA1A4E004A8CEC /* FAShortDetailModel.swift in Sources */, 03E23A632EAA1A4E004A8CEC /* FASearchResultCell.swift in Sources */, 03E23A642EAA1A4E004A8CEC /* FAMeTableViewHeaderView.swift in Sources */, + 031FDEE62EB34FBC00F4CAC7 /* FARemoveCollectAlert.swift in Sources */, + 031FDECE2EB2006000F4CAC7 /* FACoinsPackClaimListCell.swift in Sources */, 03E23A652EAA1A4E004A8CEC /* FARewardCoinsViewController.swift in Sources */, 03E23A662EAA1A4E004A8CEC /* FAStoreViewController.swift in Sources */, 03E23A672EAA1A4E004A8CEC /* FAMeListViewController.swift in Sources */, @@ -1964,7 +2072,9 @@ 03E23A6B2EAA1A4E004A8CEC /* FARecommendPlayerCell.swift in Sources */, 03E23A6C2EAA1A4E004A8CEC /* FAHomeNewView.swift in Sources */, 03E23A6D2EAA1A4E004A8CEC /* FARankingListViewController.swift in Sources */, + 031FDEEA2EB35D2600F4CAC7 /* FACoinPackCanReceiveModel.swift in Sources */, 03E23A6E2EAA1A4E004A8CEC /* FARankingListCell.swift in Sources */, + 031FDED22EB2F69200F4CAC7 /* FALoginView.swift in Sources */, 03E23A6F2EAA1A4E004A8CEC /* FAHomeBannerCell.swift in Sources */, 03E23A702EAA1A4E004A8CEC /* FAGenresCell.swift in Sources */, 03E23A712EAA1A4E004A8CEC /* FAHomeSectionTitleView.swift in Sources */, @@ -1981,12 +2091,14 @@ 03E23A7A2EAA1A4E004A8CEC /* FASearchRecordView.swift in Sources */, 03E23A7B2EAA1A4E004A8CEC /* FACollectViewController.swift in Sources */, 03E23A7C2EAA1A4E004A8CEC /* FAMeCell.swift in Sources */, + 03E9A73A2EB45154000D1067 /* AppDelegate+FAApns.swift in Sources */, 03E23A7D2EAA1A4E004A8CEC /* FAWalletHeaderView.swift in Sources */, 03E23A7E2EAA1A4E004A8CEC /* FAPlayerProgressView.swift in Sources */, 031FDEB82EB0B80400F4CAC7 /* FACoinPackConfirmItem1View.swift in Sources */, 03E23A7F2EAA1A4E004A8CEC /* FAMeItemModel.swift in Sources */, 03E23A802EAA1A4E004A8CEC /* FAGenresListCell.swift in Sources */, 03E23A812EAA1A4E004A8CEC /* FACollectCell.swift in Sources */, + 031FDED62EB300F400F4CAC7 /* FAThirdSignModel.swift in Sources */, 03E23A822EAA1A4E004A8CEC /* FASearchRecommendView.swift in Sources */, 03E23A832EAA1A4E004A8CEC /* FAHomeMustSeeShortView.swift in Sources */, 039CE60B2EAA31CB007B5EED /* FAStatAPI.swift in Sources */, @@ -2014,11 +2126,14 @@ F3M8439X72Q55JY9G8U502D9 /* DXYFire.swift in Sources */, 03E239912EAA1A29004A8CEC /* Dictionary+FAAdd.swift in Sources */, 03E239922EAA1A29004A8CEC /* FAImageView.swift in Sources */, + 031FDEDC2EB3141E00F4CAC7 /* FASettingFooterView.swift in Sources */, 031FDEBE2EB0C99900F4CAC7 /* FANewVideoRechargeView.swift in Sources */, 03E239932EAA1A29004A8CEC /* Date+FAAdd.swift in Sources */, + 031FDEDA2EB30D6E00F4CAC7 /* FASettingCell.swift in Sources */, 03E239942EAA1A29004A8CEC /* UserDefaults+FAAdd.swift in Sources */, 039CE6322EAB796F007B5EED /* FALabel.swift in Sources */, 03E239952EAA1A29004A8CEC /* Font+FAAdd.swift in Sources */, + 031FDEEE2EB3682000F4CAC7 /* FAVipRetainAlert.swift in Sources */, 03E239962EAA1A29004A8CEC /* FACryptorService.swift in Sources */, 03E239972EAA1A29004A8CEC /* FANetworkManager.swift in Sources */, 03E239982EAA1A29004A8CEC /* UIScrollView+FARefresh.swift in Sources */, @@ -2035,6 +2150,7 @@ 03E239A22EAA1A29004A8CEC /* FATabBarController.swift in Sources */, 03E239A32EAA1A29004A8CEC /* UIStackView+FAAdd.swift in Sources */, 03E239A42EAA1A29004A8CEC /* UIScreen+FAAdd.swift in Sources */, + 031FDED42EB2FF4000F4CAC7 /* FALogin+Apple.swift in Sources */, 039CE6182EAB0E7E007B5EED /* FAStoreAPI.swift in Sources */, 03E239A52EAA1A29004A8CEC /* FACollectionView.swift in Sources */, 03E239A62EAA1A29004A8CEC /* UIView+FAAdd.swift in Sources */, @@ -2046,9 +2162,11 @@ 03E239AB2EAA1A29004A8CEC /* FATableViewCell.swift in Sources */, 03E239AC2EAA1A29004A8CEC /* FABaseWebViewController+Script.swift in Sources */, 03E239AD2EAA1A29004A8CEC /* FAAppWebViewController.swift in Sources */, + 031FDEC42EB1E45300F4CAC7 /* FACoinPackHeaderView.swift in Sources */, 03E239AE2EAA1A29004A8CEC /* SwiftUIExtension.swift in Sources */, 039CE60E2EAA32A8007B5EED /* FAOpenAppModel.swift in Sources */, 03E239AF2EAA1A29004A8CEC /* FAAPI.swift in Sources */, + 031FDECA2EB1F8F200F4CAC7 /* FACoinsPackReceiveModel.swift in Sources */, 03E239B02EAA1A29004A8CEC /* FAWebView.swift in Sources */, 039CE61C2EAB0F29007B5EED /* FAIapOrderModel.swift in Sources */, 03E239B12EAA1A29004A8CEC /* FANetworkMonitor.swift in Sources */, @@ -2233,6 +2351,7 @@ INFOPLIST_KEY_ITSAppUsesNonExemptEncryption = NO; INFOPLIST_KEY_NSCameraUsageDescription = "The APP needs to access your album to provide screenshots for feedback."; INFOPLIST_KEY_NSPhotoLibraryUsageDescription = "The APP needs to access your album to provide screenshots for feedback."; + INFOPLIST_KEY_NSUserTrackingUsageDescription = "We will use your advertising identifier (IDFA) to provide a personalized advertising experience."; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; INFOPLIST_KEY_UIMainStoryboardFile = ""; @@ -2273,6 +2392,7 @@ INFOPLIST_KEY_ITSAppUsesNonExemptEncryption = NO; INFOPLIST_KEY_NSCameraUsageDescription = "The APP needs to access your album to provide screenshots for feedback."; INFOPLIST_KEY_NSPhotoLibraryUsageDescription = "The APP needs to access your album to provide screenshots for feedback."; + INFOPLIST_KEY_NSUserTrackingUsageDescription = "We will use your advertising identifier (IDFA) to provide a personalized advertising experience."; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; INFOPLIST_KEY_UIMainStoryboardFile = ""; @@ -2317,6 +2437,43 @@ defaultConfigurationName = Release; }; /* End XCConfigurationList section */ + +/* Begin XCRemoteSwiftPackageReference section */ + 031FDEDD2EB3423000F4CAC7 /* XCRemoteSwiftPackageReference "facebook-ios-sdk" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/facebook/facebook-ios-sdk"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 14.1.0; + }; + }; + 03E9A7342EB44F26000D1067 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/firebase/firebase-ios-sdk"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 12.5.0; + }; + }; +/* End XCRemoteSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + 031FDEDE2EB3423000F4CAC7 /* FacebookLogin */ = { + isa = XCSwiftPackageProductDependency; + package = 031FDEDD2EB3423000F4CAC7 /* XCRemoteSwiftPackageReference "facebook-ios-sdk" */; + productName = FacebookLogin; + }; + 03E9A7352EB44F26000D1067 /* FirebaseMessaging */ = { + isa = XCSwiftPackageProductDependency; + package = 03E9A7342EB44F26000D1067 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; + productName = FirebaseMessaging; + }; + 03E9A7372EB44F26000D1067 /* FirebasePerformance */ = { + isa = XCSwiftPackageProductDependency; + package = 03E9A7342EB44F26000D1067 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; + productName = FirebasePerformance; + }; +/* End XCSwiftPackageProductDependency section */ }; rootObject = F3LK276P33H73Y39H9X6VTDI /* Project object */; } diff --git a/Fableon/App/AppDelegate+FAAdjust.swift b/Fableon/App/AppDelegate+FAAdjust.swift index 7e37ac7..97d493b 100644 --- a/Fableon/App/AppDelegate+FAAdjust.swift +++ b/Fableon/App/AppDelegate+FAAdjust.swift @@ -133,7 +133,7 @@ extension SceneDelegate { var result = false #if canImport(FacebookCore) - let result = ApplicationDelegate.shared.application(UIApplication.shared, continue: userActivity) + result = ApplicationDelegate.shared.application(UIApplication.shared, continue: userActivity) #endif if !result { diff --git a/Fableon/App/AppDelegate+FAApns.swift b/Fableon/App/AppDelegate+FAApns.swift new file mode 100644 index 0000000..5d2b5b0 --- /dev/null +++ b/Fableon/App/AppDelegate+FAApns.swift @@ -0,0 +1,123 @@ +// +// AppDelegate+FAApns.swift +// Fableon +// +// Created by 湖北秦九 on 2025/10/31. +// +import UIKit +import FirebaseMessaging +import SmartCodable +import FirebaseCore + +extension SceneDelegate { + + func requestFirebase() { + FirebaseApp.configure() + Messaging.messaging().delegate = self + } + + func requestApns() { + let center = UNUserNotificationCenter.current() + center.delegate = self + + center.requestAuthorization(options: [.badge, .sound, .alert]) { grant, error in + if !grant { + DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { + self.showApnsAlert() + } + } + FAAdjustStateManager.manager.apnsAuthorizationFinish = true + + FATool.sceneDelegate?.retryHandleOpenAppMessage() + + + FATool.requestIDFAAuthorization(nil) + FAStatAPI.uploadApnsAuthorizationStatus() + } + UIApplication.shared.registerForRemoteNotifications() + } + + + + func setBadgeCount(_ count: Int) { + if #available(iOS 16.0, *) { + UNUserNotificationCenter.current().setBadgeCount(count) + } else { + UIApplication.shared.applicationIconBadgeNumber = count + } + } + + private func showApnsAlert() { + guard let date = UserDefaults.standard.object(forKey: kFAApnsAlertDefaultsKey) as? Date else { + UserDefaults.standard.set(Date(), forKey: kFAApnsAlertDefaultsKey) + return + } +#if !DEBUG + if date.fa_isToday { return } + UserDefaults.standard.set(Date(), forKey: kFAApnsAlertDefaultsKey) +#endif + + let view = FAApnsAlert() + view.show() + } +} + +extension AppDelegate { + func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { + Messaging.messaging().apnsToken = deviceToken + } + + func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: any Error) { + + } +} + +//MARK: -------------- UNUserNotificationCenterDelegate -------------- +extension SceneDelegate: UNUserNotificationCenterDelegate { + + + ///APP处于前台是接收通知消息 + func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { + completionHandler([.badge, .banner]) + } + + ///点击通知消息进入app + func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) { + setBadgeCount(0) + + guard let userInfo: [String : Any] = response.notification.request.content.userInfo as? [String : Any] else { + completionHandler() + return + } + + guard let model = FAOpenAppModel.deserialize(from: userInfo) else { + completionHandler() + return + } + FAStatAPI.requestStatApnsClick(id: model.message_id ?? "", title: response.notification.request.content.title) + + if model.path == .videoDetail, let shortPlayId = model.short_play_id { + let vc = FAPlayerDetailViewController() + vc.shortPlayId = shortPlayId + FATool.topViewController?.navigationController?.pushViewController(vc, animated: true) + + } else if model.path == .feedback { + let vc = FAAppWebViewController() + vc.webUrl = kFAFeedBackListWebUrl + FATool.topViewController?.navigationController?.pushViewController(vc, animated: true) + } + + completionHandler() + } + + +} + +//MARK: MessagingDelegate +extension SceneDelegate: MessagingDelegate { + func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String?) { + if let token = fcmToken { + FAStatAPI.requestUploadApnsDeviceToken(token: token) + } + } +} diff --git a/Fableon/App/AppDelegate+FAConfig.swift b/Fableon/App/AppDelegate+FAConfig.swift index df96a2e..4a3e658 100644 --- a/Fableon/App/AppDelegate+FAConfig.swift +++ b/Fableon/App/AppDelegate+FAConfig.swift @@ -9,6 +9,7 @@ import UIKit import MJRefresh import IQKeyboardManagerSwift import IQKeyboardToolbarManager +import FacebookCore extension AppDelegate { @@ -30,6 +31,11 @@ extension AppDelegate { UINavigationBar.appearance().standardAppearance = appearance registerAdjust() + + } + + func fa_registThirdparty(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) { + ApplicationDelegate.shared.application(application, didFinishLaunchingWithOptions: launchOptions) } } diff --git a/Fableon/App/AppDelegate.swift b/Fableon/App/AppDelegate.swift index d2e518a..b6b25cf 100644 --- a/Fableon/App/AppDelegate.swift +++ b/Fableon/App/AppDelegate.swift @@ -6,6 +6,7 @@ // import UIKit +import FacebookCore @main class AppDelegate: UIResponder, UIApplicationDelegate { @@ -14,6 +15,8 @@ class AppDelegate: UIResponder, UIApplicationDelegate { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { FANetworkMonitor.manager.startMonitoring() + fa_registThirdparty(application, didFinishLaunchingWithOptions: launchOptions) + self.fa_config() NotificationCenter.default.addObserver(self, selector: #selector(networkStatusDidChangeNotification), name: FANetworkMonitor.networkStatusDidChangeNotification, object: nil) diff --git a/Fableon/App/SceneDelegate.swift b/Fableon/App/SceneDelegate.swift index 9aa1dd1..52130d4 100644 --- a/Fableon/App/SceneDelegate.swift +++ b/Fableon/App/SceneDelegate.swift @@ -6,40 +6,54 @@ // import UIKit +import YYText class SceneDelegate: UIResponder, UIWindowSceneDelegate { var window: UIWindow? - + + private var onLineTimer: Timer? func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { guard let windowScene = (scene as? UIWindowScene) else { return } + NotificationCenter.default.addObserver(self, selector: #selector(networkStatusDidChangeNotification), name: FANetworkMonitor.networkStatusDidChangeNotification, object: nil) + FATool.sceneDelegate = self FATool.windowScene = windowScene window = UIWindow(windowScene: windowScene) window?.rootViewController = FATabBarController() window?.makeKeyAndVisible() FAAdjustStateManager.manager.isOpenApp = true + + onLineTimer = Timer.scheduledTimer(timeInterval: 60 * 10, target: YYTextWeakProxy(target: self), selector: #selector(handleOnLine), userInfo: nil, repeats: true) + + + if let webpageURL = connectionOptions.userActivities.first?.webpageURL { + self.handleOpenAppMessage(webpageURL: webpageURL) + } else if let url = connectionOptions.urlContexts.first?.url { + self.handleOpenAppMessage(webpageURL: url) + } + + requestFirebase() + requestApns() } func sceneDidDisconnect(_ scene: UIScene) { - // Called as the scene is being released by the system. - // This occurs shortly after the scene enters the background, or when its session is discarded. - // Release any resources associated with this scene that can be re-created the next time the scene connects. - // The scene may re-connect later, as its session was not necessarily discarded (see `application:didDiscardSceneSessions` instead). + } func sceneDidBecomeActive(_ scene: UIScene) { - // Called when the scene has moved from an inactive state to an active state. - // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive. + self.handleOnLine() + FAStatAPI.requestEnterApp() + self.setBadgeCount(0) } func sceneWillResignActive(_ scene: UIScene) { - // Called when the scene will move from an active state to an inactive state. - // This may occur due to temporary interruptions (ex. an incoming phone call). + FAStatAPI.requestLeaveApp() } func sceneWillEnterForeground(_ scene: UIScene) { + FAStatAPI.uploadApnsAuthorizationStatus() DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { self.handleOpenAppMessage(webpageURL: nil) } @@ -52,3 +66,14 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { } +extension SceneDelegate { + + @objc private func handleOnLine() { + FAStatAPI.requestStatOnLine() + } + + @objc private func networkStatusDidChangeNotification() { + FATool.requestIDFAAuthorization(nil) + self.retryHandleOpenAppMessage() + } +} diff --git a/Fableon/Fableon.entitlements b/Fableon/Fableon.entitlements index 1ba3f4d..0a2e231 100644 --- a/Fableon/Fableon.entitlements +++ b/Fableon/Fableon.entitlements @@ -2,10 +2,16 @@ + com.apple.developer.applesignin + + Default + com.apple.developer.associated-domains applinks:fableon.go.link applinks:kuzt.adj.st + keychain-access-groups + diff --git a/Fableon/Object/Base/Define/FAUserDefaultsKey.swift b/Fableon/Object/Base/Define/FAUserDefaultsKey.swift index 3216986..469bf48 100644 --- a/Fableon/Object/Base/Define/FAUserDefaultsKey.swift +++ b/Fableon/Object/Base/Define/FAUserDefaultsKey.swift @@ -7,3 +7,5 @@ let kFAWaitRestoreIAPDefaultsKey = "kFAWaitRestoreIAPDefaultsKey" + +let kFAApnsAlertDefaultsKey = "kFAApnsAlertDefaultsKey" diff --git a/Fableon/Object/Base/Extension/Date+FAAdd.swift b/Fableon/Object/Base/Extension/Date+FAAdd.swift index 9ceeaf9..02e50f0 100644 --- a/Fableon/Object/Base/Extension/Date+FAAdd.swift +++ b/Fableon/Object/Base/Extension/Date+FAAdd.swift @@ -22,7 +22,7 @@ extension Date { } ///是否是今天 - var br_isToday: Bool { + var fa_isToday: Bool { get { return Calendar.current.isDateInToday(self) } diff --git a/Fableon/Object/Base/Request/FAAPI/FAAPI.swift b/Fableon/Object/Base/Request/FAAPI/FAAPI.swift index 99116a5..b5289e1 100644 --- a/Fableon/Object/Base/Request/FAAPI/FAAPI.swift +++ b/Fableon/Object/Base/Request/FAAPI/FAAPI.swift @@ -6,6 +6,7 @@ // import UIKit +import SmartCodable extension FAAPI { ///更新短剧关注状态 [ "state" : isCollect, "id" : shortPlayId,] @@ -249,6 +250,34 @@ struct FAAPI { completer?(response.data) } } + + +} + +//MARK: 用户登录 +extension FAAPI { + ///第三方用户登录 + static func requestSignThirdLogin(model: FAThirdSignModel, completer: ((_ token: FATokenModel?) -> Void)?) { + FANetworkManager.manager.request(FABaseURL + "/customer/login", + method: .post, + parameters: model.toDictionary(), + isLoding: false, + isToast: true) { (response: FANetworkManager.Response) in + completer?(response.data) + } + } + + static func requestLogout(completer: ((_ token: FATokenModel?) -> Void)?) { + + FANetworkManager.manager.request(FABaseURL + "/customer/signout", + method: .post, + parameters: nil, + isLoding: true, + isToast: true) { (response: FANetworkManager.Response) in + completer?(response.data) + } + + } } diff --git a/Fableon/Object/Base/Request/FAAPI/FAStatAPI.swift b/Fableon/Object/Base/Request/FAAPI/FAStatAPI.swift index 7efad73..977da73 100644 --- a/Fableon/Object/Base/Request/FAAPI/FAStatAPI.swift +++ b/Fableon/Object/Base/Request/FAAPI/FAStatAPI.swift @@ -84,4 +84,97 @@ class FAStatAPI: NSObject { } } + + ///进入APP + static func requestEnterApp() { + + FANetworkManager.manager.request(FABaseURL + "/customer/enterTheApp", + method: .post, + parameters: nil, + isLoding: false, + isToast: false, + ) { (response: FANetworkManager.Response) in + + } + } + + ///离开APP + static func requestLeaveApp() { + + FANetworkManager.manager.request(FABaseURL + "/customer/leaveApp", + method: .post, + parameters: nil, + isLoding: false, + isToast: false, + ) { (response: FANetworkManager.Response) in + + } + } + + static func requestStatOnLine() { + FANetworkManager.manager.request(FABaseURL + "/customer/onLine", + method: .post, + parameters: nil, + isLoding: false, + isToast: false, + ) { (response: FANetworkManager.Response) in + + } + } + + static func requestUploadApnsAuthorizationStatus(_ status: Bool) { + let parameters = [ + "is_open_notice" : status ? 1 : 0 + ] + FANetworkManager.manager.request(FABaseURL + "/customer/uploadNoticeStatus", + method: .post, + parameters: parameters, + isLoding: false, + isToast: false, + ) { (response: FANetworkManager.Response) in + + } + } + + static func requestStatApnsClick(id: String, title: String) { + let parameters = [ + "message_id" : id, + "title" : title + ] + FANetworkManager.manager.request(FABaseURL + "/message/sendReport", + method: .post, + parameters: parameters, + isLoding: false, + isToast: false, + ) { (response: FANetworkManager.Response) in + + } + } + + static func requestUploadApnsDeviceToken(token: String) { + let parameters = [ + "fcm_token": token + ] + FANetworkManager.manager.request(FABaseURL + "/customer/firebaseToken", + method: .post, + parameters: parameters, + isLoding: false, + isToast: false, + ) { (response: FANetworkManager.Response) in + + } + } +} + +extension FAStatAPI { + ///更新通知状态 + static func uploadApnsAuthorizationStatus() { + UNUserNotificationCenter.current().getNotificationSettings { settings in + if settings.authorizationStatus == .authorized { + requestUploadApnsAuthorizationStatus(true) + } else if settings.authorizationStatus == .denied { + requestUploadApnsAuthorizationStatus(false) + } + } + } } diff --git a/Fableon/Object/Base/Request/FAAPI/FAStoreAPI.swift b/Fableon/Object/Base/Request/FAAPI/FAStoreAPI.swift index a902888..5a9083f 100644 --- a/Fableon/Object/Base/Request/FAAPI/FAStoreAPI.swift +++ b/Fableon/Object/Base/Request/FAAPI/FAStoreAPI.swift @@ -131,4 +131,70 @@ class FAStoreAPI: NSObject { completer?(response.data) } } + + ///金币包数据 + static func requestCoinsPackData(completer: ((_ model: FACoinsPackModel?) -> Void)?) { + + FANetworkManager.manager.request(FABaseURL + "/getReceiveDayCoinInfo", + method: .get, + parameters: nil, + isLoding: false, + isToast: true, + ) { (response: FANetworkManager.Response) in + completer?(response.data) + } + } + + ///领取金币包金币 + static func requestReceiveCoinsPackCoins(id: String?, completer: ((_ finish: Bool) -> Void)?) { + + var parameters: [String : Any]? = nil + if let id = id { + parameters = [ + "id" : id + ] + } + + FANetworkManager.manager.request(FABaseURL + "/receiveDayCoin", + method: .post, + parameters: parameters, + isLoding: true, + isToast: true, + ) { (response: FANetworkManager.Response) in + if response.isSuccess { + completer?(true) + } else { + completer?(false) + } + } + } + + ///获取金币包可领取信息 + static func requestCoinBagCanReceiveInfo(completer: ((_ model: FACoinPackCanReceiveModel?) -> Void)?) { + FANetworkManager.manager.request(FABaseURL + "/getReceiveDayCoin", + method: .get, + parameters: nil, + isLoding: false, + isToast: true, + ) { (response: FANetworkManager.Response) in + completer?(response.data) + } + } + + ///挽留支付项 + static func requestVipRetainPayInfo(completer: ((_ model: FAPayAlertModel?) -> Void)?) { + + FANetworkManager.manager.request(FABaseURL + "/getRetainVipPaySetting", + method: .get, + parameters: nil, + isLoding: true, + isToast: true, + ) { (response: FANetworkManager.Response) in + if let _ = response.data?.info { + completer?(response.data) + } else { + completer?(nil) + } + } + } } diff --git a/Fableon/Object/Base/Request/FAAPIPath.swift b/Fableon/Object/Base/Request/FAAPIPath.swift index 1cee6c1..589a4a4 100644 --- a/Fableon/Object/Base/Request/FAAPIPath.swift +++ b/Fableon/Object/Base/Request/FAAPIPath.swift @@ -16,3 +16,6 @@ let kFAFeedBackHomeWebUrl = FACampaignWebURL + "/pages/leave/index" let kFAFeedBackListWebUrl = FACampaignWebURL + "/pages/leave/list" ///反馈详情 let kFAFeedBackDetailWebUrl = FACampaignWebURL + "/pages/leave/detail" + +///注销账号 +let kFALogoutWebUrl = FACampaignWebURL + "/pages/setting/logout" diff --git a/Fableon/Object/Base/Request/FANetworkManager.swift b/Fableon/Object/Base/Request/FANetworkManager.swift index 3d139dc..977247b 100644 --- a/Fableon/Object/Base/Request/FANetworkManager.swift +++ b/Fableon/Object/Base/Request/FANetworkManager.swift @@ -186,7 +186,8 @@ extension FANetworkManager { "model" : UIDevice.current.machineModelName ?? "", "idfa" : ASIdentifierManager.shared().advertisingIdentifier.uuidString, "device-id" : FADeviceIDManager.shared.id, //设备id - "device-gaid" : UIDevice.current.identifierForVendor?.uuidString ?? "" + "device-gaid" : UIDevice.current.identifierForVendor?.uuidString ?? "", + "product-prefix" : FAIapManager.IAPPrefix ] return HTTPHeaders(dic) } diff --git a/Fableon/Object/Base/WebView/FAAppWebViewController.swift b/Fableon/Object/Base/WebView/FAAppWebViewController.swift index 80c0c7a..a641bc4 100644 --- a/Fableon/Object/Base/WebView/FAAppWebViewController.swift +++ b/Fableon/Object/Base/WebView/FAAppWebViewController.swift @@ -14,7 +14,7 @@ class FAAppWebViewController: FABaseWebViewController { private var receiveDataCount = 0 - var theme: String? = "theme_1" + var theme: String? = "theme_3" override func viewDidLoad() { super.viewDidLoad() @@ -26,6 +26,8 @@ class FAAppWebViewController: FABaseWebViewController { self.title = "Feedback".localized } else if webUrl == kFAFeedBackDetailWebUrl { self.title = "Feedback Details".localized + } else if webUrl == kFALogoutWebUrl { + self.title = "Account Deletion".localized } } @@ -51,6 +53,7 @@ extension FAAppWebViewController { "time_zone" : String.timeZone(), "lang" : FALocalized.manager.currentLocalizedKey, "type" : "ios", + "device-id" : FADeviceIDManager.shared.id ] if let theme = theme { diff --git a/Fableon/Object/Base/WebView/FABaseWebViewController+Script.swift b/Fableon/Object/Base/WebView/FABaseWebViewController+Script.swift index e3d8165..f7d4150 100644 --- a/Fableon/Object/Base/WebView/FABaseWebViewController+Script.swift +++ b/Fableon/Object/Base/WebView/FABaseWebViewController+Script.swift @@ -18,6 +18,8 @@ let kFAWebMessageOpenFeedbackList = "openFeedbackList" let kFAWebMessageOpenFeedbackDetail = "openFeedbackDetail" ///打开相册 let kFAWebMessageOpenPhotoPicker = "openPhotoPicker" +///删除账号成功 +let kFAWebMessageAccountDeletionFinish = "accountLogout" extension FABaseWebViewController { @@ -50,7 +52,8 @@ extension FABaseWebViewController { let data = model.data if type == "login" { -// VPLoginManager.manager.openLogin() + let view = FALoginView() + view.present(in: nil) } else if type == "open_notify" { // openNotify() @@ -69,6 +72,9 @@ extension FABaseWebViewController { } } + case kFAWebMessageAccountDeletionFinish: + self.navigationController?.popToRootViewController(animated: true) + default: break diff --git a/Fableon/Object/Base/WebView/FAWebView.swift b/Fableon/Object/Base/WebView/FAWebView.swift index 2c1044a..fe751f8 100644 --- a/Fableon/Object/Base/WebView/FAWebView.swift +++ b/Fableon/Object/Base/WebView/FAWebView.swift @@ -38,6 +38,7 @@ class FAWebView: WKWebView { kFAWebMessageOpenFeedbackList, kFAWebMessageOpenFeedbackDetail, kFAWebMessageOpenPhotoPicker, + kFAWebMessageAccountDeletionFinish, ] diff --git a/Fableon/Object/Class/Home/C/FAHomeViewController.swift b/Fableon/Object/Class/Home/C/FAHomeViewController.swift index 76cc569..9370ec2 100644 --- a/Fableon/Object/Class/Home/C/FAHomeViewController.swift +++ b/Fableon/Object/Class/Home/C/FAHomeViewController.swift @@ -61,6 +61,17 @@ class FAHomeViewController: FAViewController { view.isHidden = true return view }() + + private lazy var coinPackButton: FAHomeCoinsPackButton = { + let view = FAHomeCoinsPackButton() + view.addAction(UIAction(handler: { [weak self] _ in + guard let self = self else { return } + let vc = FACoinPackViewController() + self.navigationController?.pushViewController(vc, animated: true) + + }), for: .touchUpInside) + return view + }() deinit { NotificationCenter.default.removeObserver(self) @@ -72,6 +83,8 @@ class FAHomeViewController: FAViewController { fa_setupLayout() requestAllData(completer: nil) + + requestCoinBagCanReceiveInfo() } override func viewWillAppear(_ animated: Bool) { @@ -104,6 +117,7 @@ extension FAHomeViewController { view.addSubview(searchButton) view.addSubview(collectionView) view.addSubview(playHistoryView) + view.addSubview(coinPackButton) titleView.snp.makeConstraints { make in make.left.equalToSuperview().offset(16) @@ -125,6 +139,11 @@ extension FAHomeViewController { make.centerX.equalToSuperview() make.bottom.equalToSuperview().offset(-10) } + + coinPackButton.snp.makeConstraints { make in + make.right.equalToSuperview().offset(-21) + make.bottom.equalTo(playHistoryView.snp.top).offset(5) + } } } @@ -280,4 +299,22 @@ extension FAHomeViewController { } } + private func requestCoinBagCanReceiveInfo() { + + FAStoreAPI.requestCoinBagCanReceiveInfo { [weak self] model in + guard let self = self else { return } + guard let model = model else { return } + let coins = model.coins ?? 0 + if coins > 0 { + let view = FACoinsPackAlert() + view.coinsCount = coins + view.show(in: self.view) + view.clickHighlightButton = { [weak self] in + let vc = FACoinPackViewController() + self?.navigationController?.pushViewController(vc, animated: true) + } + } + } + } + } diff --git a/Fableon/Object/Class/Home/V/FAHomeCoinsPackButton.swift b/Fableon/Object/Class/Home/V/FAHomeCoinsPackButton.swift new file mode 100644 index 0000000..6333b3c --- /dev/null +++ b/Fableon/Object/Class/Home/V/FAHomeCoinsPackButton.swift @@ -0,0 +1,50 @@ +// +// FAHomeCoinsPackButton.swift +// Fableon +// +// Created by 湖北秦九 on 2025/10/30. +// + +import UIKit +import SnapKit + +class FAHomeCoinsPackButton: UIControl { + + private lazy var bgImageView = UIImageView(image: UIImage(named: "Group 2072750470")) + private lazy var textBgImageView = UIImageView(image: UIImage(named: "按钮")) + + private lazy var textLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: 10, weight: .init(900)).withBoldItalic() + label.textColor = .FFFFFF + label.text = "Daily Coins".localized + return label + }() + + override init(frame: CGRect) { + super.init(frame: frame) + + addSubview(bgImageView) + addSubview(textBgImageView) + textBgImageView.addSubview(textLabel) + + bgImageView.snp.makeConstraints { make in + make.left.right.top.equalToSuperview() + } + + textBgImageView.snp.makeConstraints { make in + make.centerX.equalToSuperview() + make.bottom.equalToSuperview() + make.top.equalToSuperview().offset(50) + } + + textLabel.snp.makeConstraints { make in + make.centerY.equalToSuperview() + make.centerX.equalToSuperview() + } + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} diff --git a/Fableon/Object/Class/Me/C/FACoinPackViewController.swift b/Fableon/Object/Class/Me/C/FACoinPackViewController.swift new file mode 100644 index 0000000..2bbfd63 --- /dev/null +++ b/Fableon/Object/Class/Me/C/FACoinPackViewController.swift @@ -0,0 +1,216 @@ +// +// FACoinPackViewController.swift +// Fableon +// +// Created by 湖北秦九 on 2025/10/29. +// + +import UIKit +import YYText + +class FACoinPackViewController: FAViewController { + + private var model: FACoinsPackModel? { + didSet { + headerView.model = model + claimView.dataArr = model?.receive_list ?? [] + } + } + + private var payDataModel : FAPayDateModel? { + didSet { + var arr: [FAPayItem] = [] + + payDataModel?.list_coins?.forEach { + if $0.buy_type == .subCoins { + arr.append($0) + } + } + self.buyView.dataArr = arr + } + } + + private var payDataRequest: FAPayDataRequest? + + private lazy var bgIconImageView: UIImageView = { + let imageView = UIImageView(image: UIImage(named: "查看图片 25")) + return imageView + }() + + private lazy var scrollView: FAScrollView = { + let scrollView = FAScrollView() + return scrollView + }() + + private lazy var headerView: FACoinPackHeaderView = { + let view = FACoinPackHeaderView() + view.clickClaimButton = { [weak self] in + self?.requestReceiveCoins(nil) + } + return view + }() + + private lazy var stackView: UIStackView = { + let stackView = UIStackView() + stackView.axis = .vertical + stackView.spacing = 19 + return stackView + }() + + private lazy var claimView: FACoinsPackClaimListView = { + let view = FACoinsPackClaimListView() + view.clickClaimButton = { [weak self] id in + guard let self = self else { return } + self.requestReceiveCoins(id) + } + return view + }() + + private lazy var buyView: FACoinsPackBuyView = { + let view = FACoinsPackBuyView() + view.buyFinishHandle = { [weak self] in + self?.requestCoinsPackData() + } + return view + }() + + private lazy var tipView: UIView = { + let view = UIView() + view.addSubview(tipTitleLabel) + view.addSubview(tipTextLabel) + + tipTitleLabel.snp.makeConstraints { make in + make.top.equalToSuperview() + make.left.equalToSuperview().offset(16) + } + + tipTextLabel.snp.makeConstraints { make in + make.left.equalToSuperview().offset(16) + make.right.lessThanOrEqualToSuperview().offset(-16) + make.top.equalTo(tipTitleLabel.snp.bottom).offset(4) + make.bottom.equalToSuperview() + } + return view + }() + + private lazy var tipTitleLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: 12, weight: .medium) + label.textColor = .FFFFFF.withAlphaComponent(0.5) + label.text = "coins_pack_tips_title".localized + return label + }() + + private lazy var tipTextLabel: UILabel = { + let att = NSMutableAttributedString(string: "coins_pack_tips".localized) + att.yy_lineSpacing = 3 + + let label = UILabel() + label.font = .font(ofSize: 10, weight: .regular) + label.textColor = .FFFFFF.withAlphaComponent(0.5) + label.attributedText = att + label.numberOfLines = 0 + return label + }() + + override func viewDidLoad() { + super.viewDidLoad() + self.title = "My Refills".localized + payDataModel = FAIapManager.manager.payDateModel + + fa_setupLayout() + + requestCoinsPackData() + + updateLayout() + } + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + self.navigationController?.setNavigationBarHidden(false, animated: true) + self.fa_setNavigationStyle() + } + + private func updateLayout() { + stackView.fa_removeAllArrangedSubview() + + if self.claimView.dataArr.count > 0 { + stackView.addArrangedSubview(self.claimView) + } else if self.buyView.dataArr.count > 0 { + stackView.addArrangedSubview(self.buyView) + } + + stackView.addArrangedSubview(tipView) + } + +} + +extension FACoinPackViewController { + + private func fa_setupLayout() { + view.addSubview(bgIconImageView) + view.addSubview(scrollView) + scrollView.addSubview(headerView) + scrollView.addSubview(stackView) + + bgIconImageView.snp.makeConstraints { make in + make.right.equalToSuperview() + make.top.equalToSuperview() + } + + scrollView.snp.makeConstraints { make in + make.left.right.equalToSuperview() + make.top.equalToSuperview().offset(UIScreen.navBarHeight) + make.bottom.equalToSuperview() + } + + headerView.snp.makeConstraints { make in + make.left.centerX.equalToSuperview() + make.top.equalToSuperview() + } + + stackView.snp.makeConstraints { make in + make.left.centerX.equalToSuperview() + make.top.equalTo(headerView.snp.bottom).offset(16) + make.bottom.equalToSuperview().offset(-(UIScreen.safeBottom + 10)) + } + } + +} + +extension FACoinPackViewController { + + private func requestCoinsPackData() { + FAStoreAPI.requestCoinsPackData { [weak self] model in + guard let self = self else { return } + guard let model = model else { return } + self.model = model + + if (model.receive_list?.count ?? 0) == 0 { + self.requestPayData() + } + + self.updateLayout() + } + + } + + private func requestPayData() { + self.payDataRequest = FAPayDataRequest() + self.payDataRequest?.requestProducts { [weak self] model in + guard let self = self else { return } + guard let model = model else { return } + self.payDataModel = model + + self.updateLayout() + } + } + + private func requestReceiveCoins(_ id: String?) { + FAStoreAPI.requestReceiveCoinsPackCoins(id: id) { [weak self] finish in + guard let self = self else { return } + self.requestCoinsPackData() + } + } + +} diff --git a/Fableon/Object/Class/Me/C/FAMeListViewController.swift b/Fableon/Object/Class/Me/C/FAMeListViewController.swift index d12cb77..b9db860 100644 --- a/Fableon/Object/Class/Me/C/FAMeListViewController.swift +++ b/Fableon/Object/Class/Me/C/FAMeListViewController.swift @@ -16,11 +16,12 @@ class FAMeListViewController: FAViewController, JXPagingViewListViewDelegate { let arr = [ FAMeItemModel(type: .feedback, name: "Feedback".localized, icon: UIImage(named: "icon_feedback")), FAMeItemModel(type: .about, name: "About".localized, icon: UIImage(named: "icon_about")), -// FAMeItemModel(type: .setting, name: "Setting".localized, icon: UIImage(named: "icon_setting")) FAMeItemModel(type: .privacyPolicy, name: "Privacy Policy".localized, icon: UIImage(named: "icon_privacy")), FAMeItemModel(type: .userAgreement, name: "User Agreement".localized, icon: UIImage(named: "icon_user")), FAMeItemModel(type: .visitWebsite, name: "Visit Website".localized, icon: UIImage(named: "icon_visit")), + + FAMeItemModel(type: .setting, name: "Setting".localized, icon: UIImage(named: "icon_setting")) ] return arr }() diff --git a/Fableon/Object/Class/Me/C/FASettingViewController.swift b/Fableon/Object/Class/Me/C/FASettingViewController.swift index 805df1b..0fd9e4d 100644 --- a/Fableon/Object/Class/Me/C/FASettingViewController.swift +++ b/Fableon/Object/Class/Me/C/FASettingViewController.swift @@ -8,11 +8,35 @@ import UIKit class FASettingViewController: FAViewController { + + private lazy var dataArr: [FAMeItemModel] = [ + FAMeItemModel(type: .deleteAccount, name: "Account Deletion".localized, icon: nil) + ] + + private lazy var tableView: FATableView = { + let tableView = FATableView(frame: .zero, style: .plain) + tableView.delegate = self + tableView.dataSource = self + tableView.rowHeight = 48 + tableView.contentInset = .init(top: 25, left: 0, bottom: 0, right: 0) + tableView.separatorStyle = .none + tableView.register(UINib(nibName: "FASettingCell", bundle: nil), forCellReuseIdentifier: "cell") + return tableView + }() + + private lazy var footerView: FASettingFooterView = { + let view = FASettingFooterView(frame: .init(x: 0, y: 0, width: UIScreen.width, height: 60)) + return view + }() override func viewDidLoad() { super.viewDidLoad() self.title = "Settings".localized + NotificationCenter.default.addObserver(self, selector: #selector(userInfoUpdateNotification), name: FALogin.userInfoUpdateNotification, object: nil) + + userInfoUpdateNotification() + fa_setupLayout() } override func viewWillAppear(_ animated: Bool) { @@ -20,7 +44,52 @@ class FASettingViewController: FAViewController { self.navigationController?.setNavigationBarHidden(false, animated: true) self.fa_setNavigationStyle() } - - + @objc private func userInfoUpdateNotification() { + if FALogin.manager.isLogin { + tableView.tableFooterView = footerView + } else { + tableView.tableFooterView = nil + } + } + + +} + +extension FASettingViewController { + + private func fa_setupLayout() { + + + view.addSubview(tableView) + + tableView.snp.makeConstraints { make in + make.left.right.equalToSuperview() + make.top.equalToSuperview().offset(UIScreen.navBarHeight) + make.bottom.equalToSuperview() + } + } + +} + +//MARK: UITableViewDelegate UITableViewDataSource +extension FASettingViewController: UITableViewDelegate, UITableViewDataSource { + + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let item = dataArr[indexPath.row] + let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! FASettingCell + cell.titleLabel.text = item.name + return cell + } + + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return self.dataArr.count + } + + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + let vc = FAAppWebViewController() + vc.webUrl = kFALogoutWebUrl + vc.theme = "theme_4" + self.navigationController?.pushViewController(vc, animated: true) + } } diff --git a/Fableon/Object/Class/Me/M/FAMeItemModel.swift b/Fableon/Object/Class/Me/M/FAMeItemModel.swift index b462c47..163787e 100644 --- a/Fableon/Object/Class/Me/M/FAMeItemModel.swift +++ b/Fableon/Object/Class/Me/M/FAMeItemModel.swift @@ -22,6 +22,7 @@ struct FAMeItemModel { case purchaseRecords ///金币奖励 case rewardCoins + case deleteAccount } diff --git a/Fableon/Object/Class/Me/V/FACoinPackHeaderView.swift b/Fableon/Object/Class/Me/V/FACoinPackHeaderView.swift new file mode 100644 index 0000000..5e4ae1c --- /dev/null +++ b/Fableon/Object/Class/Me/V/FACoinPackHeaderView.swift @@ -0,0 +1,266 @@ +// +// FACoinPackHeaderView.swift +// Fableon +// +// Created by 湖北秦九 on 2025/10/29. +// + +import UIKit + +class FACoinPackHeaderView: UIView { + + var clickClaimButton: (() -> Void)? + + var model: FACoinsPackModel? { + didSet { + coinsView1.coins = model?.week_max_total + coinsView2.coins = model?.week_total + + activeCountLabel.text = "\(model?.receive_count ?? 0)" + + if let coin = model?.receive_coins, coin > 0 { + claimButton.isEnabled = true + } else { + claimButton.isEnabled = false + } + + claimButton.setNeedsUpdateConfiguration() + } + } + + private lazy var titleView: FACoinPackTitleView = { + let view = FACoinPackTitleView() + view.dotColor = .C_5_DDF_5 + view.font = .font(ofSize: 14, weight: .regular) + view.textColors = [UIColor.C_5_DDF_5.cgColor, UIColor.C_5_DDF_5.cgColor] + view.text = "REWARDS OVERVIEW".localized + return view + }() + + private lazy var coinsView1: CoinsView = { + let view = CoinsView() + view.title = "Weekly Total".localized + view.coins = 0 + return view + }() + + private lazy var coinsView2: CoinsView = { + let view = CoinsView() + view.title = "Claimable Coins".localized + view.coins = 0 + return view + }() + + private lazy var lineView1: UIView = { + let view = UIImageView(image: UIImage(named: "间隔线")) + return view + }() + + private lazy var lineView2: UIView = { + let view = UIImageView(image: UIImage(named: "横间隔虚线")) + return view + }() + + private lazy var activeCountTitleLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: 12, weight: .regular) + label.textColor = .FFFFFF.withAlphaComponent(0.5) + label.text = "Active Refills".localized + ": " + return label + }() + + private lazy var activeCountLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: 12, weight: .medium) + label.textColor = ._53_A_2_F_1 + label.text = "0" + return label + }() + + private lazy var claimButton: UIButton = { + let config = UIButton.Configuration.plain() + let button = FAGradientButton(configuration: config, primaryAction: UIAction(handler: { [weak self] _ in + self?.clickClaimButton?() + })) + button.isEnabled = false + button.layer.cornerRadius = 24 + button.layer.masksToBounds = true + button.fa_locations = [0, 1] + button.fa_startPoint = .init(x: 0, y: 0.5) + button.fa_endPoint = .init(x: 1, y: 0.5) + button.configurationUpdateHandler = { [weak self] button in + guard let self = self else { return } + guard let button = button as? FAGradientButton else { return } + if button.isEnabled { + button.fa_colors = [UIColor._53_A_2_F_1.cgColor, UIColor.C_5_DDF_5.cgColor] + + let coinImage = UIImage(named: "coins_icon_03")! + let coinText = NSTextAttachment(image: coinImage) + coinText.bounds = .init(x: 0, y: -2.5, width: coinImage.size.width, height: coinImage.size.height) + let coinAtt = AttributedString(NSAttributedString(attachment: coinText)) + + let textAtt = AttributedString("Claim All".localized + " ", attributes: AttributeContainer([ + .font : UIFont.font(ofSize: 14, weight: .bold), + .foregroundColor : UIColor.FFFFFF + ])) + + let countAtt = AttributedString(" \(0)".localized, attributes: AttributeContainer([ + .font : UIFont.font(ofSize: 14, weight: .bold), + .foregroundColor : UIColor.FFFFFF + ])) + + button.configuration?.attributedTitle = textAtt + coinAtt + countAtt + + + } else { + button.fa_colors = [UIColor._6_D_6_D_6_D.cgColor, UIColor._6_D_6_D_6_D.cgColor] + button.configuration?.attributedTitle = AttributedString("Get a Refill to Claim".localized, attributes: AttributeContainer([ + .font : UIFont.font(ofSize: 14, weight: .bold), + .foregroundColor : UIColor.FFFFFF.withAlphaComponent(0.5) + ])) + } + + } + return button + }() + + override init(frame: CGRect) { + super.init(frame: frame) + fa_setupLayout() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + +} + +extension FACoinPackHeaderView { + + private func fa_setupLayout() { + addSubview(titleView) + addSubview(coinsView1) + addSubview(coinsView2) + addSubview(lineView1) + addSubview(activeCountTitleLabel) + addSubview(activeCountLabel) + addSubview(claimButton) + addSubview(lineView2) + + titleView.snp.makeConstraints { make in + make.left.equalToSuperview().offset(16) + make.top.equalToSuperview().offset(20) + } + + coinsView1.snp.makeConstraints { make in + make.left.equalToSuperview().offset(28) + make.top.equalTo(titleView.snp.bottom).offset(23) + } + + lineView1.snp.makeConstraints { make in + make.centerY.equalTo(coinsView1) + make.left.equalTo(coinsView1.snp.right).offset(18) + } + + coinsView2.snp.makeConstraints { make in + make.centerY.equalTo(lineView1) + make.left.equalTo(lineView1.snp.right).offset(18) + } + + activeCountTitleLabel.snp.makeConstraints { make in + make.left.equalTo(coinsView1) + make.top.equalTo(coinsView1.snp.bottom).offset(23) + } + + activeCountLabel.snp.makeConstraints { make in + make.left.equalTo(activeCountTitleLabel.snp.right) + make.centerY.equalTo(activeCountTitleLabel) + } + + claimButton.snp.makeConstraints { make in + make.left.equalToSuperview().offset(23) + make.centerX.equalToSuperview() + make.top.equalTo(activeCountTitleLabel.snp.bottom).offset(12) + make.height.equalTo(48) + make.bottom.equalToSuperview().offset(-16) + } + + lineView2.snp.makeConstraints { make in + make.left.equalTo(claimButton) + make.right.equalTo(claimButton) + make.bottom.equalToSuperview() + } + } + +} + + +extension FACoinPackHeaderView { + + class CoinsView: UIView { + var title: String? { + didSet { + titleLabel.text = title + } + } + + var coins: Int? { + didSet { + coinsLabel.text = "\(coins ?? 0)" + } + } + + private lazy var titleLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: 12, weight: .bold) + label.textColor = .FFFFFF.withAlphaComponent(0.5) + return label + }() + + private lazy var iconImageView: UIImageView = { + let imageView = UIImageView(image: UIImage(named: "coins_icon_09")) + return imageView + }() + + private lazy var coinsLabel: UILabel = { + let label = FALabel() + label.font = .font(ofSize: 18, weight: .bold) + label.textColors = [UIColor._53_A_2_F_1.cgColor, UIColor.C_5_DDF_5.cgColor] + label.textStartPoint = .init(x: 0, y: 0.5) + label.textEndPoint = .init(x: 1, y: 0.5) + return label + }() + + override init(frame: CGRect) { + super.init(frame: frame) + + addSubview(titleLabel) + addSubview(iconImageView) + addSubview(coinsLabel) + + titleLabel.snp.makeConstraints { make in + make.left.equalToSuperview() + make.top.equalToSuperview() + make.right.lessThanOrEqualToSuperview() + } + + iconImageView.snp.makeConstraints { make in + make.left.equalToSuperview() + make.top.equalTo(titleLabel.snp.bottom).offset(4) + make.bottom.equalToSuperview() + } + + coinsLabel.snp.makeConstraints { make in + make.centerY.equalTo(iconImageView) + make.left.equalTo(iconImageView.snp.right).offset(4) + make.right.lessThanOrEqualToSuperview() + } + + } + + @MainActor required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + } + +} diff --git a/Fableon/Object/Class/Me/V/FACoinPackTitleView.swift b/Fableon/Object/Class/Me/V/FACoinPackTitleView.swift new file mode 100644 index 0000000..848acaf --- /dev/null +++ b/Fableon/Object/Class/Me/V/FACoinPackTitleView.swift @@ -0,0 +1,91 @@ +// +// FACoinPackTitleView.swift +// Fableon +// +// Created by 湖北秦九 on 2025/10/29. +// + +import UIKit + +class FACoinPackTitleView: UIView { + + var text: String? { + didSet { + label.text = text + } + } + + var font: UIFont? { + didSet { + label.font = font + } + } + + var textColors: [CGColor]? { + didSet { + label.textColors = textColors + } + } + + var dotColor: UIColor? { + didSet { + dotView1.backgroundColor = dotColor + dotView2.backgroundColor = dotColor + } + } + + private lazy var dotView1: UIView = { + let view = UIView() + view.layer.cornerRadius = 3 + view.layer.masksToBounds = true + return view + }() + + private lazy var dotView2: UIView = { + let view = UIView() + view.layer.cornerRadius = 3 + view.layer.masksToBounds = true + return view + }() + + private lazy var label: FALabel = { + let label = FALabel() + label.textStartPoint = .init(x: 0, y: 0.5) + label.textEndPoint = .init(x: 1, y: 0.5) + return label + }() + + override init(frame: CGRect) { + super.init(frame: frame) + addSubview(dotView1) + addSubview(dotView2) + addSubview(label) + + dotView1.snp.makeConstraints { make in + make.centerY.equalToSuperview() + make.left.equalToSuperview() + make.width.height.equalTo(6) + make.bottom.lessThanOrEqualToSuperview() + } + + label.snp.makeConstraints { make in + make.centerY.equalToSuperview() + make.bottom.lessThanOrEqualToSuperview() + make.left.equalTo(dotView1.snp.right).offset(6) + } + + dotView2.snp.makeConstraints { make in + make.centerY.equalToSuperview() + make.bottom.lessThanOrEqualToSuperview() + make.right.equalToSuperview() + make.width.height.equalTo(dotView1) + make.left.equalTo(label.snp.right).offset(6) + } + + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + +} diff --git a/Fableon/Object/Class/Me/V/FACoinsPackBuyView.swift b/Fableon/Object/Class/Me/V/FACoinsPackBuyView.swift new file mode 100644 index 0000000..9694e6b --- /dev/null +++ b/Fableon/Object/Class/Me/V/FACoinsPackBuyView.swift @@ -0,0 +1,112 @@ +// +// FACoinsPackBuyView.swift +// Fableon +// +// Created by 湖北秦九 on 2025/10/29. +// + +import UIKit + +class FACoinsPackBuyView: UIView { + + var buyFinishHandle: (() -> Void)? + + var dataArr: [FAPayItem] = [] + + private lazy var titleView: FACoinPackTitleView = { + let view = FACoinPackTitleView() + view.dotColor = .C_5_DDF_5 + view.textColors = [UIColor.C_5_DDF_5.cgColor, UIColor.C_5_DDF_5.cgColor] + view.font = .font(ofSize: 14, weight: .regular) + view.text = "Weekly Refill".localized.uppercased() + return view + }() + + private lazy var collectionViewLayout: UICollectionViewFlowLayout = { + let layout = UICollectionViewFlowLayout() + layout.itemSize = .init(width: UIScreen.width - 32, height: 84) + layout.minimumLineSpacing = 12 + return layout + }() + + private lazy var collectionView: FACollectionView = { + let collectionView = FACollectionView(frame: .zero, collectionViewLayout: collectionViewLayout) + collectionView.delegate = self + collectionView.dataSource = self + collectionView.addObserver(self, forKeyPath: "contentSize", context: nil) + collectionView.register(FAStoreCoinsPackCell.self, forCellWithReuseIdentifier: "cell") + return collectionView + }() + + deinit { + collectionView.removeObserver(self, forKeyPath: "contentSize") + } + + override init(frame: CGRect) { + super.init(frame: frame) + + fa_setupLayout() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { + if keyPath == "contentSize" { + let height = self.collectionView.contentSize.height + 1 + collectionView.snp.updateConstraints { make in + make.height.equalTo(height) + } + } + } +} + +extension FACoinsPackBuyView { + + private func fa_setupLayout() { + addSubview(titleView) + addSubview(collectionView) + + titleView.snp.makeConstraints { make in + make.top.equalToSuperview() + make.centerX.equalToSuperview() + } + + collectionView.snp.makeConstraints { make in + make.left.right.bottom.equalToSuperview() + make.top.equalToSuperview().offset(30) + make.height.equalTo(1) + make.bottom.equalToSuperview() + } + } + +} + +//MARK: UICollectionViewDelegate UICollectionViewDataSource +extension FACoinsPackBuyView: UICollectionViewDelegate, UICollectionViewDataSource { + + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! FAStoreCoinsPackCell + cell.model = self.dataArr[indexPath.row] + return cell + } + + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return dataArr.count + } + + func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + let model = self.dataArr[indexPath.row] + + let view = FACoinPackConfirmView() + view.model = model + view.buyFinishHandle = { [weak self] in + guard let self = self else { return } + FALogin.manager.requestUserInfo(completer: nil) + self.buyFinishHandle?() + } + view.present(in: nil) + } + +} diff --git a/Fableon/Object/Class/Me/V/FACoinsPackClaimListCell.swift b/Fableon/Object/Class/Me/V/FACoinsPackClaimListCell.swift new file mode 100644 index 0000000..b691f5d --- /dev/null +++ b/Fableon/Object/Class/Me/V/FACoinsPackClaimListCell.swift @@ -0,0 +1,280 @@ +// +// FACoinsPackClaimListCell.swift +// Fableon +// +// Created by 湖北秦九 on 2025/10/29. +// + +import UIKit +import YYText + +class FACoinsPackClaimListCell: UICollectionViewCell { + + var clickClaimButton: ((_ id: String?) -> Void)? + + var model: FACoinsPackReceiveModel? { + didSet { + coinsView1.coins = model?.week_max_total + coinsView2.coins = model?.week_remaining_total + + claimButton.isEnabled = (model?.receive_coins ?? 0) > 0 + claimButton.setNeedsUpdateConfiguration() + + let titleAtt = NSMutableAttributedString(string: "\(model?.title ?? "")") + titleAtt.yy_color = .FFFFFF + titleAtt.yy_font = .font(ofSize: 14, weight: .bold) + + let dayAtt = NSMutableAttributedString(string: " (Day \(model?.day_text ?? ""))") + dayAtt.yy_color = ._20_A_1_FF + dayAtt.yy_font = .font(ofSize: 14, weight: .regular) + titleAtt.append(dayAtt) + + titleLabel.attributedText = titleAtt + + } + } + + private lazy var bgView: FAGradientView = { + let view = FAGradientView() + view.fa_colors = [UIColor._524_B_8_E.cgColor, UIColor._303265.cgColor] + view.fa_locations = [0, 1] + view.fa_startPoint = .init(x: 0, y: 0.5) + view.fa_endPoint = .init(x: 1, y: 0.5) + view.layer.cornerRadius = 12 + view.layer.masksToBounds = true + view.layer.borderWidth = 1 + view.layer.borderColor = UIColor.E_5_E_5_E_5.cgColor + return view + }() + + private lazy var bgIconImageView1 = UIImageView(image: UIImage(named: "coin_attachment_01")) + private lazy var bgIconImageView2 = UIImageView(image: UIImage(named: "coin_attachment_03")) + private lazy var bgIconImageView4 = UIImageView(image: UIImage(named: "coin_attachment_04")) + private lazy var bgIconImageView5 = UIImageView(image: UIImage(named: "coin_attachment_05")) + + private lazy var titleLabel: UILabel = { + let label = UILabel() + label.numberOfLines = 0 + return label + }() + + private lazy var lineView1 = UIImageView(image: UIImage(named: "横间隔虚线")) + private lazy var lineView2 = UIImageView(image: UIImage(named: "间隔线")) + + private lazy var coinsView1: CoinsView = { + let view = CoinsView() + view.title = "Total Reward".localized + return view + }() + + private lazy var coinsView2: CoinsView = { + let view = CoinsView() + view.title = "Remaining".localized + return view + }() + + private lazy var claimButton: UIButton = { + var config = UIButton.Configuration.plain() + config.titleAlignment = .center + + let button = FAGradientButton(configuration: config, primaryAction: UIAction(handler: { [weak self] _ in + guard let self = self else { return } + self.clickClaimButton?(self.model?.id) + })) + button.layer.cornerRadius = 24 + button.layer.masksToBounds = true + button.fa_locations = [0, 1] + button.fa_startPoint = .init(x: 0, y: 0.5) + button.fa_endPoint = .init(x: 1, y: 0.5) + button.configurationUpdateHandler = { [weak self] button in + guard let self = self else { return } + guard let button = button as? FAGradientButton else { return } + + if button.isEnabled { + button.fa_colors = [UIColor._53_A_2_F_1.cgColor, UIColor.C_5_DDF_5.cgColor] + + let coinImage = UIImage(named: "coins_icon_03")! + let coinText = NSTextAttachment(image: coinImage) + coinText.bounds = .init(x: 0, y: -2.5, width: coinImage.size.width, height: coinImage.size.height) + let coinAtt = AttributedString(NSAttributedString(attachment: coinText)) + let countAtt = AttributedString(" \(self.model?.receive_coins ?? 0)", attributes: AttributeContainer([ + .font : UIFont.font(ofSize: 12, weight: .bold), + .foregroundColor : UIColor._000000.withAlphaComponent(0.5) + ])) + + + button.configuration?.attributedTitle = AttributedString("Claim".localized, attributes: AttributeContainer([ + .font : UIFont.font(ofSize: 14, weight: .bold), + .foregroundColor : UIColor._114_CEE + ])) + + button.configuration?.attributedSubtitle = coinAtt + countAtt + + } else { + button.fa_colors = [UIColor.BCBCBC.cgColor, UIColor.BCBCBC.cgColor] + button.configuration?.attributedTitle = AttributedString("Claim".localized, attributes: AttributeContainer([ + .font : UIFont.font(ofSize: 14, weight: .bold), + .foregroundColor : UIColor.FFFFFF_0_8 + ])) + + button.configuration?.attributedSubtitle = nil + } + + + } + return button + }() + + override init(frame: CGRect) { + super.init(frame: frame) + + fa_setupLayout() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + +} + +extension FACoinsPackClaimListCell { + + private func fa_setupLayout() { + contentView.addSubview(bgView) + bgView.addSubview(bgIconImageView5) + bgView.addSubview(bgIconImageView4) + bgView.addSubview(bgIconImageView1) + bgView.addSubview(bgIconImageView2) + bgView.addSubview(titleLabel) + bgView.addSubview(lineView1) + bgView.addSubview(lineView2) + bgView.addSubview(coinsView1) + bgView.addSubview(coinsView2) + bgView.addSubview(claimButton) + + bgView.snp.makeConstraints { make in + make.edges.equalToSuperview() + } + + bgIconImageView1.snp.makeConstraints { make in + make.left.top.equalToSuperview() + } + + bgIconImageView2.snp.makeConstraints { make in + make.centerY.equalToSuperview() + make.right.equalToSuperview().offset(-8) + } + + bgIconImageView4.snp.makeConstraints { make in + make.top.equalToSuperview() + make.centerX.equalTo(bgIconImageView2) + } + + bgIconImageView5.snp.makeConstraints { make in + make.bottom.equalToSuperview() + make.left.equalToSuperview().offset(0) + } + + titleLabel.snp.makeConstraints { make in + make.left.equalToSuperview().offset(12) + make.centerY.equalTo(self.bgView.snp.top).offset(25) + make.right.lessThanOrEqualToSuperview().offset(-12) + } + + lineView1.snp.makeConstraints { make in + make.left.equalToSuperview().offset(12) + make.centerX.equalToSuperview() + make.top.equalToSuperview().offset(48) + } + + coinsView1.snp.makeConstraints { make in + make.left.equalToSuperview().offset(12) + make.bottom.equalToSuperview().offset(-18) + } + + lineView2.snp.makeConstraints { make in + make.centerY.equalTo(coinsView1) + make.left.equalTo(coinsView1.snp.right).offset(12) + } + + coinsView2.snp.makeConstraints { make in + make.centerY.equalTo(coinsView1) + make.left.equalTo(lineView2.snp.right).offset(12) + } + + claimButton.snp.makeConstraints { make in + make.right.equalToSuperview().offset(-12) + make.centerY.equalTo(coinsView1) + make.height.equalTo(48) + make.width.equalTo(120) + } + } + +} + +extension FACoinsPackClaimListCell { + + class CoinsView: UIView { + + var title: String? { + didSet { + titleLabel.text = title + } + } + + var coins: Int? { + didSet { + coinsLabel.text = "\(coins ?? 0)" + } + } + + private lazy var titleLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: 12, weight: .bold) + label.textColor = .DFEFFF + return label + }() + + private lazy var iconImageView = UIImageView(image: UIImage(named: "coins_icon_03")) + + private lazy var coinsLabel: UILabel = { + let label = FALabel() + label.font = .font(ofSize: 14, weight: .bold) + label.textColors = [UIColor.FFCE_63.cgColor, UIColor.FFE_1_AA.cgColor] + label.textStartPoint = .init(x: 0, y: 0.5) + label.textEndPoint = .init(x: 1, y: 0.5) + label.text = "0" + return label + }() + + override init(frame: CGRect) { + super.init(frame: frame) + addSubview(titleLabel) + addSubview(iconImageView) + addSubview(coinsLabel) + + titleLabel.snp.makeConstraints { make in + make.left.equalToSuperview() + make.top.equalToSuperview() + make.right.lessThanOrEqualToSuperview() + } + + iconImageView.snp.makeConstraints { make in + make.left.equalToSuperview() + make.bottom.equalToSuperview() + make.top.equalTo(titleLabel.snp.bottom).offset(8) + } + + coinsLabel.snp.makeConstraints { make in + make.centerY.equalTo(iconImageView) + make.left.equalTo(iconImageView.snp.right).offset(4) + make.right.lessThanOrEqualToSuperview() + } + } + + @MainActor required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + } + +} diff --git a/Fableon/Object/Class/Me/V/FACoinsPackClaimListView.swift b/Fableon/Object/Class/Me/V/FACoinsPackClaimListView.swift new file mode 100644 index 0000000..a497b53 --- /dev/null +++ b/Fableon/Object/Class/Me/V/FACoinsPackClaimListView.swift @@ -0,0 +1,106 @@ +// +// FACoinsPackClaimListView.swift +// Fableon +// +// Created by 湖北秦九 on 2025/10/29. +// + +import UIKit + +class FACoinsPackClaimListView: UIView { + + var clickClaimButton: ((_ id: String?) -> Void)? + + var dataArr: [FACoinsPackReceiveModel] = [] { + didSet { + collectionView.reloadData() + } + } + + private lazy var titleView: FACoinPackTitleView = { + let view = FACoinPackTitleView() + view.dotColor = .C_5_DDF_5 + view.textColors = [UIColor.C_5_DDF_5.cgColor, UIColor.C_5_DDF_5.cgColor] + view.font = .font(ofSize: 14, weight: .regular) + view.text = "Active Refills".localized.uppercased() + return view + }() + + private lazy var collectionViewLayout: UICollectionViewFlowLayout = { + let layout = UICollectionViewFlowLayout() + layout.itemSize = .init(width: UIScreen.width - 32, height: 122) + layout.minimumLineSpacing = 12 + return layout + }() + + private lazy var collectionView: FACollectionView = { + let collectionView = FACollectionView(frame: .zero, collectionViewLayout: collectionViewLayout) + collectionView.delegate = self + collectionView.dataSource = self + collectionView.addObserver(self, forKeyPath: "contentSize", context: nil) + collectionView.register(FACoinsPackClaimListCell.self, forCellWithReuseIdentifier: "cell") + return collectionView + }() + + deinit { + collectionView.removeObserver(self, forKeyPath: "contentSize") + } + + override init(frame: CGRect) { + super.init(frame: frame) + + fa_setupLayout() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { + if keyPath == "contentSize" { + let height = self.collectionView.contentSize.height + 1 + collectionView.snp.updateConstraints { make in + make.height.equalTo(height) + } + } + } + +} + +extension FACoinsPackClaimListView { + + private func fa_setupLayout() { + addSubview(titleView) + addSubview(collectionView) + + titleView.snp.makeConstraints { make in + make.top.equalToSuperview() + make.centerX.equalToSuperview() + } + + collectionView.snp.makeConstraints { make in + make.left.right.bottom.equalToSuperview() + make.top.equalToSuperview().offset(30) + make.height.equalTo(1) + make.bottom.equalToSuperview() + } + } +} + +//MARK: UICollectionViewDelegate UICollectionViewDataSource +extension FACoinsPackClaimListView: UICollectionViewDelegate, UICollectionViewDataSource { + + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! FACoinsPackClaimListCell + cell.model = self.dataArr[indexPath.row] + cell.clickClaimButton = { [weak self] id in + self?.clickClaimButton?(id) + } + return cell + } + + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return dataArr.count + } + +} diff --git a/Fableon/Object/Class/Me/V/FALoginView.swift b/Fableon/Object/Class/Me/V/FALoginView.swift new file mode 100644 index 0000000..0063ef5 --- /dev/null +++ b/Fableon/Object/Class/Me/V/FALoginView.swift @@ -0,0 +1,121 @@ +// +// FALoginView.swift +// Fableon +// +// Created by 湖北秦九 on 2025/10/30. +// + +import UIKit + +class FALoginView: FAPanModalContentView { + + + private lazy var bgView = UIImageView(image: UIImage(named: "弹窗背景色")) + private lazy var bgIconImageView = UIImageView(image: UIImage(named: "Ellipse 873")) + private lazy var logoImageView = UIImageView(image: UIImage(named: "logo_image_02")) + + private lazy var stackView: UIStackView = { + let view = UIStackView(arrangedSubviews: [appleButton, facebookButton]) + view.axis = .vertical + view.spacing = 18 + return view + }() + + private lazy var appleButton: UIButton = { + let button = self.createButton(image: UIImage(named: "apple_logo_icon_01"), title: "Login with Apple".localized) + button.addAction(UIAction(handler: { [weak self] _ in + self?.login(type: .apple) + }), for: .touchUpInside) + return button + }() + + private lazy var facebookButton: UIButton = { + let button = self.createButton(image: UIImage(named: "facebook_logo_icon_01"), title: "Login with Facebook".localized) + button.addAction(UIAction(handler: { [weak self] _ in + self?.login(type: .faceBook) + }), for: .touchUpInside) + return button + }() + + + override init(frame: CGRect) { + super.init(frame: frame) + backgroundColor = .clear + contentHeight = 300 + fa_setupLayout() + } + + @MainActor required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func cornerRadius() -> CGFloat { + return 0 + } + + private func createButton(image: UIImage?, title: String) -> UIButton { + var config = UIButton.Configuration.plain() + config.image = image + config.imagePadding = 12 + config.attributedTitle = AttributedString(title, attributes: AttributeContainer([ + .font : UIFont.font(ofSize: 14, weight: .bold), + .foregroundColor : UIColor._333333 + ])) + config.background.backgroundColor = .FFFFFF + + let button = UIButton(configuration: config) + button.layer.cornerRadius = 24 + button.layer.masksToBounds = true + + button.snp.makeConstraints { make in + make.height.equalTo(48) + } + + return button + } + + private func login(type: FALogin.LoginType) { + FAHUD.show() + FALogin.manager.thirdLogin(type: type, presentingViewController: nil) { [weak self] isFinish in + FAHUD.dismiss() + guard let self = self else { return } + if isFinish { + Task { + await self.dismiss(animated: true) + } + } + } + + } + +} + +extension FALoginView { + + private func fa_setupLayout() { + addSubview(bgView) + bgView.addSubview(bgIconImageView) + bgView.addSubview(logoImageView) + addSubview(stackView) + + bgView.snp.makeConstraints { make in + make.edges.equalToSuperview() + } + + bgIconImageView.snp.makeConstraints { make in + make.top.centerX.equalToSuperview() + } + + logoImageView.snp.makeConstraints { make in + make.centerX.equalToSuperview() + make.top.equalToSuperview().offset(20) + } + + stackView.snp.makeConstraints { make in + make.top.equalToSuperview().offset(112) + make.left.equalToSuperview().offset(37) + make.centerX.equalToSuperview() + } + } + +} diff --git a/Fableon/Object/Class/Me/V/FAMeCoinsPackButton.swift b/Fableon/Object/Class/Me/V/FAMeCoinsPackButton.swift new file mode 100644 index 0000000..5a338f3 --- /dev/null +++ b/Fableon/Object/Class/Me/V/FAMeCoinsPackButton.swift @@ -0,0 +1,95 @@ +// +// FAMeCoinsPackButton.swift +// Fableon +// +// Created by 湖北秦九 on 2025/10/29. +// + +import UIKit + +class FAMeCoinsPackButton: UIControl { + + private lazy var bgView: FAGradientView = { + let view = FAGradientView() + view.isUserInteractionEnabled = false + view.fa_colors = [UIColor._114_CEE.cgColor, UIColor._000000.cgColor] + view.fa_locations = [0, 1] + view.fa_startPoint = .init(x: 0, y: 0.5) + view.fa_endPoint = .init(x: 1, y: 0.5) + view.layer.cornerRadius = 12 + view.layer.masksToBounds = true + view.layer.borderWidth = 1 + view.layer.borderColor = UIColor._629_DFA.cgColor + return view + }() + + private lazy var iconImageView: UIImageView = { + let imageView = UIImageView(image: UIImage(named: "礼物11")) + return imageView + }() + + private lazy var titleLabel: FALabel = { + let label = FALabel() + label.font = .font(ofSize: 14, weight: .init(900)).withBoldItalic() + label.textColors = [UIColor._53_A_2_F_1.cgColor, UIColor.C_5_DDF_5.cgColor] + label.textStartPoint = .init(x: 0, y: 0.5) + label.textEndPoint = .init(x: 0.7, y: 0.5) + label.text = "Daily reward ready!".localized + return label + }() + + private lazy var subtitleLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: 12, weight: .medium).withBoldItalic() + label.textColor = .FFFFFF + label.text = "Claim your rewards now.".localized + return label + }() + + private lazy var indicatorImageView = UIImageView(image: UIImage(named: "arrow")) + + override init(frame: CGRect) { + super.init(frame: frame) + fa_setupLayout() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +extension FAMeCoinsPackButton { + + private func fa_setupLayout() { + addSubview(bgView) + bgView.addSubview(iconImageView) + bgView.addSubview(titleLabel) + bgView.addSubview(subtitleLabel) + bgView.addSubview(indicatorImageView) + + bgView.snp.makeConstraints { make in + make.edges.equalToSuperview() + } + + iconImageView.snp.makeConstraints { make in + make.centerY.equalToSuperview() + make.left.equalToSuperview().offset(12) + } + + titleLabel.snp.makeConstraints { make in + make.top.equalToSuperview().offset(13) + make.left.equalTo(iconImageView.snp.right).offset(8) + } + + subtitleLabel.snp.makeConstraints { make in + make.left.equalTo(titleLabel) + make.bottom.equalToSuperview().offset(-13) + } + + indicatorImageView.snp.makeConstraints { make in + make.centerY.equalToSuperview() + make.right.equalToSuperview().offset(-12) + } + } + +} diff --git a/Fableon/Object/Class/Me/V/FAMeHeaderView.swift b/Fableon/Object/Class/Me/V/FAMeHeaderView.swift index 73950e4..95ef447 100644 --- a/Fableon/Object/Class/Me/V/FAMeHeaderView.swift +++ b/Fableon/Object/Class/Me/V/FAMeHeaderView.swift @@ -9,7 +9,7 @@ import UIKit class FAMeHeaderView: UIView { - var contentHeight: CGFloat = 40 + 66 + 40 + 28 + 24 + var contentHeight: CGFloat = 40 + 66 + 40 + 28 + 16 + 60 + 16 var userInfo: FAUserInfo? { didSet { @@ -22,6 +22,8 @@ class FAMeHeaderView: UIView { coinsView.count = userInfo?.coin_left_total ?? 0 bonusCoinsView.count = userInfo?.send_coin_left_total ?? 0 + + loginButton.isHidden = FALogin.manager.isLogin } } @@ -69,6 +71,32 @@ class FAMeHeaderView: UIView { return view }() + private lazy var coinPackButton: FAMeCoinsPackButton = { + let button = FAMeCoinsPackButton() + button.addAction(UIAction(handler: { [weak self] _ in + guard let self = self else { return } + let vc = FACoinPackViewController() + self.viewController?.navigationController?.pushViewController(vc, animated: true) + }), for: .touchUpInside) + return button + }() + + private lazy var loginButton: UIButton = { + let button = UIButton(type: .custom, primaryAction: UIAction(handler: { [weak self] _ in + guard let self = self else { return } + let view = FALoginView() + view.present(in: nil) + })) + button.layer.cornerRadius = 14 + button.layer.masksToBounds = true + button.layer.borderWidth = 1 + button.layer.borderColor = UIColor.FFFEE_9.cgColor + button.setTitle("Log in".localized, for: .normal) + button.setTitleColor(.FFFFFF, for: .normal) + button.titleLabel?.font = .font(ofSize: 14, weight: .medium) + return button + }() + override init(frame: CGRect) { super.init(frame: frame) @@ -88,6 +116,8 @@ extension FAMeHeaderView { addSubview(idLabel) addSubview(coinsView) addSubview(bonusCoinsView) + addSubview(coinPackButton) + addSubview(loginButton) avatarImageView.snp.makeConstraints { make in make.left.equalToSuperview().offset(16) @@ -115,6 +145,20 @@ extension FAMeHeaderView { make.top.equalTo(coinsView) make.left.equalTo(coinsView.snp.right).offset(40) } + + coinPackButton.snp.makeConstraints { make in + make.left.equalToSuperview().offset(16) + make.centerX.equalToSuperview() + make.top.equalTo(coinsView.snp.bottom).offset(16) + make.height.equalTo(60) + } + + loginButton.snp.makeConstraints { make in + make.right.equalToSuperview().offset(-16) + make.centerY.equalTo(avatarImageView) + make.width.equalTo(76) + make.height.equalTo(28) + } } } diff --git a/Fableon/Object/Class/Me/V/FASettingCell.swift b/Fableon/Object/Class/Me/V/FASettingCell.swift new file mode 100644 index 0000000..13ab00a --- /dev/null +++ b/Fableon/Object/Class/Me/V/FASettingCell.swift @@ -0,0 +1,26 @@ +// +// FASettingCell.swift +// Fableon +// +// Created by 湖北秦九 on 2025/10/30. +// + +import UIKit + +class FASettingCell: FATableViewCell { + + + @IBOutlet weak var titleLabel: UILabel! + + override func awakeFromNib() { + super.awakeFromNib() + + } + + override func setSelected(_ selected: Bool, animated: Bool) { + super.setSelected(selected, animated: animated) + + // Configure the view for the selected state + } + +} diff --git a/Fableon/Object/Class/Me/V/FASettingCell.xib b/Fableon/Object/Class/Me/V/FASettingCell.xib new file mode 100644 index 0000000..64905fa --- /dev/null +++ b/Fableon/Object/Class/Me/V/FASettingCell.xib @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Fableon/Object/Class/Me/V/FASettingFooterView.swift b/Fableon/Object/Class/Me/V/FASettingFooterView.swift new file mode 100644 index 0000000..33bba15 --- /dev/null +++ b/Fableon/Object/Class/Me/V/FASettingFooterView.swift @@ -0,0 +1,48 @@ +// +// FASettingFooterView.swift +// Fableon +// +// Created by 湖北秦九 on 2025/10/30. +// + +import UIKit + +class FASettingFooterView: UIView { + + + private lazy var logoutButton: UIButton = { + let button = FAGradientButton(type: .custom, primaryAction: UIAction(handler: { [weak self] _ in + guard let self = self else { return } + FALogin.manager.logout(completer: nil) + })) + button.layer.cornerRadius = 24 + button.layer.masksToBounds = true + button.fa_colors = [UIColor.BEDFFF.cgColor, UIColor._52_A_2_F_1.cgColor] + button.fa_locations = [0, 1] + button.fa_startPoint = .init(x: 0, y: 0.5) + button.fa_endPoint = .init(x: 1, y: 0.5) + button.setTitle("Log out".localized, for: .normal) + button.setTitleColor(._000000, for: .normal) + button.titleLabel?.font = .font(ofSize: 18, weight: .semibold) + return button + }() + + override init(frame: CGRect) { + super.init(frame: frame) + + addSubview(logoutButton) + + logoutButton.snp.makeConstraints { make in + make.left.equalToSuperview().offset(16) + make.centerX.equalToSuperview() + make.bottom.equalToSuperview() + make.height.equalTo(48) + } + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + + diff --git a/Fableon/Object/Class/MyShort/C/FACollectViewController.swift b/Fableon/Object/Class/MyShort/C/FACollectViewController.swift index a42dcf1..30230d4 100644 --- a/Fableon/Object/Class/MyShort/C/FACollectViewController.swift +++ b/Fableon/Object/Class/MyShort/C/FACollectViewController.swift @@ -122,6 +122,22 @@ class FACollectViewController: FAViewController { } } + private func removeCollect(_ indexPath: IndexPath) { + + let alert = FARemoveCollectAlert() + alert.show() + alert.clickHighlightButton = { [weak self] in + guard let self = self else { return } + let model = self.dataArr[indexPath.row] + guard let shortPlayId = model.short_play_id else { return } + FAAPI.requestShortCollect(isCollect: false, shortPlayId: shortPlayId, videoId: model.short_play_video_id) { [weak self] in + guard let self = self else { return } + self.dataArr.remove(at: indexPath.row) + self.collectionView.deleteItems(at: [indexPath]) + } + } + } + } extension FACollectViewController { @@ -147,13 +163,10 @@ extension FACollectViewController: UICollectionViewDataSource, UICollectionViewD cell.clickDeleteButton = { [weak self] cell in guard let self = self else { return } guard let indexPath = self.collectionView.indexPath(for: cell) else { return } - guard let shortPlayId = cell.model?.short_play_id else { return } - FAAPI.requestShortCollect(isCollect: false, shortPlayId: shortPlayId, videoId: cell.model?.short_play_video_id) { [weak self] in - guard let self = self else { return } - self.dataArr.remove(at: indexPath.row) - self.collectionView.deleteItems(at: [indexPath]) - } + self.removeCollect(indexPath) + + } return cell } diff --git a/Fableon/Object/Class/Player/V/FAEpSelectorView.swift b/Fableon/Object/Class/Player/V/FAEpSelectorView.swift index e8ba2a3..58f960a 100644 --- a/Fableon/Object/Class/Player/V/FAEpSelectorView.swift +++ b/Fableon/Object/Class/Player/V/FAEpSelectorView.swift @@ -173,12 +173,24 @@ extension FAEpSelectorView: UICollectionViewDelegate, UICollectionViewDataSource } func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { - model?.episodeList?.count ?? 0 + return model?.episodeList?.count ?? 0 } func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + guard let epList = self.model?.episodeList else { return } if self.selectedIndex == indexPath.row { return } - self.selectedIndex = indexPath.row + + let lastIndex = indexPath.row - 1 + var lastIsLock = false + if lastIndex > 0 && lastIndex < epList.count { + let lastModel = epList[lastIndex] + lastIsLock = lastModel.is_lock ?? false + } + + if lastIsLock { + FAToast.show(text: "buy_fail_toast_02".localized) + return + } self.didSelected?(indexPath.row) self.dismiss(animated: true) { diff --git a/Fableon/Object/Class/Player/V/FAOldVideoRechargeView.swift b/Fableon/Object/Class/Player/V/FAOldVideoRechargeView.swift index 8dfb6d9..98a494a 100644 --- a/Fableon/Object/Class/Player/V/FAOldVideoRechargeView.swift +++ b/Fableon/Object/Class/Player/V/FAOldVideoRechargeView.swift @@ -11,6 +11,7 @@ import HWPanModal class FAOldVideoRechargeView: FAPanModalContentView { var buyFinishHandle: (() -> Void)? + var didDismissHandle: (() -> Void)? var model: FAPayDateModel? { didSet { @@ -35,7 +36,7 @@ class FAOldVideoRechargeView: FAPanModalContentView { } } -// self.stackView.addArrangedSubview(self.tipView) + self.stackView.addArrangedSubview(self.tipView) self.setNeedsLayoutUpdate() } @@ -62,6 +63,7 @@ class FAOldVideoRechargeView: FAPanModalContentView { Task { await self.dismiss(animated: true) } + self.didDismissHandle?() })) button.setImage(UIImage(named: "close_icon_02"), for: .normal) return button @@ -123,6 +125,42 @@ class FAOldVideoRechargeView: FAPanModalContentView { return label }() + private lazy var tipView: UIView = { + let view = UIView() + view.addSubview(tipTitleLabel) + view.addSubview(tipTextLabel) + + tipTitleLabel.snp.makeConstraints { make in + make.top.equalToSuperview().offset(7) + make.left.equalToSuperview().offset(16) + } + + tipTextLabel.snp.makeConstraints { make in + make.left.equalToSuperview().offset(16) + make.right.lessThanOrEqualToSuperview().offset(-16) + make.top.equalTo(tipTitleLabel.snp.bottom).offset(4) + make.bottom.equalToSuperview() + } + return view + }() + + private lazy var tipTitleLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: 12, weight: .medium) + label.textColor = .FFFFFF + label.text = "store_tips_title".localized + return label + }() + + private lazy var tipTextLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: 10, weight: .regular) + label.textColor = .FFFFFF + label.text = "store_tips".localized + label.numberOfLines = 0 + return label + }() + deinit { NotificationCenter.default.removeObserver(self) } diff --git a/Fableon/Object/Class/Player/VM/FAShortDetailViewModel.swift b/Fableon/Object/Class/Player/VM/FAShortDetailViewModel.swift index d6a8cf7..0d1bde7 100644 --- a/Fableon/Object/Class/Player/VM/FAShortDetailViewModel.swift +++ b/Fableon/Object/Class/Player/VM/FAShortDetailViewModel.swift @@ -171,6 +171,10 @@ extension FAShortDetailViewModel { guard let self = self else { return } self.requestDetailData(indexPath: self.currentIndexPath, completer: nil) } + view.didDismissHandle = { [weak self] in + guard let self = self else { return } + self._showVipRetainAlert(videoInfo) + } view.present(in: nil) self.popView = view } @@ -182,6 +186,25 @@ extension FAShortDetailViewModel { view.present(in: nil) self.popView = view } + + private func _showVipRetainAlert(_ videoInfo: FAVideoInfoModel) { + + + payDataRequest = FAPayDataRequest() + + payDataRequest?.requestVipRetainPayInfo { [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 { diff --git a/Fableon/Object/Class/Store/M/FACoinPackCanReceiveModel.swift b/Fableon/Object/Class/Store/M/FACoinPackCanReceiveModel.swift new file mode 100644 index 0000000..914c886 --- /dev/null +++ b/Fableon/Object/Class/Store/M/FACoinPackCanReceiveModel.swift @@ -0,0 +1,13 @@ +// +// FACoinPackCanReceiveModel.swift +// Fableon +// +// Created by 湖北秦九 on 2025/10/30. +// + +import UIKit +import SmartCodable + +struct FACoinPackCanReceiveModel: SmartCodable { + var coins: Int? +} diff --git a/Fableon/Object/Class/Store/M/FACoinsPackModel.swift b/Fableon/Object/Class/Store/M/FACoinsPackModel.swift new file mode 100644 index 0000000..ece9d10 --- /dev/null +++ b/Fableon/Object/Class/Store/M/FACoinsPackModel.swift @@ -0,0 +1,25 @@ +// +// FACoinsPackModel.swift +// Fableon +// +// Created by 湖北秦九 on 2025/10/29. +// + +import UIKit +import SmartCodable + +struct FACoinsPackModel: SmartCodable { + + //当前可领取订阅数 + var receive_count: Int? + //已领取累计金币总数 + var week_total: Int? + //剩余可领取金币数 + var week_remaining_total: Int? + //订阅可领取累计金币总数 + var week_max_total: Int? + //当前可领取金币总数 + var receive_coins: Int? + + var receive_list: [FACoinsPackReceiveModel]? +} diff --git a/Fableon/Object/Class/Store/M/FACoinsPackReceiveModel.swift b/Fableon/Object/Class/Store/M/FACoinsPackReceiveModel.swift new file mode 100644 index 0000000..25e0333 --- /dev/null +++ b/Fableon/Object/Class/Store/M/FACoinsPackReceiveModel.swift @@ -0,0 +1,25 @@ +// +// FACoinsPackReceiveModel.swift +// Fableon +// +// Created by 湖北秦九 on 2025/10/29. +// + +import UIKit +import SmartCodable + +struct FACoinsPackReceiveModel: SmartCodable { + + var id: String? + var title: String? + //剩余可领取金币数 + var week_remaining_total: Int? + //当前可领取金币数 + var receive_coins: Int? + //已领取累计金币总数 + var week_total: Int? + //可领取累计金币总数 + var week_max_total: Int? + //领取天数文本 + var day_text: String? +} diff --git a/Fableon/Object/Libs/AdjustStateManager/FAAdjustStateManager.swift b/Fableon/Object/Libs/AdjustStateManager/FAAdjustStateManager.swift index c70e7ae..2db0040 100644 --- a/Fableon/Object/Libs/AdjustStateManager/FAAdjustStateManager.swift +++ b/Fableon/Object/Libs/AdjustStateManager/FAAdjustStateManager.swift @@ -10,14 +10,15 @@ import UIKit class FAAdjustStateManager { static let manager = FAAdjustStateManager() + var allowOpenMessage = true + var webpageURL: URL? ///是否需要重试 var isNeedRetry = false - var allowOpenMessage = true - var isOpenApp = false var idfaAuthorizationFinish = false + var apnsAuthorizationFinish = false } diff --git a/Fableon/Object/Libs/Alert/FAApnsAlert.swift b/Fableon/Object/Libs/Alert/FAApnsAlert.swift new file mode 100644 index 0000000..5939040 --- /dev/null +++ b/Fableon/Object/Libs/Alert/FAApnsAlert.swift @@ -0,0 +1,104 @@ +// +// FAApnsAlert.swift +// Fableon +// +// Created by 湖北秦九 on 2025/10/31. +// + +import UIKit + +class FAApnsAlert: FABaseAlert { + + private lazy var imageView = UIImageView(image: UIImage(named: "__magnifying")) + + private lazy var titleLabel: UILabel = { + let label = UILabel() + label.textAlignment = .center + label.numberOfLines = 0 + label.font = .font(ofSize: 18, weight: .semibold) + label.textColor = .FFFFFF + label.text = "apns_alert_title".localized + return label + }() + + private lazy var textLabel: UILabel = { + let label = UILabel() + label.textAlignment = .center + label.numberOfLines = 0 + label.font = .font(ofSize: 12, weight: .regular) + label.textColor = .FFFFFF + label.text = "apns_alert_text".localized + return label + }() + + private lazy var laterButton: UIButton = { + let button = UIButton(type: .custom) + button.layer.cornerRadius = 18 + button.layer.masksToBounds = true + button.layer.borderWidth = 1 + button.layer.borderColor = UIColor.FFFFFF.cgColor + button.setTitle("Later".localized, for: .normal) + button.setTitleColor(.FFFFFF, for: .normal) + button.titleLabel?.font = .font(ofSize: 14, weight: .semibold) + button.addTarget(self, action: #selector(dismiss), for: .touchUpInside) + return button + }() + + override init(frame: CGRect) { + super.init(frame: frame) + highlightButton.setTitle("Open".localized, for: .normal) + + fa_setupLayout() + } + + @MainActor required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func handleHighlightButton() { + super.handleHighlightButton() + FATool.openApnsSetting() + } + +} + +extension FAApnsAlert { + + private func fa_setupLayout() { + containerView.addSubview(imageView) + contentView.addSubview(titleLabel) + contentView.addSubview(textLabel) + contentView.addSubview(laterButton) + contentView.addSubview(highlightButton) + + imageView.snp.makeConstraints { make in + make.centerX.equalToSuperview() + make.top.equalToSuperview().offset(-62) + } + + titleLabel.snp.makeConstraints { make in + make.centerX.equalToSuperview() + make.right.lessThanOrEqualToSuperview().offset(-10) + make.top.equalTo(imageView.snp.bottom).offset(10) + } + + textLabel.snp.makeConstraints { make in + make.centerX.equalToSuperview() + make.right.lessThanOrEqualToSuperview().offset(-20) + make.top.equalTo(titleLabel.snp.bottom).offset(12) + } + + laterButton.snp.makeConstraints { make in + make.left.equalToSuperview().offset(23) + make.top.equalTo(textLabel.snp.bottom).offset(21) + make.bottom.equalToSuperview().offset(-20) + make.height.equalTo(36) + } + + highlightButton.snp.makeConstraints { make in + make.width.height.top.equalTo(laterButton) + make.left.equalTo(laterButton.snp.right).offset(11) + make.right.equalToSuperview().offset(-23) + } + } +} diff --git a/Fableon/Object/Libs/Alert/FABaseAlert.swift b/Fableon/Object/Libs/Alert/FABaseAlert.swift new file mode 100644 index 0000000..c53e59a --- /dev/null +++ b/Fableon/Object/Libs/Alert/FABaseAlert.swift @@ -0,0 +1,169 @@ +// +// FABaseAlert.swift +// Fableon +// +// Created by 湖北秦九 on 2025/10/30. +// + +import UIKit +import SnapKit + +class FABaseAlert: UIView { + + var clickHighlightButton: (() -> Void)? + + var contentWidth: CGFloat = UIScreen.width - 70 { + didSet { + containerView.snp.updateConstraints { make in + make.width.equalTo(contentWidth) + } + } + } + + private(set) var containerView: UIView = { + let view = UIView() + return view + }() + + private(set) var contentView: UIView = { + let view = UIView() + view.backgroundColor = ._404040 + view.layer.cornerRadius = 16 + view.layer.masksToBounds = true + return view + }() + + private(set) lazy var closeButton: UIButton = { + let button = UIButton(type: .custom) + button.setImage(UIImage(named: "close_icon_03"), for: .normal) + button.addTarget(self, action: #selector(dismiss), for: .touchUpInside) + return button + }() + + lazy var highlightButton: FAGradientButton = { + let button = FAGradientButton(type: .custom) + button.fa_colors = [UIColor.BEDFFF.cgColor, UIColor._52_A_2_F_1.cgColor] + button.fa_locations = [0, 1] + button.fa_startPoint = .init(x: 0, y: 0.5) + button.fa_endPoint = .init(x: 1, y: 0.5) + button.layer.cornerRadius = 16 + button.layer.masksToBounds = true + button.setTitleColor(._000000, for: .normal) + button.titleLabel?.font = .font(ofSize: 14, weight: .semibold) + button.addTarget(self, action: #selector(handleHighlightButton), for: .touchUpInside) + return button + }() + + override init(frame: CGRect) { + super.init(frame: frame) + backgroundColor = ._000000.withAlphaComponent(0.5) + + addSubview(containerView) + containerView.addSubview(contentView) + containerView.addSubview(closeButton) + + containerView.snp.makeConstraints { make in + make.center.equalToSuperview() + make.width.equalTo(contentWidth) + } + + contentView.snp.makeConstraints { make in + make.left.right.top.equalToSuperview() + make.bottom.equalToSuperview().offset(-66) + } + + closeButton.snp.makeConstraints { make in + make.centerX.equalToSuperview() + make.bottom.equalToSuperview() + } + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + @discardableResult + @objc func show(in view: UIView? = nil) -> Self { + guard self.superview == nil else { return self } + + var inView: UIView + if let view = view { + inView = view + } else { + inView = FABaseAlert.Window.manager.createWindow() + } + + inView.addSubview(self) + self.frame = inView.bounds + showAnimation() + + return self + } + @objc func dismiss() { + dismissAnimation() + } + + @objc func handleHighlightButton() { + self.dismissAnimation() + self.clickHighlightButton?() + } + +} + +extension FABaseAlert { + private func showAnimation() { + containerView.transform = CGAffineTransform(translationX: 0, y: 200) + + UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 0.7, initialSpringVelocity: 0) { + self.containerView.transform = CGAffineTransform.identity + } + } + + private func dismissAnimation() { + + UIView.animate(withDuration: 0.3) { + self.alpha = 0 + self.containerView.transform = CGAffineTransform(translationX: 0, y: 500) + } completion: { _ in + self.removeFromSuperview() + FABaseAlert.Window.manager.dismissWindow() + } + } +} + +extension FABaseAlert { + class Window { + static let manager = Window() + + private(set) var window: UIWindow? + + func createWindow() -> UIWindow { + guard let window = window else { + let window = UIWindow(windowScene: FATool.windowScene!) + window.backgroundColor = .clear + window.windowLevel = .alert + window.isHidden = false + self.window = window + return window + } + return window + } + + func dismissWindow() { + guard let window = self.window else { return } + + var isHidden = true + + window.subviews.forEach { + if $0.isKind(of: FABaseAlert.self) { + isHidden = false + } + } + if isHidden { + window.isHidden = true + self.window = nil + } + } + } +} + diff --git a/Fableon/Object/Libs/Alert/FACoinsPackAlert.swift b/Fableon/Object/Libs/Alert/FACoinsPackAlert.swift new file mode 100644 index 0000000..3bed598 --- /dev/null +++ b/Fableon/Object/Libs/Alert/FACoinsPackAlert.swift @@ -0,0 +1,117 @@ +// +// FACoinsPackAlert.swift +// Fableon +// +// Created by 湖北秦九 on 2025/10/30. +// + +import UIKit + +class FACoinsPackAlert: FABaseAlert { + + var coinsCount: Int? { + didSet { + coinsView.setNeedsUpdateConfiguration() + } + } + + private lazy var imageView = UIImageView(image: UIImage(named: "签到")) + + private lazy var titleLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: 18, weight: .bold) + label.textColor = .FFFFFF + label.textAlignment = .center + label.numberOfLines = 0 + label.text = "coins_pack_alert_title".localized + return label + }() + + private lazy var coinsView: UIButton = { + var config = UIButton.Configuration.plain() + config.image = UIImage(named: "coins_icon_10") + config.imagePadding = 8 + config.contentInsets = .zero + let button = UIButton(configuration: config) + button.isUserInteractionEnabled = false + button.configurationUpdateHandler = { [weak self] button in + guard let self = self else { return } + button.configuration?.attributedTitle = AttributedString("+\(self.coinsCount ?? 0)", attributes: AttributeContainer([ + .font : UIFont.font(ofSize: 24, weight: .init(700)), + .foregroundColor : UIColor.F_6_CF_87 + ])) + } + return button + }() + + private lazy var laterButton: UIButton = { + let button = UIButton(type: .custom) + button.layer.cornerRadius = 24 + button.layer.masksToBounds = true + button.layer.borderColor = UIColor._777777.cgColor + button.layer.borderWidth = 1 + button.setTitle("Later".localized, for: .normal) + button.setTitleColor(._777777, for: .normal) + button.titleLabel?.font = .font(ofSize: 14, weight: .bold) + button.addTarget(self, action: #selector(dismiss), for: .touchUpInside) + return button + }() + + override init(frame: CGRect) { + super.init(frame: frame) + + self.highlightButton.setTitle("Claim Now".localized, for: .normal) + self.highlightButton.setTitleColor(.FFFFFF, for: .normal) + self.highlightButton.fa_colors = [UIColor._53_A_2_F_1.cgColor, UIColor.C_5_DDF_5.cgColor] + self.highlightButton.layer.cornerRadius = 24 + self.highlightButton.titleLabel?.font = .font(ofSize: 14, weight: .bold) + + fa_setupLayout() + } + + @MainActor required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + +} + +extension FACoinsPackAlert { + + private func fa_setupLayout() { + contentView.addSubview(imageView) + contentView.addSubview(titleLabel) + contentView.addSubview(coinsView) + contentView.addSubview(highlightButton) + contentView.addSubview(laterButton) + + imageView.snp.makeConstraints { make in + make.centerX.equalToSuperview() + make.top.equalToSuperview().offset(24) + } + + titleLabel.snp.makeConstraints { make in + make.centerX.equalToSuperview() + make.right.lessThanOrEqualToSuperview().offset(-10) + make.top.equalTo(imageView.snp.bottom).offset(16) + } + + coinsView.snp.makeConstraints { make in + make.centerX.equalToSuperview() + make.top.equalTo(titleLabel.snp.bottom).offset(16) + } + + highlightButton.snp.makeConstraints { make in + make.left.equalToSuperview().offset(18) + make.centerX.equalToSuperview() + make.top.equalTo(coinsView.snp.bottom).offset(16) + make.height.equalTo(48) + } + + laterButton.snp.makeConstraints { make in + make.left.right.height.equalTo(highlightButton) + make.top.equalTo(highlightButton.snp.bottom).offset(12) + make.bottom.equalToSuperview().offset(-24) + } + } + +} diff --git a/Fableon/Object/Libs/Alert/FARemoveCollectAlert.swift b/Fableon/Object/Libs/Alert/FARemoveCollectAlert.swift new file mode 100644 index 0000000..a23141f --- /dev/null +++ b/Fableon/Object/Libs/Alert/FARemoveCollectAlert.swift @@ -0,0 +1,93 @@ +// +// FARemoveCollectAlert.swift +// Fableon +// +// Created by 湖北秦九 on 2025/10/30. +// + +import UIKit + +class FARemoveCollectAlert: FABaseAlert { + + + private lazy var imageView = UIImageView(image: UIImage(named: "alert_image_01")) + + private lazy var titleLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: 18, weight: .semibold) + label.textColor = .FFFFFF + label.text = "remove_collect_alert_title".localized + label.numberOfLines = 0 + label.textAlignment = .center + return label + }() + + private lazy var textLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: 12, weight: .regular) + label.textColor = .FFFFFF + label.numberOfLines = 0 + label.textAlignment = .center + label.text = "remove_collect_alert_text".localized + return label + }() + + private lazy var cancelButton: UIButton = { + let button = UIButton(type: .custom) + button.layer.cornerRadius = 18 + button.layer.masksToBounds = true + button.layer.borderWidth = 1 + button.layer.borderColor = UIColor.FFFFFF.cgColor + button.setTitle("Cancel".localized, for: .normal) + button.setTitleColor(.FFFFFF, for: .normal) + button.titleLabel?.font = .font(ofSize: 14, weight: .medium) + button.addTarget(self, action: #selector(dismiss), for: .touchUpInside) + return button + }() + + override init(frame: CGRect) { + super.init(frame: frame) + + highlightButton.setTitle("Remove".localized, for: .normal) + + containerView.addSubview(imageView) + contentView.addSubview(titleLabel) + contentView.addSubview(textLabel) + contentView.addSubview(cancelButton) + contentView.addSubview(highlightButton) + + imageView.snp.makeConstraints { make in + make.centerX.equalToSuperview() + make.top.equalToSuperview().offset(-62) + } + + titleLabel.snp.makeConstraints { make in + make.centerX.equalToSuperview() + make.top.equalTo(imageView.snp.bottom).offset(10) + make.right.lessThanOrEqualToSuperview().offset(-10) + } + + textLabel.snp.makeConstraints { make in + make.centerX.equalToSuperview() + make.right.lessThanOrEqualToSuperview().offset(-20) + make.top.equalTo(titleLabel.snp.bottom).offset(12) + } + + cancelButton.snp.makeConstraints { make in + make.left.equalToSuperview().offset(24) + make.top.equalTo(textLabel.snp.bottom).offset(21) + make.bottom.equalTo(-20) + make.height.equalTo(36) + } + + highlightButton.snp.makeConstraints { make in + make.left.equalTo(cancelButton.snp.right).offset(11) + make.right.equalToSuperview().offset(-24) + make.width.height.top.equalTo(cancelButton) + } + } + + @MainActor required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} diff --git a/Fableon/Object/Libs/Alert/FAVipRetainAlert.swift b/Fableon/Object/Libs/Alert/FAVipRetainAlert.swift new file mode 100644 index 0000000..4bd9f8c --- /dev/null +++ b/Fableon/Object/Libs/Alert/FAVipRetainAlert.swift @@ -0,0 +1,307 @@ +// +// FAVipRetainAlert.swift +// Fableon +// +// Created by 湖北秦九 on 2025/10/30. +// + +import UIKit + +class FAVipRetainAlert: FABaseAlert { + + var buyFinishHandle: (() -> Void)? + + var model: FAPayAlertModel? { + didSet { + let payItem = model?.info + titleView.text = payItem?.getVipTitle() + itemView.payItem = payItem + } + } + + var videoInfo: FAVideoInfoModel? + + + private lazy var titleView: FACoinPackTitleView = { + let view = FACoinPackTitleView() + view.dotColor = ._20_A_1_FF + view.textColors = [UIColor._53_A_2_F_1.cgColor, UIColor.C_5_DDF_5.cgColor] + view.font = .font(ofSize: 24, weight: .init(900)) + view.text = "Weekly Refill".localized.uppercased() + return view + }() + + private lazy var itemView: ItemView = { + let view = ItemView() + return view + }() + + private lazy var textLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: 18, weight: .bold).withBoldItalic() + label.textColor = .C_5_DDF_5 + label.text = "vip_retain_alert_text".localized + label.textAlignment = .center + label.numberOfLines = 0 + return label + }() + + private lazy var buyButton: UIButton = { + let button = FAGradientButton(type: .custom, primaryAction: UIAction(handler: { [weak self] _ in + guard let self = self else { return } + guard let payItem = self.model?.info else { return } + FAIapManager.manager.start(model: payItem, shortPlayId: self.videoInfo?.short_play_id, videoId: self.videoInfo?.short_play_video_id) { [weak self] finish in + guard let self = self else { return } + if finish { + FALogin.manager.requestUserInfo(completer: nil) + self.dismiss() + self.buyFinishHandle?() + } + } + + })) + button.layer.cornerRadius = 24 + button.layer.masksToBounds = true + button.fa_colors = [UIColor._53_A_2_F_1.cgColor, UIColor.C_5_DDF_5.cgColor] + button.fa_locations = [0, 1] + button.fa_startPoint = .init(x: 0, y: 0.5) + button.fa_endPoint = .init(x: 0.7, y: 0.5) + button.setTitle("Buy Now".localized, for: .normal) + button.setTitleColor(.FFFFFF, for: .normal) + button.titleLabel?.font = .font(ofSize: 14, weight: .bold) + return button + }() + + override init(frame: CGRect) { + super.init(frame: frame) + contentWidth = UIScreen.width - 55 + contentView.backgroundColor = .clear + + fa_setupLayout() + } + + @MainActor required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + +} + +extension FAVipRetainAlert { + + private func fa_setupLayout() { + contentView.addSubview(titleView) + contentView.addSubview(itemView) + contentView.addSubview(textLabel) + contentView.addSubview(buyButton) + + titleView.snp.makeConstraints { make in + make.top.equalToSuperview() + make.centerX.equalToSuperview() + } + + itemView.snp.makeConstraints { make in + make.left.right.equalToSuperview() + make.top.equalTo(titleView.snp.bottom).offset(12) + make.height.equalTo(84) + } + + textLabel.snp.makeConstraints { make in + make.centerX.equalToSuperview() + make.right.lessThanOrEqualToSuperview().offset(-10) + make.top.equalTo(itemView.snp.bottom).offset(12) + } + + buyButton.snp.makeConstraints { make in + make.left.equalToSuperview().offset(20) + make.centerX.equalToSuperview() + make.top.equalTo(textLabel.snp.bottom).offset(12) + make.height.equalTo(48) + make.bottom.equalToSuperview() + } + + } + +} + +extension FAVipRetainAlert { + + + + class ItemView: UIView { + + var payItem: FAPayItem? { + didSet { + nameLabel.text = payItem?.getVipTitle() + + button.setNeedsUpdateConfiguration() + } + } + + private lazy var bgView: FAGradientView = { + let view = FAGradientView() + view.fa_colors = [UIColor._524_B_8_E.cgColor, UIColor._303265.cgColor] + view.fa_locations = [0, 1] + view.fa_startPoint = .init(x: 0, y: 0.5) + view.fa_endPoint = .init(x: 1, y: 0.5) + view.layer.cornerRadius = 12 + view.layer.masksToBounds = true + view.layer.borderWidth = 1 + view.layer.borderColor = UIColor.E_5_E_5_E_5.cgColor + return view + }() + + private lazy var bgIconImageView1: UIImageView = { + let imageView = UIImageView(image: UIImage(named: "coin_attachment_01")) + return imageView + }() + + private lazy var bgIconImageView2: UIImageView = { + let imageView = UIImageView(image: UIImage(named: "coin_attachment_02")) + return imageView + }() + private lazy var bgIconImageView3 = UIImageView(image: UIImage(named: "coin_attachment_04")) + private lazy var bgIconImageView4 = UIImageView(image: UIImage(named: "coin_attachment_05")) + + private lazy var vipIconImageView = UIImageView(image: UIImage(named: "皇冠-金")) + + private lazy var nameLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: 18, weight: .bold) + label.textColor = .FFFFFF + return label + }() + + private lazy var textLabel: UILabel = { + let label = FALabel() + label.textColors = [UIColor._53_A_2_F_1.cgColor, UIColor.C_5_DDF_5.cgColor] + label.textStartPoint = .init(x: 0, y: 0.5) + label.textEndPoint = .init(x: 0.7, y: 0.5) + label.font = .font(ofSize: 12, weight: .regular) + return label + }() + + private lazy var button: UIButton = { + var config = UIButton.Configuration.plain() + config.contentInsets = .init(top: 0, leading: 10, bottom: 0, trailing: 10) + config.titleAlignment = .center + + let button = FAGradientButton(configuration: config) + button.isUserInteractionEnabled = false + button.fa_colors = [UIColor._53_A_2_F_1.cgColor, UIColor.C_5_DDF_5.cgColor] + button.fa_locations = [0, 1] + button.fa_startPoint = .init(x: 0, y: 0.5) + button.fa_endPoint = .init(x: 0.5, y: 0.5) + button.layer.cornerRadius = 24 + button.layer.masksToBounds = true + button.configurationUpdateHandler = { [weak self] button in + guard let self = self else { return } + + let currency = self.payItem?.currency ?? "" + let timeString = self.payItem?.getTimeString() ?? "" + let oldPrice = self.payItem?.price ?? "" + var discountPrice: String? = nil + + if self.payItem?.discount_type == 1, let introductoryPrice = self.payItem?.introductionaryOffer { + discountPrice = introductoryPrice.price.stringValue + } else if self.payItem?.discount_type == 2, let discount = self.payItem?.promotionalOffers?.first { + discountPrice = discount.price.stringValue + } + + if let discountPrice = discountPrice { + button.configuration?.attributedTitle = AttributedString("\(currency)\(discountPrice)", attributes: AttributeContainer([ + .font : UIFont.font(ofSize: 18, weight: .bold), + .foregroundColor : UIColor._114_CEE + ])) + + button.configuration?.attributedSubtitle = AttributedString("\(currency)\(oldPrice)", attributes: AttributeContainer([ + .font : UIFont.font(ofSize: 12, weight: .regular), + .foregroundColor : UIColor._000000.withAlphaComponent(0.5), + .strikethroughStyle: NSUnderlineStyle.single.rawValue, + .strikethroughColor: UIColor._000000.withAlphaComponent(0.5) + ])) + + } else { + button.configuration?.attributedTitle = AttributedString("\(currency)\(oldPrice)", attributes: AttributeContainer([ + .font : UIFont.font(ofSize: 18, weight: .bold), + .foregroundColor : UIColor._114_CEE + ])) + + button.configuration?.attributedSubtitle = AttributedString("/\(timeString)", attributes: AttributeContainer([ + .font : UIFont.font(ofSize: 12, weight: .regular), + .foregroundColor : UIColor._000000.withAlphaComponent(0.5) + ])) + } + + } + return button + }() + + override init(frame: CGRect) { + super.init(frame: frame) + nameLabel.text = "Weekly VIP" + textLabel.text = "Unlimited access to all series" + + addSubview(bgView) + bgView.addSubview(bgIconImageView4) + bgView.addSubview(bgIconImageView3) + bgView.addSubview(bgIconImageView1) + bgView.addSubview(bgIconImageView2) + bgView.addSubview(vipIconImageView) + bgView.addSubview(nameLabel) + bgView.addSubview(textLabel) + bgView.addSubview(button) + + bgView.snp.makeConstraints { make in + make.edges.equalToSuperview() + } + + bgIconImageView1.snp.makeConstraints { make in + make.left.equalToSuperview().offset(0) + make.top.equalToSuperview().offset(0) + } + + bgIconImageView2.snp.makeConstraints { make in + make.right.equalToSuperview().offset(-26) + make.centerY.equalToSuperview() + } + + bgIconImageView3.snp.makeConstraints { make in + make.centerY.equalToSuperview() + make.centerX.equalTo(bgIconImageView2) + } + + bgIconImageView4.snp.makeConstraints { make in + make.left.bottom.equalToSuperview() + } + + vipIconImageView.snp.makeConstraints { make in + make.left.equalToSuperview().offset(16) + make.top.equalToSuperview().offset(18) + } + + nameLabel.snp.makeConstraints { make in + make.centerY.equalTo(vipIconImageView) + make.left.equalTo(vipIconImageView.snp.right).offset(4) + } + + textLabel.snp.makeConstraints { make in + make.left.equalTo(vipIconImageView) + make.bottom.equalToSuperview().offset(-18) + } + + button.snp.makeConstraints { make in + make.centerY.equalToSuperview() + make.right.equalToSuperview().offset(-12) + make.height.equalTo(48) + make.width.greaterThanOrEqualTo(88) + } + + } + + @MainActor required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + } + +} diff --git a/Fableon/Object/Libs/FAIap/FAPayDataRequest.swift b/Fableon/Object/Libs/FAIap/FAPayDataRequest.swift index e68f8fd..c8d5397 100644 --- a/Fableon/Object/Libs/FAIap/FAPayDataRequest.swift +++ b/Fableon/Object/Libs/FAIap/FAPayDataRequest.swift @@ -83,25 +83,25 @@ class FAPayDataRequest: NSObject { } ///挽留信息 - func requestRetainVipPayInfo(completer: ((_ model: FAPayAlertModel?) -> Void)?) { + func requestVipRetainPayInfo(completer: ((_ model: FAPayAlertModel?) -> Void)?) { self.completerBlock = nil self.payAlertBlock = completer -// FAStoreAPI.requestRetainVipPayInfo { [weak self] model in -// guard let self = self else { return } -// guard let model = model else { -// self.payAlertBlock?(nil) -// return -// } -// self.payAlertModel = model -// -// let productId = BRIAP.manager.getProductId(templateId: model.info?.ios_template_id) ?? "" -// -// let set = Set([productId]) -// let productsRequest = SKProductsRequest(productIdentifiers: set) -// productsRequest.delegate = self -// productsRequest.start() -// } + FAStoreAPI.requestVipRetainPayInfo { [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() + } } } diff --git a/Fableon/Object/Libs/FALogin/FALogin+Apple.swift b/Fableon/Object/Libs/FALogin/FALogin+Apple.swift new file mode 100644 index 0000000..3c508c1 --- /dev/null +++ b/Fableon/Object/Libs/FALogin/FALogin+Apple.swift @@ -0,0 +1,115 @@ +// +// FALogin+Apple.swift +// Fableon +// +// Created by 湖北秦九 on 2025/10/30. +// + +import UIKit +import AuthenticationServices + +extension FALogin { + + private struct AssociatedKeys { + static var appleLoginHandle: Int? + } + + private var appleLoginHandle: ((_ model: FAThirdSignModel?) -> Void)? { + set { + objc_setAssociatedObject(self, &AssociatedKeys.appleLoginHandle, newValue, .OBJC_ASSOCIATION_COPY_NONATOMIC) + } + get { + return objc_getAssociatedObject(self, &AssociatedKeys.appleLoginHandle) as? ((_ model: FAThirdSignModel?) -> Void) + } + } + + func appleLogin(completer: ((_ model: FAThirdSignModel?) -> Void)?) { + self.appleLoginHandle = completer + + let appleIDProvider = ASAuthorizationAppleIDProvider() + let request = appleIDProvider.createRequest() + request.requestedScopes = [.fullName, .email] + + let authorizationController = ASAuthorizationController(authorizationRequests: [request]) + authorizationController.delegate = self + authorizationController.presentationContextProvider = self + authorizationController.performRequests() + } + + private func jwtDecode(jwtStr: String) -> [String: Any]? { + let segments = jwtStr.components(separatedBy: ".") + guard segments.count > 1 else { return nil } + + var base64String = segments[1] + + // 处理 Base64 补齐 + let requiredLength = 4 * Int(ceil(Double(base64String.count) / 4.0)) + let paddingLength = requiredLength - base64String.count + if paddingLength > 0 { + base64String += String(repeating: "=", count: paddingLength) + } + + // 替换 URL 安全字符 + base64String = base64String.replacingOccurrences(of: "-", with: "+") + base64String = base64String.replacingOccurrences(of: "_", with: "/") + + // 解码 Base64 数据 + guard let data = Data(base64Encoded: base64String), + let jsonObject = try? JSONSerialization.jsonObject(with: data, options: []), + let payload = jsonObject as? [String: Any] else { + return nil + } + + return payload + } + +} + +//MARK: ASAuthorizationControllerDelegate +extension FALogin: ASAuthorizationControllerDelegate { + + func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) { + if let appleIDCredential = authorization.credential as? ASAuthorizationAppleIDCredential { + + let userIdentifier = appleIDCredential.user + let fullName = appleIDCredential.fullName + let email = appleIDCredential.email + + let identityToken = appleIDCredential.identityToken.flatMap { String(data: $0, encoding: .utf8) } + let identityTokenParams = self.jwtDecode(jwtStr: identityToken ?? "") + + + var model = FAThirdSignModel() + model.platform = .apple + model.third_id = userIdentifier + model.giving_name = fullName?.givenName + model.family_name = fullName?.familyName + model.avator = identityTokenParams?["picture"] as? String + model.email = identityTokenParams?["email"] as? String + + + debugLog(userIdentifier) + debugLog(fullName) + debugLog(email) + + appleLoginHandle?(model) + appleLoginHandle = nil + } + } + + func authorizationController(controller: ASAuthorizationController, didCompleteWithError error: Error) { + appleLoginHandle?(nil) + appleLoginHandle = nil + } + +} + +//MARK: ASAuthorizationControllerPresentationContextProviding +extension FALogin: ASAuthorizationControllerPresentationContextProviding { + + func presentationAnchor(for controller: ASAuthorizationController) -> ASPresentationAnchor { + return FATool.keyWindow! + } + +} + diff --git a/Fableon/Object/Libs/FALogin/FALogin+Facebook.swift b/Fableon/Object/Libs/FALogin/FALogin+Facebook.swift new file mode 100644 index 0000000..ac8fb9a --- /dev/null +++ b/Fableon/Object/Libs/FALogin/FALogin+Facebook.swift @@ -0,0 +1,58 @@ +// +// FALogin+Facebook.swift +// Fableon +// +// Created by 湖北秦九 on 2025/10/30. +// +import UIKit +import FacebookLogin + +extension FALogin { + + func facebookLogin(presentingViewController: UIViewController?, completer: ((_ model: FAThirdSignModel?) -> Void)?) { + + let loginManager = LoginManager() + loginManager.logOut() + loginManager.defaultAudience = .everyone + + loginManager.logIn(permissions: ["public_profile", "email"], from: presentingViewController) { result, error in + guard error == nil, let result = result else { + completer?(nil) + return + } + if result.isCancelled { + completer?(nil) + return + } + let request = GraphRequest(graphPath: "me", parameters: ["fields" : "id,name,email,picture"], httpMethod: .get) + request.start { connection, result, error in + guard let result = result as? [String : Any] else { + completer?(nil) + return + } + var model = FAThirdSignModel() + model.platform = .faceBook + model.third_id = result["id"] as? String + model.email = result["email"] as? String + + if let picture = result["picture"] as? [String : Any], + let data = picture["data"] as? [String : Any], + let url = data["url"] as? String + { + model.avator = url + } + + if let name = result["name"] as? String { + model.family_name = name + } else { + model.family_name = result["first_name"] as? String + model.giving_name = result["last_name"] as? String + } + completer?(model) + } + + + } + } + +} diff --git a/Fableon/Object/Libs/FALogin/FALogin.swift b/Fableon/Object/Libs/FALogin/FALogin.swift index 4c677e2..23036de 100644 --- a/Fableon/Object/Libs/FALogin/FALogin.swift +++ b/Fableon/Object/Libs/FALogin/FALogin.swift @@ -6,16 +6,28 @@ // import UIKit +import SmartCodable let kFAUserTokenDefaultsKey = "kFAUserTokenDefaultsKey" let kFAUserInfoDefaultsKey = "kFAUserInfoDefaultsKey" class FALogin: NSObject { + + enum LoginType: String, SmartCaseDefaultable { + case apple = "Apple" + case faceBook = "Facebook" + case google = "Google" + case tiktok = "Tiktok" + } + static let manager = FALogin() private(set) var token = UserDefaults.fa_object(forKey: kFAUserTokenDefaultsKey, as: FATokenModel.self) private(set) var userInfo = UserDefaults.fa_object(forKey: kFAUserInfoDefaultsKey, as: FAUserInfo.self) + var isLogin: Bool { + return !(userInfo?.is_tourist ?? true) + } private func setToken(_ token: FATokenModel?) { self.token = token @@ -27,6 +39,67 @@ class FALogin: NSObject { UserDefaults.fa_setObject(userInfo, forKey: kFAUserInfoDefaultsKey) } + ///第三方登录 + func thirdLogin(type: LoginType, presentingViewController: UIViewController?, completer: ((_ isFinish: Bool) -> Void)?) { + switch type { + case .apple: + appleLogin { [weak self] model in + self?.requestSignThirdLogin(thirdSignModel: model, completer: completer) + } + + case .faceBook: + facebookLogin(presentingViewController: presentingViewController) { [weak self] model in + self?.requestSignThirdLogin(thirdSignModel: model, completer: completer) + } + + default: + break + } + } + + ///后台验证三方登录 + private func requestSignThirdLogin(thirdSignModel: FAThirdSignModel?, completer: ((_ isFinish: Bool) -> Void)?) { + guard let thirdSignModel = thirdSignModel else { + completer?(false) + return + } + FAStatAPI.requestLeaveApp() + FAAPI.requestSignThirdLogin(model: thirdSignModel) { [weak self] token in + guard let self = self else { return } + guard let token = token else { + completer?(false) + return + } + self.setToken(token) + self.userInfo?.is_tourist = false + self.requestUserInfo(completer: nil) + FAStatAPI.requestEnterApp() + FAStatAPI.requestStatOnLine() + completer?(true) + NotificationCenter.default.post(name: FALogin.userInfoUpdateNotification, object: nil) + } + } + + func logout(completer: ((_ isFinish: Bool) -> Void)?) { + FAStatAPI.requestLeaveApp() + + FAAPI.requestLogout { [weak self] token in + guard let self = self else { return } + if let token = token { + self.setToken(token) + self.userInfo?.is_tourist = true + self.requestUserInfo(completer: nil) + FAStatAPI.requestEnterApp() + FAStatAPI.requestStatOnLine() + completer?(true) + NotificationCenter.default.post(name: FALogin.userInfoUpdateNotification, object: nil) + } else { + completer?(false) + } + } + + } + } extension FALogin { diff --git a/Fableon/Object/Libs/FALogin/FAThirdSignModel.swift b/Fableon/Object/Libs/FALogin/FAThirdSignModel.swift new file mode 100644 index 0000000..47cacbb --- /dev/null +++ b/Fableon/Object/Libs/FALogin/FAThirdSignModel.swift @@ -0,0 +1,23 @@ +// +// FAThirdSignModel.swift +// Fableon +// +// Created by 湖北秦九 on 2025/10/30. +// + +import UIKit +import SmartCodable + +struct FAThirdSignModel: SmartCodable { + + var third_id: String? + var email: String? + //姓 + var family_name: String? + //名 + var giving_name: String? + + var avator: String? + + var platform: FALogin.LoginType? +} diff --git a/Fableon/Object/Libs/FATool/FATool.swift b/Fableon/Object/Libs/FATool/FATool.swift index 7496d50..0b2d5aa 100644 --- a/Fableon/Object/Libs/FATool/FATool.swift +++ b/Fableon/Object/Libs/FATool/FATool.swift @@ -6,6 +6,8 @@ // import Foundation import UIKit +import AppTrackingTransparency +import AdSupport #if DEBUG func debugLog(_ msg: Any, file: String = #file, function: String = #function, line: Int = #line) { @@ -18,6 +20,8 @@ func debugLog(_ msg: Any) { } class FATool { + static var sceneDelegate: SceneDelegate? + static var windowScene: UIWindowScene? static var keyWindow: UIWindow? { @@ -52,3 +56,38 @@ class FATool { } } + +extension FATool { + + static func requestIDFAAuthorization(_ completion: ((String?) -> Void)? = nil) { + if FAAdjustStateManager.manager.idfaAuthorizationFinish { + completion?(ASIdentifierManager.shared().advertisingIdentifier.uuidString) + return + } + guard FANetworkMonitor.manager.isReachable == true, FAAdjustStateManager.manager.apnsAuthorizationFinish, FAAdjustStateManager.manager.isOpenApp else { + return + } + + DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { + ATTrackingManager.requestTrackingAuthorization { status in + FAAdjustStateManager.manager.idfaAuthorizationFinish = true + let idfa = ASIdentifierManager.shared().advertisingIdentifier.uuidString + FATool.sceneDelegate?.retryHandleOpenAppMessage() + completion?(idfa) + } + } + } + + ///打开消息通知设置页面 + static func openApnsSetting() { + if #available(iOS 16.0, *) { + if let url = URL(string: UIApplication.openNotificationSettingsURLString) { + UIApplication.shared.open(url) + } + } else { + if let url = URL(string: UIApplication.openSettingsURLString) { + UIApplication.shared.open(url) + } + } + } +} diff --git a/Fableon/Source/Assets.xcassets/color/#404040.colorset/Contents.json b/Fableon/Source/Assets.xcassets/color/#404040.colorset/Contents.json new file mode 100644 index 0000000..eb2314a --- /dev/null +++ b/Fableon/Source/Assets.xcassets/color/#404040.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x40", + "green" : "0x40", + "red" : "0x40" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Fableon/Source/Assets.xcassets/color/#629DFA.colorset/Contents.json b/Fableon/Source/Assets.xcassets/color/#629DFA.colorset/Contents.json new file mode 100644 index 0000000..d0d75f4 --- /dev/null +++ b/Fableon/Source/Assets.xcassets/color/#629DFA.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xFA", + "green" : "0x9D", + "red" : "0x62" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Fableon/Source/Assets.xcassets/color/#6D6D6D.colorset/Contents.json b/Fableon/Source/Assets.xcassets/color/#6D6D6D.colorset/Contents.json new file mode 100644 index 0000000..f0de39c --- /dev/null +++ b/Fableon/Source/Assets.xcassets/color/#6D6D6D.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x6D", + "green" : "0x6D", + "red" : "0x6D" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Fableon/Source/Assets.xcassets/color/#BCBCBC.colorset/Contents.json b/Fableon/Source/Assets.xcassets/color/#BCBCBC.colorset/Contents.json new file mode 100644 index 0000000..2f339e6 --- /dev/null +++ b/Fableon/Source/Assets.xcassets/color/#BCBCBC.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xBC", + "green" : "0xBC", + "red" : "0xBC" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Fableon/Source/Assets.xcassets/color/#DFEFFF.colorset/Contents.json b/Fableon/Source/Assets.xcassets/color/#DFEFFF.colorset/Contents.json new file mode 100644 index 0000000..521ccbf --- /dev/null +++ b/Fableon/Source/Assets.xcassets/color/#DFEFFF.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xFF", + "green" : "0xEF", + "red" : "0xDF" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Fableon/Source/Assets.xcassets/color/#F6CF87.colorset/Contents.json b/Fableon/Source/Assets.xcassets/color/#F6CF87.colorset/Contents.json new file mode 100644 index 0000000..4b612bb --- /dev/null +++ b/Fableon/Source/Assets.xcassets/color/#F6CF87.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x87", + "green" : "0xCF", + "red" : "0xF6" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Fableon/Source/Assets.xcassets/color/#FFFEE9.colorset/Contents.json b/Fableon/Source/Assets.xcassets/color/#FFFEE9.colorset/Contents.json new file mode 100644 index 0000000..63257e3 --- /dev/null +++ b/Fableon/Source/Assets.xcassets/color/#FFFEE9.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xE9", + "green" : "0xFE", + "red" : "0xFF" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Fableon/Source/Assets.xcassets/image/Group 2072750470.imageset/Contents.json b/Fableon/Source/Assets.xcassets/image/Group 2072750470.imageset/Contents.json new file mode 100644 index 0000000..c1a10a0 --- /dev/null +++ b/Fableon/Source/Assets.xcassets/image/Group 2072750470.imageset/Contents.json @@ -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 + } +} diff --git a/Fableon/Source/Assets.xcassets/image/Group 2072750470.imageset/浮窗@2x.png b/Fableon/Source/Assets.xcassets/image/Group 2072750470.imageset/浮窗@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..e329e4e8818ec20daec4ea8dcc15802c2b023b26 GIT binary patch literal 31379 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

Y7KieHUc9ZE8vt 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 Mf$M9PXxK;mA4~-TOaK4? literal 0 HcmV?d00001 diff --git a/Fableon/Source/Assets.xcassets/image/__magnifying.imageset/__magnifying@3x.png b/Fableon/Source/Assets.xcassets/image/__magnifying.imageset/__magnifying@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..e79d25ce1c957c675c2c63d60a2f752e13956d1f GIT binary patch literal 64172 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