From 09a372bc45fde16fd42257ab6f78b8deeecf720b Mon Sep 17 00:00:00 2001 From: 杨锴 <841720330@qq.com> Date: 星期三, 16 四月 2025 16:38:05 +0800 Subject: [PATCH] fix bug --- XQMuse/Root/CLPlayer/CLPlayerView.swift | 21 + XQMuse/Config/StoreKit/XQMuseStoreKit.storekit | 10 XQMuse/Root/Network/NetworkRequest.swift | 6 XQMuse/Root/TreeGroup/TreeTeskVC.swift | 148 ++++++++----- Pods/Pods.xcodeproj/project.pbxproj | 32 +- XQMuse/Root/Course/VC/CourseVCTeacherSpecialVC.swift | 72 +++++ XQMuse/SceneDelegate.swift | 4 XQMuse/Root/PayMusicView/PayMusicVC.swift | 42 ++- /dev/null | 0 XQMuse/Root/Home/HomeVC.swift | 57 ++-- XQMuse/Root/Me/MeVC.swift | 7 XQMuse/Config/Enums/Enums.swift | 22 ++ XQMuse/Root/Home/View/HomeTopMenuView.swift | 49 ++++ XQMuse/Root/Me/VC/LogoutAccountVC.swift | 1 XQMuse/Root/Course/VC/CourseVCOfficalCommentVC.swift | 17 + XQMuse.xcodeproj/project.pbxproj | 76 +----- XQMuse/Root/Home/VC/BackgroundVoiceVC.swift | 52 ++++ XQMuse/Root/Me/VC/VIPCenterVC.swift | 24 + XQMuse/Root/Course/View/CourseDetailHeaderView.swift | 2 XQMuse/Info.plist | 2 20 files changed, 414 insertions(+), 230 deletions(-) diff --git a/Pods/Pods.xcodeproj/project.pbxproj b/Pods/Pods.xcodeproj/project.pbxproj index 2d3a6b5..d99727d 100644 --- a/Pods/Pods.xcodeproj/project.pbxproj +++ b/Pods/Pods.xcodeproj/project.pbxproj @@ -14629,7 +14629,7 @@ GCC_PREFIX_HEADER = "Target Support Files/EmptyDataSet-Swift/EmptyDataSet-Swift-prefix.pch"; INFOPLIST_FILE = "Target Support Files/EmptyDataSet-Swift/EmptyDataSet-Swift-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -14873,7 +14873,7 @@ GCC_PREFIX_HEADER = "Target Support Files/UserDefaultsStore/UserDefaultsStore-prefix.pch"; INFOPLIST_FILE = "Target Support Files/UserDefaultsStore/UserDefaultsStore-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -14907,7 +14907,7 @@ GCC_PREFIX_HEADER = "Target Support Files/VTMagic/VTMagic-prefix.pch"; INFOPLIST_FILE = "Target Support Files/VTMagic/VTMagic-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -15163,7 +15163,7 @@ GCC_PREFIX_HEADER = "Target Support Files/AliyunOSSiOS/AliyunOSSiOS-prefix.pch"; INFOPLIST_FILE = "Target Support Files/AliyunOSSiOS/AliyunOSSiOS-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -15219,7 +15219,7 @@ GCC_PREFIX_HEADER = "Target Support Files/SwiftyStoreKit/SwiftyStoreKit-prefix.pch"; INFOPLIST_FILE = "Target Support Files/SwiftyStoreKit/SwiftyStoreKit-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -15742,7 +15742,7 @@ GCC_PREFIX_HEADER = "Target Support Files/VTMagic/VTMagic-prefix.pch"; INFOPLIST_FILE = "Target Support Files/VTMagic/VTMagic-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -15911,7 +15911,7 @@ GCC_PREFIX_HEADER = "Target Support Files/SPPageMenu/SPPageMenu-prefix.pch"; INFOPLIST_FILE = "Target Support Files/SPPageMenu/SPPageMenu-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -16058,7 +16058,7 @@ GCC_PREFIX_HEADER = "Target Support Files/AliyunOSSiOS/AliyunOSSiOS-prefix.pch"; INFOPLIST_FILE = "Target Support Files/AliyunOSSiOS/AliyunOSSiOS-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -16113,7 +16113,7 @@ GCC_PREFIX_HEADER = "Target Support Files/SPPageMenu/SPPageMenu-prefix.pch"; INFOPLIST_FILE = "Target Support Files/SPPageMenu/SPPageMenu-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -16260,7 +16260,7 @@ GCC_PREFIX_HEADER = "Target Support Files/EmptyDataSet-Swift/EmptyDataSet-Swift-prefix.pch"; INFOPLIST_FILE = "Target Support Files/EmptyDataSet-Swift/EmptyDataSet-Swift-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -16392,7 +16392,7 @@ GCC_PREFIX_HEADER = "Target Support Files/HandyJSON/HandyJSON-prefix.pch"; INFOPLIST_FILE = "Target Support Files/HandyJSON/HandyJSON-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -16444,7 +16444,7 @@ GCC_PREFIX_HEADER = "Target Support Files/JQTools/JQTools-prefix.pch"; INFOPLIST_FILE = "Target Support Files/JQTools/JQTools-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -17400,7 +17400,7 @@ GCC_PREFIX_HEADER = "Target Support Files/SwiftyStoreKit/SwiftyStoreKit-prefix.pch"; INFOPLIST_FILE = "Target Support Files/SwiftyStoreKit/SwiftyStoreKit-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -17610,7 +17610,7 @@ GCC_PREFIX_HEADER = "Target Support Files/JQTools/JQTools-prefix.pch"; INFOPLIST_FILE = "Target Support Files/JQTools/JQTools-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -18040,7 +18040,7 @@ GCC_PREFIX_HEADER = "Target Support Files/UserDefaultsStore/UserDefaultsStore-prefix.pch"; INFOPLIST_FILE = "Target Support Files/UserDefaultsStore/UserDefaultsStore-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -18317,7 +18317,7 @@ GCC_PREFIX_HEADER = "Target Support Files/HandyJSON/HandyJSON-prefix.pch"; INFOPLIST_FILE = "Target Support Files/HandyJSON/HandyJSON-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", diff --git a/XQMuse.xcodeproj/project.pbxproj b/XQMuse.xcodeproj/project.pbxproj index a5bb53b..a6495d2 100644 --- a/XQMuse.xcodeproj/project.pbxproj +++ b/XQMuse.xcodeproj/project.pbxproj @@ -112,7 +112,6 @@ 135B1D202C8863D10089A9BE /* Types.swift in Sources */ = {isa = PBXBuildFile; fileRef = 135B1D1F2C8863D10089A9BE /* Types.swift */; }; 135B1D222C8868170089A9BE /* Models.swift in Sources */ = {isa = PBXBuildFile; fileRef = 135B1D212C8868170089A9BE /* Models.swift */; }; 135B1D252C8947630089A9BE /* UserViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 135B1D242C8947630089A9BE /* UserViewModel.swift */; }; - 135C2A502C7EC48D00CC2A67 /* apngb-animated_sun.png in Resources */ = {isa = PBXBuildFile; fileRef = 135C2A4F2C7EC48D00CC2A67 /* apngb-animated_sun.png */; }; 135C2A652C7F033300CC2A67 /* CLAnimationTransitioning.swift in Sources */ = {isa = PBXBuildFile; fileRef = 135C2A512C7F033300CC2A67 /* CLAnimationTransitioning.swift */; }; 135C2A662C7F033300CC2A67 /* CLFullScreenController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 135C2A522C7F033300CC2A67 /* CLFullScreenController.swift */; }; 135C2A672C7F033300CC2A67 /* CLFullScreenLeftController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 135C2A532C7F033300CC2A67 /* CLFullScreenLeftController.swift */; }; @@ -166,6 +165,7 @@ 137ECAD32C783C2000C338BE /* bg.mov in Resources */ = {isa = PBXBuildFile; fileRef = 137ECAD22C783C2000C338BE /* bg.mov */; }; 137ECAD62C783C7700C338BE /* TreeTeskVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 137ECAD42C783C7700C338BE /* TreeTeskVC.swift */; }; 137ECAD72C783C7700C338BE /* TreeTeskVC.xib in Resources */ = {isa = PBXBuildFile; fileRef = 137ECAD52C783C7700C338BE /* TreeTeskVC.xib */; }; + 1381BBA12DAF7D2B000717EB /* apngb-animated-flow.png in Resources */ = {isa = PBXBuildFile; fileRef = 1381BBA02DAF7D2B000717EB /* apngb-animated-flow.png */; }; 13846C782C9163BB0078B68F /* TreeTeskDetailVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13846C762C9163BB0078B68F /* TreeTeskDetailVC.swift */; }; 13846C792C9163BB0078B68F /* TreeTeskDetailVC.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13846C772C9163BB0078B68F /* TreeTeskDetailVC.xib */; }; 1385DFFA2C6C4EBC00AADB1F /* RefreshModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1385DFF92C6C4EBC00AADB1F /* RefreshModel.swift */; }; @@ -252,26 +252,15 @@ 13A6594F2C6F641100F731FA /* CourseDetail_2_Inner_TCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13A6594C2C6F641100F731FA /* CourseDetail_2_Inner_TCell.swift */; }; 13B021DB2C75DD0600414769 /* BankWithdrawVC.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13B021DA2C75DD0600414769 /* BankWithdrawVC.xib */; }; 13B021DC2C75DD0600414769 /* BankWithdrawVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13B021D92C75DD0600414769 /* BankWithdrawVC.swift */; }; - 13B06A082C78A0D300477FA9 /* apngb-animated-level-1.png in Resources */ = {isa = PBXBuildFile; fileRef = 13B06A072C78A0D300477FA9 /* apngb-animated-level-1.png */; }; 13BA27132C81B6DD006D4CD1 /* SourceHanSerifCN-Light.otf in Resources */ = {isa = PBXBuildFile; fileRef = 13BA27122C81B6DD006D4CD1 /* SourceHanSerifCN-Light.otf */; }; 13BF65D82C80402500E20F0E /* bg_movie.mov in Resources */ = {isa = PBXBuildFile; fileRef = 13BF65D72C80402500E20F0E /* bg_movie.mov */; }; 13BF65DC2C80407600E20F0E /* PlanGuideVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13BF65DA2C80407600E20F0E /* PlanGuideVC.swift */; }; 13BF65DD2C80407600E20F0E /* PlanGuideVC.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13BF65DB2C80407600E20F0E /* PlanGuideVC.xib */; }; - 13BF65EB2C804BE100E20F0E /* apngb-animated-flow.png in Resources */ = {isa = PBXBuildFile; fileRef = 13BF65EA2C804BE100E20F0E /* apngb-animated-flow.png */; }; - 13C583882C86A29A0071BCBE /* apngb-animated-level-2.png in Resources */ = {isa = PBXBuildFile; fileRef = 13C583872C86A29A0071BCBE /* apngb-animated-level-2.png */; }; - 13C5838A2C86A42B0071BCBE /* apngb-animated-level-3.png in Resources */ = {isa = PBXBuildFile; fileRef = 13C583892C86A42B0071BCBE /* apngb-animated-level-3.png */; }; - 13C5838C2C86A4770071BCBE /* apngb-animated-level-4.png in Resources */ = {isa = PBXBuildFile; fileRef = 13C5838B2C86A4770071BCBE /* apngb-animated-level-4.png */; }; - 13C5838E2C86A4F90071BCBE /* apngb-animated-level-5.png in Resources */ = {isa = PBXBuildFile; fileRef = 13C5838D2C86A4F90071BCBE /* apngb-animated-level-5.png */; }; 13C834ED2D12D1E100B08AE2 /* BlackListVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13C834EC2D12D1E100B08AE2 /* BlackListVC.swift */; }; 13C834F02D12D37700B08AE2 /* BlackUserTCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13C834EE2D12D37700B08AE2 /* BlackUserTCell.swift */; }; 13C834F12D12D37700B08AE2 /* BlackUserTCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13C834EF2D12D37700B08AE2 /* BlackUserTCell.xib */; }; 13C9DDCD2C8EE1F20008946B /* Home_Style_5_TCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13C9DDCC2C8EE1F20008946B /* Home_Style_5_TCell.xib */; }; 13C9DDCE2C8EE1F20008946B /* Home_Style_5_TCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13C9DDCB2C8EE1F20008946B /* Home_Style_5_TCell.swift */; }; - 13C9DDD42C8EE8EB0008946B /* apngb-animated-level-7.png in Resources */ = {isa = PBXBuildFile; fileRef = 13C9DDCF2C8EE8EB0008946B /* apngb-animated-level-7.png */; }; - 13C9DDD52C8EE8EB0008946B /* apngb-animated-level-6.png in Resources */ = {isa = PBXBuildFile; fileRef = 13C9DDD02C8EE8EB0008946B /* apngb-animated-level-6.png */; }; - 13C9DDD62C8EE8EB0008946B /* apngb-animated-level-8.png in Resources */ = {isa = PBXBuildFile; fileRef = 13C9DDD12C8EE8EB0008946B /* apngb-animated-level-8.png */; }; - 13C9DDD72C8EE8EB0008946B /* apngb-animated-level-9.png in Resources */ = {isa = PBXBuildFile; fileRef = 13C9DDD22C8EE8EB0008946B /* apngb-animated-level-9.png */; }; - 13C9DDD82C8EE8EB0008946B /* apngb-animated-level-10.png in Resources */ = {isa = PBXBuildFile; fileRef = 13C9DDD32C8EE8EB0008946B /* apngb-animated-level-10.png */; }; 13CBC5D92C73532B00BC66C7 /* MeVC.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13CBC5D82C73532B00BC66C7 /* MeVC.xib */; }; 13CBCCDF2C74793D00C67701 /* NoticeCenterSysDetailVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13CBCCDD2C74793D00C67701 /* NoticeCenterSysDetailVC.swift */; }; 13CBCCE02C74793D00C67701 /* NoticeCenterSysDetailVC.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13CBCCDE2C74793D00C67701 /* NoticeCenterSysDetailVC.xib */; }; @@ -433,7 +422,6 @@ 135B1D1F2C8863D10089A9BE /* Types.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Types.swift; sourceTree = "<group>"; }; 135B1D212C8868170089A9BE /* Models.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Models.swift; sourceTree = "<group>"; }; 135B1D242C8947630089A9BE /* UserViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserViewModel.swift; sourceTree = "<group>"; }; - 135C2A4F2C7EC48D00CC2A67 /* apngb-animated_sun.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "apngb-animated_sun.png"; sourceTree = "<group>"; }; 135C2A512C7F033300CC2A67 /* CLAnimationTransitioning.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CLAnimationTransitioning.swift; sourceTree = "<group>"; }; 135C2A522C7F033300CC2A67 /* CLFullScreenController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CLFullScreenController.swift; sourceTree = "<group>"; }; 135C2A532C7F033300CC2A67 /* CLFullScreenLeftController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CLFullScreenLeftController.swift; sourceTree = "<group>"; }; @@ -487,6 +475,7 @@ 137ECAD22C783C2000C338BE /* bg.mov */ = {isa = PBXFileReference; lastKnownFileType = video.quicktime; path = bg.mov; sourceTree = "<group>"; }; 137ECAD42C783C7700C338BE /* TreeTeskVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TreeTeskVC.swift; sourceTree = "<group>"; }; 137ECAD52C783C7700C338BE /* TreeTeskVC.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = TreeTeskVC.xib; sourceTree = "<group>"; }; + 1381BBA02DAF7D2B000717EB /* apngb-animated-flow.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "apngb-animated-flow.png"; sourceTree = "<group>"; }; 13846C762C9163BB0078B68F /* TreeTeskDetailVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TreeTeskDetailVC.swift; sourceTree = "<group>"; }; 13846C772C9163BB0078B68F /* TreeTeskDetailVC.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = TreeTeskDetailVC.xib; sourceTree = "<group>"; }; 1385DFF92C6C4EBC00AADB1F /* RefreshModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RefreshModel.swift; sourceTree = "<group>"; }; @@ -575,26 +564,15 @@ 13A6594D2C6F641100F731FA /* CourseDetail_2_Inner_TCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = CourseDetail_2_Inner_TCell.xib; sourceTree = "<group>"; }; 13B021D92C75DD0600414769 /* BankWithdrawVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BankWithdrawVC.swift; sourceTree = "<group>"; }; 13B021DA2C75DD0600414769 /* BankWithdrawVC.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = BankWithdrawVC.xib; sourceTree = "<group>"; }; - 13B06A072C78A0D300477FA9 /* apngb-animated-level-1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "apngb-animated-level-1.png"; sourceTree = "<group>"; }; 13BA27122C81B6DD006D4CD1 /* SourceHanSerifCN-Light.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "SourceHanSerifCN-Light.otf"; sourceTree = "<group>"; }; 13BF65D72C80402500E20F0E /* bg_movie.mov */ = {isa = PBXFileReference; lastKnownFileType = video.quicktime; path = bg_movie.mov; sourceTree = "<group>"; }; 13BF65DA2C80407600E20F0E /* PlanGuideVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlanGuideVC.swift; sourceTree = "<group>"; }; 13BF65DB2C80407600E20F0E /* PlanGuideVC.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = PlanGuideVC.xib; sourceTree = "<group>"; }; - 13BF65EA2C804BE100E20F0E /* apngb-animated-flow.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "apngb-animated-flow.png"; sourceTree = "<group>"; }; - 13C583872C86A29A0071BCBE /* apngb-animated-level-2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "apngb-animated-level-2.png"; sourceTree = "<group>"; }; - 13C583892C86A42B0071BCBE /* apngb-animated-level-3.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "apngb-animated-level-3.png"; sourceTree = "<group>"; }; - 13C5838B2C86A4770071BCBE /* apngb-animated-level-4.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "apngb-animated-level-4.png"; sourceTree = "<group>"; }; - 13C5838D2C86A4F90071BCBE /* apngb-animated-level-5.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "apngb-animated-level-5.png"; sourceTree = "<group>"; }; 13C834EC2D12D1E100B08AE2 /* BlackListVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlackListVC.swift; sourceTree = "<group>"; }; 13C834EE2D12D37700B08AE2 /* BlackUserTCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlackUserTCell.swift; sourceTree = "<group>"; }; 13C834EF2D12D37700B08AE2 /* BlackUserTCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = BlackUserTCell.xib; sourceTree = "<group>"; }; 13C9DDCB2C8EE1F20008946B /* Home_Style_5_TCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Home_Style_5_TCell.swift; sourceTree = "<group>"; }; 13C9DDCC2C8EE1F20008946B /* Home_Style_5_TCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = Home_Style_5_TCell.xib; sourceTree = "<group>"; }; - 13C9DDCF2C8EE8EB0008946B /* apngb-animated-level-7.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "apngb-animated-level-7.png"; sourceTree = "<group>"; }; - 13C9DDD02C8EE8EB0008946B /* apngb-animated-level-6.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "apngb-animated-level-6.png"; sourceTree = "<group>"; }; - 13C9DDD12C8EE8EB0008946B /* apngb-animated-level-8.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "apngb-animated-level-8.png"; sourceTree = "<group>"; }; - 13C9DDD22C8EE8EB0008946B /* apngb-animated-level-9.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "apngb-animated-level-9.png"; sourceTree = "<group>"; }; - 13C9DDD32C8EE8EB0008946B /* apngb-animated-level-10.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "apngb-animated-level-10.png"; sourceTree = "<group>"; }; 13CBC5D82C73532B00BC66C7 /* MeVC.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MeVC.xib; sourceTree = "<group>"; }; 13CBCCDD2C74793D00C67701 /* NoticeCenterSysDetailVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NoticeCenterSysDetailVC.swift; sourceTree = "<group>"; }; 13CBCCDE2C74793D00C67701 /* NoticeCenterSysDetailVC.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = NoticeCenterSysDetailVC.xib; sourceTree = "<group>"; }; @@ -1000,19 +978,8 @@ 137ECADB2C78578A00C338BE /* Pngs */ = { isa = PBXGroup; children = ( + 1381BBA02DAF7D2B000717EB /* apngb-animated-flow.png */, 138995352C943A4300BC7F78 /* droop */, - 13C9DDD02C8EE8EB0008946B /* apngb-animated-level-6.png */, - 13C9DDCF2C8EE8EB0008946B /* apngb-animated-level-7.png */, - 13C9DDD12C8EE8EB0008946B /* apngb-animated-level-8.png */, - 13C9DDD22C8EE8EB0008946B /* apngb-animated-level-9.png */, - 13C9DDD32C8EE8EB0008946B /* apngb-animated-level-10.png */, - 13BF65EA2C804BE100E20F0E /* apngb-animated-flow.png */, - 135C2A4F2C7EC48D00CC2A67 /* apngb-animated_sun.png */, - 13B06A072C78A0D300477FA9 /* apngb-animated-level-1.png */, - 13C583872C86A29A0071BCBE /* apngb-animated-level-2.png */, - 13C583892C86A42B0071BCBE /* apngb-animated-level-3.png */, - 13C5838B2C86A4770071BCBE /* apngb-animated-level-4.png */, - 13C5838D2C86A4F90071BCBE /* apngb-animated-level-5.png */, ); path = Pngs; sourceTree = "<group>"; @@ -1481,14 +1448,12 @@ 13FF0B462C75C820008E26CF /* WalletVC.xib in Resources */, 130B765E2C6C4C33006371AF /* HomeItemListVC.xib in Resources */, 1304526C2CB4CB210049FB3A /* StoreKitTestCertificate.cer in Resources */, - 13C9DDD72C8EE8EB0008946B /* apngb-animated-level-9.png in Resources */, 13F24E3D2C75866100D2BA90 /* BindPhone_3_VC.xib in Resources */, 13CBC5D92C73532B00BC66C7 /* MeVC.xib in Resources */, 13DC34F02C913E7F007E1B61 /* TreeTeskFirstRuleView.xib in Resources */, 1385E0072C6C558200AADB1F /* HomeRelaxBanner_2_CCell.xib in Resources */, 131111822C749085002877FC /* StudyListVC.xib in Resources */, 132EB01D2C6B32B200990429 /* RegisterVC.xib in Resources */, - 13C9DDD42C8EE8EB0008946B /* apngb-animated-level-7.png in Resources */, 137ECAD32C783C2000C338BE /* bg.mov in Resources */, 13E5C9852D5D97E400671533 /* bg_water.mov in Resources */, 1336EFA92C6DEC6B0075E070 /* PaymentOrderResultTopView.xib in Resources */, @@ -1498,9 +1463,7 @@ 13846C792C9163BB0078B68F /* TreeTeskDetailVC.xib in Resources */, 1333DC7E2C72E7A500D8ACAE /* CourseSendGiftView.xib in Resources */, 132C40292C816003002E3270 /* SourceHanSerifCN-Medium.otf in Resources */, - 13C9DDD52C8EE8EB0008946B /* apngb-animated-level-6.png in Resources */, 137ABE352C6B3F64003A91C5 /* ForgotPasswordVC.xib in Resources */, - 13C5838A2C86A42B0071BCBE /* apngb-animated-level-3.png in Resources */, 13A0A8A52C746B5600DF08B6 /* CommonDatePickerView.xib in Resources */, 13A37A012C75C1DE0038D5C8 /* LevelVC.xib in Resources */, 1324A6452C805B4000AA5098 /* FlyFlowerSong.otf in Resources */, @@ -1512,7 +1475,6 @@ 138FE0DF2C757B2A00A964E8 /* BindPhone_1_VC.xib in Resources */, 138995402C943AA700BC7F78 /* static-level-3.png in Resources */, 13FB6D842C6EEFE900A0685D /* MenuListTCell.xib in Resources */, - 13B06A082C78A0D300477FA9 /* apngb-animated-level-1.png in Resources */, 138F0C362C7597CA0072A16C /* HelpCenterVC.xib in Resources */, 131CE0FB2C91299400D1234A /* TreeTeskListView.xib in Resources */, 138995432C943AA700BC7F78 /* static-level-2.png in Resources */, @@ -1521,7 +1483,6 @@ 13A0EAA82D57134300ABC2F6 /* UpdateVersionView.xib in Resources */, 1377768E2C6AFD25004FF994 /* LoginVC.xib in Resources */, 134CC7E02C73283700EAEFB7 /* PavilionSearchVC.xib in Resources */, - 13C5838C2C86A4770071BCBE /* apngb-animated-level-4.png in Resources */, 130913EE2C6DE67E00418201 /* HomeRelaxBanner_2_1_CCell.xib in Resources */, 13CBCCE02C74793D00C67701 /* NoticeCenterSysDetailVC.xib in Resources */, 132C7EF32C8FE3BF00A4CA18 /* ChooseOptTitleView.xib in Resources */, @@ -1531,7 +1492,6 @@ 13391E022C73334000B9513F /* PavilionDetailVC.xib in Resources */, 13EC08902C74990B00E00128 /* EmptyCCell.xib in Resources */, 1377B4172C6DCC4300CF7CA5 /* Home_Style_4_Inner_1_CCell.xib in Resources */, - 13C9DDD62C8EE8EB0008946B /* apngb-animated-level-8.png in Resources */, 13FB6D8C2C6EFB5400A0685D /* CourseDetailHeaderView.xib in Resources */, 1324A64D2C80706700AA5098 /* PlanGuide_1_VC.xib in Resources */, 13985D9F2C69B2440046B6DC /* Assets.xcassets in Resources */, @@ -1549,7 +1509,6 @@ 13985DC32C69E0BF0046B6DC /* HomeTopMenuCCell.xib in Resources */, 13A6594A2C6F4F2D00F731FA /* CourseDetail_2_TCell.xib in Resources */, 139C165E2C6A0AC600A924D9 /* Home_Style_3_TCell.xib in Resources */, - 135C2A502C7EC48D00CC2A67 /* apngb-animated_sun.png in Resources */, 13BF65DD2C80407600E20F0E /* PlanGuideVC.xib in Resources */, 137175C82C6C3C6D00B38EF1 /* Agenda-Light.otf in Resources */, 13CBCCE42C747C3D00C67701 /* NoticeCenterUserRepeaceDetailVC.xib in Resources */, @@ -1562,27 +1521,23 @@ 130F94672C7DAB27003A348B /* SearchHistoryCCell.xib in Resources */, 139C165A2C6A053000A924D9 /* Home_Style_2_TCell.xib in Resources */, 1306028E2C917D3E0019ECDE /* TreeTeskEnergyExchangeRecordTCell.xib in Resources */, - 13C583882C86A29A0071BCBE /* apngb-animated-level-2.png in Resources */, 1300BD3B2C6DFB1C000BCA5E /* VIPCenterVC.xib in Resources */, 139466482C6B8E0200F6FB15 /* UpdatePhoneVC.xib in Resources */, 134A453A2C6E167D00538D78 /* CourseOfficalCommendTopCCell.xib in Resources */, 1304526A2CB4CA310049FB3A /* XQMuseStoreKit.storekit in Resources */, 13BA27132C81B6DD006D4CD1 /* SourceHanSerifCN-Light.otf in Resources */, 132C7EF72C8FE9BB00A4CA18 /* ChooseOptTitleTCell.xib in Resources */, - 13C9DDD82C8EE8EB0008946B /* apngb-animated-level-10.png in Resources */, 13271D852C75EF8200DE1328 /* AddBankInfoVC.xib in Resources */, 1377B40D2C6D936A00CF7CA5 /* CommentUserInputContentTCell.xib in Resources */, 137175CC2C6C412A00B38EF1 /* BackgroundVoiceVC.xib in Resources */, 130602882C91790B0019ECDE /* TreeTeskExchangeSuccessView.xib in Resources */, 13ED09482C916FD30018BB10 /* TreeTeskEnergyTCell.xib in Resources */, 138995492C943AA700BC7F78 /* static-level-1.png in Resources */, - 13BF65EB2C804BE100E20F0E /* apngb-animated-flow.png in Resources */, 13FAD54E2C901D6300566998 /* SearchContentVC.xib in Resources */, 137776932C6AFE69004FF994 /* SearchVC.xib in Resources */, 132DB8FF2C74826D00EF33A7 /* SettingVC.xib in Resources */, 13463E9F2CDE2D1E00DD0C53 /* VIPAgreementVC.xib in Resources */, 13985DBF2C69DDF90046B6DC /* HomeTopMenuView.xib in Resources */, - 13C5838E2C86A4F90071BCBE /* apngb-animated-level-5.png in Resources */, 1385E00B2C6C57A900AADB1F /* HomeItemDetailVC.xib in Resources */, 138F9E112CF422B200075C5D /* PurchaseMethodView.xib in Resources */, 138995422C943AA700BC7F78 /* static-level-9.png in Resources */, @@ -1618,6 +1573,7 @@ 13E160202C6CB8930027F781 /* CommentListVC.xib in Resources */, 139228B12C6B8374006F3CB6 /* Popup_1_View.xib in Resources */, 137ECAD02C78268B00C338BE /* LoginTreatyVC.xib in Resources */, + 1381BBA12DAF7D2B000717EB /* apngb-animated-flow.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1989,7 +1945,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 15; + CURRENT_PROJECT_VERSION = 23; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = M9T3KVL537; ENABLE_USER_SCRIPT_SANDBOXING = NO; @@ -2002,10 +1958,10 @@ INFOPLIST_FILE = XQMuse/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = "泉疗愈"; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.healthcare-fitness"; - INFOPLIST_KEY_NSCameraUsageDescription = "$(PRODUCT_NAME)需要使用相机来上传头像"; - INFOPLIST_KEY_NSLocationAlwaysUsageDescription = "$(PRODUCT_NAME)需要使用定位来展示您附近的疗愈馆"; - INFOPLIST_KEY_NSLocationWhenInUseUsageDescription = "$(PRODUCT_NAME)需要使用定位来展示您附近的疗愈馆"; - INFOPLIST_KEY_NSPhotoLibraryUsageDescription = "$(PRODUCT_NAME)需要使用相册来上传头像"; + INFOPLIST_KEY_NSCameraUsageDescription = "XQMuse需要使用相机来上传头像"; + INFOPLIST_KEY_NSLocationAlwaysUsageDescription = "XQMuse需要使用定位来展示您附近的疗愈馆"; + INFOPLIST_KEY_NSLocationWhenInUseUsageDescription = "XQMuse需要使用定位来展示您附近的疗愈馆"; + INFOPLIST_KEY_NSPhotoLibraryUsageDescription = "XQMuse需要使用相册来上传头像"; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait; @@ -2015,7 +1971,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.4; + MARKETING_VERSION = 1.0.10; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -2147,7 +2103,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 15; + CURRENT_PROJECT_VERSION = 23; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = M9T3KVL537; ENABLE_USER_SCRIPT_SANDBOXING = NO; @@ -2160,10 +2116,10 @@ INFOPLIST_FILE = XQMuse/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = "泉疗愈"; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.healthcare-fitness"; - INFOPLIST_KEY_NSCameraUsageDescription = "$(PRODUCT_NAME)需要使用相机来上传头像"; - INFOPLIST_KEY_NSLocationAlwaysUsageDescription = "$(PRODUCT_NAME)需要使用定位来展示您附近的疗愈馆"; - INFOPLIST_KEY_NSLocationWhenInUseUsageDescription = "$(PRODUCT_NAME)需要使用定位来展示您附近的疗愈馆"; - INFOPLIST_KEY_NSPhotoLibraryUsageDescription = "$(PRODUCT_NAME)需要使用相册来上传头像"; + INFOPLIST_KEY_NSCameraUsageDescription = "XQMuse需要使用相机来上传头像"; + INFOPLIST_KEY_NSLocationAlwaysUsageDescription = "XQMuse需要使用定位来展示您附近的疗愈馆"; + INFOPLIST_KEY_NSLocationWhenInUseUsageDescription = "XQMuse需要使用定位来展示您附近的疗愈馆"; + INFOPLIST_KEY_NSPhotoLibraryUsageDescription = "XQMuse需要使用相册来上传头像"; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait; @@ -2173,7 +2129,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.4; + MARKETING_VERSION = 1.0.10; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", diff --git a/XQMuse/Config/Enums/Enums.swift b/XQMuse/Config/Enums/Enums.swift index 68597b9..a31b06e 100644 --- a/XQMuse/Config/Enums/Enums.swift +++ b/XQMuse/Config/Enums/Enums.swift @@ -55,6 +55,12 @@ case level_9 = 9 case level_10 = 10 + static var sunAni:String{ + get{ + return "https://xqgwzh.obs.cn-south-1.myhuaweicloud.com/1744626206206sunshine.png" + } + } + var aniResource:String{ switch self { case .level_1:return "apngb-animated-level-1" @@ -70,6 +76,22 @@ } } + var aniResourceUrl:String{ + switch self { + case .level_1:return "https://xqgwzh.obs.cn-south-1.myhuaweicloud.com/1744625964828apngb_level_1.png" + case .level_2:return "https://xqgwzh.obs.cn-south-1.myhuaweicloud.com/1744625964828apngb_level_2.png" + case .level_3:return "https://xqgwzh.obs.cn-south-1.myhuaweicloud.com/1744625964828apngb_level_3.png" + case .level_4:return "https://xqgwzh.obs.cn-south-1.myhuaweicloud.com/1744625964828apngb_level_4.png" + case .level_5:return "https://xqgwzh.obs.cn-south-1.myhuaweicloud.com/1744625964828apngb_level_5.png" + case .level_6:return "https://xqgwzh.obs.cn-south-1.myhuaweicloud.com/1744625964828apngb_level_6.png" + case .level_7:return "https://xqgwzh.obs.cn-south-1.myhuaweicloud.com/1744625964828apngb_level_7.png" + case .level_8:return "https://xqgwzh.obs.cn-south-1.myhuaweicloud.com/1744625964828apngb_level_8.png" + case .level_9:return "https://xqgwzh.obs.cn-south-1.myhuaweicloud.com/1744625964828apngb_level_9.png" + case .level_10:return "https://xqgwzh.obs.cn-south-1.myhuaweicloud.com/1744625964828apngb_level_10.png" + } + } + + var staticDroopResource:String{ switch self { case .level_1:return "static-level-1" diff --git a/XQMuse/Config/StoreKit/XQMuseStoreKit.storekit b/XQMuse/Config/StoreKit/XQMuseStoreKit.storekit index 1fc0aa3..53ee723 100644 --- a/XQMuse/Config/StoreKit/XQMuseStoreKit.storekit +++ b/XQMuse/Config/StoreKit/XQMuseStoreKit.storekit @@ -32,13 +32,13 @@ "internalID" : "DDDE321B", "localizations" : [ { - "description" : "购买6个月会员", - "displayName" : "半年会员", + "description" : "购买3个月会员", + "displayName" : "季度会员", "locale" : "zh_CN" } ], "productID" : "com.XQMuse.VIP.semester.0", - "referenceName" : "购买半年会员", + "referenceName" : "购买季度会员", "type" : "NonRenewingSubscription" }, { @@ -200,9 +200,9 @@ { "displayPrice" : "200", "eligibility" : [ + "new", "existing", - "expired", - "new" + "expired" ], "internalID" : "F62AF748", "isStackable" : true, diff --git a/XQMuse/Info.plist b/XQMuse/Info.plist index b3b64e3..0d38288 100644 --- a/XQMuse/Info.plist +++ b/XQMuse/Info.plist @@ -23,6 +23,8 @@ </array> </dict> </array> + <key>ITSAppUsesNonExemptEncryption</key> + <false/> <key>LSApplicationQueriesSchemes</key> <array> <string>weixin</string> diff --git a/XQMuse/Root/CLPlayer/CLPlayerView.swift b/XQMuse/Root/CLPlayer/CLPlayerView.swift index 39797f5..827076e 100644 --- a/XQMuse/Root/CLPlayer/CLPlayerView.swift +++ b/XQMuse/Root/CLPlayer/CLPlayerView.swift @@ -8,6 +8,7 @@ import AVFoundation import SnapKit import UIKit +import JQTools extension CLPlayerView { enum CLWaitReadyToPlayState { @@ -235,15 +236,17 @@ if config.rotateStyle == .small, isFullScreen { return } if config.rotateStyle == .fullScreen, !isFullScreen { return } - switch UIDevice.current.orientation { - case .portrait: - dismiss() - case .landscapeLeft: - presentWithOrientation(.left) - case .landscapeRight: - presentWithOrientation(.right) - default: - break + if let vc = JQ_currentViewController() as? CourseVC,vc.pageViewController.currentPage == 1{ + switch UIDevice.current.orientation { + case .portrait: + dismiss() + case .landscapeLeft: + presentWithOrientation(.left) + case .landscapeRight: + presentWithOrientation(.right) + default: + break + } } } diff --git a/XQMuse/Root/Course/VC/CourseVCOfficalCommentVC.swift b/XQMuse/Root/Course/VC/CourseVCOfficalCommentVC.swift index 6b4a7e6..f8cd103 100644 --- a/XQMuse/Root/Course/VC/CourseVCOfficalCommentVC.swift +++ b/XQMuse/Root/Course/VC/CourseVCOfficalCommentVC.swift @@ -28,6 +28,16 @@ private var bannerModels = [CommonBannerModel]() private var viewModel = CourseVCOfficalViewModel() + override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + Services.getCourseBannerList().subscribe(onNext: {data in + for (index,v) in (data.data ?? []).enumerated(){ + self.bannerModels.append(CommonBannerModel(index: index, id: v.id, name: v.name, resource:v.imageUrl.jq_urlEncoded(), mediaType: .imageUrl,courseId: v.courseId)) + } + self.collectionView.reloadData() + }).disposed(by: disposeBag) + } + override func viewDidLoad() { super.viewDidLoad() @@ -41,12 +51,7 @@ self.collectionView.reloadData() }).disposed(by: disposeBag) - Services.getCourseBannerList().subscribe(onNext: {data in - for (index,v) in (data.data ?? []).enumerated(){ - self.bannerModels.append(CommonBannerModel(index: index, id: v.id, name: v.name, resource:v.imageUrl.jq_urlEncoded(), mediaType: .imageUrl,courseId: v.courseId)) - } - self.collectionView.reloadData() - }).disposed(by: disposeBag) + viewModel.configure(collectionView) viewModel.beginRefresh() diff --git a/XQMuse/Root/Course/VC/CourseVCTeacherSpecialVC.swift b/XQMuse/Root/Course/VC/CourseVCTeacherSpecialVC.swift index f5faa14..df8b29c 100644 --- a/XQMuse/Root/Course/VC/CourseVCTeacherSpecialVC.swift +++ b/XQMuse/Root/Course/VC/CourseVCTeacherSpecialVC.swift @@ -32,15 +32,13 @@ cell0!.backgroundColor = UIColor(hexString: "#f6f6f6") cell1!.backgroundColor = UIColor(hexString: "#f6f6f6") - Services.tutorInfo().subscribe(onNext: { data in - if let m = data.data{ - self.model = m - self.cell0!.setContent(title: "导师简介", content: m.tutorIntroduction) - self.cell1!.setItems(m.list) - self.tableView?.reloadData() - self.headerView.updateVideoUrl(m.videoUrl,autoPlay: false,placeHoderImageUrl: m.coverUrl.jq_urlEncoded(),delegate: self) - } - }).disposed(by: disposeBag) + + getData() +// LoginSuccess_Noti + + NotificationCenter.default.rx.notification(LoginSuccess_Noti).take(until: self.rx.deallocated).subscribe {[unowned self] _ in + self.getData() + }.disposed(by: disposeBag) self.cell0?.webView.scrollView.rx.observe(CGSize.self, "contentSize").map { (size) -> CGFloat? in @@ -53,6 +51,23 @@ if height > self.cell0?.cons_webHei.constant ?? 0{ self.cell0?.cons_webHei.constant = height self.tableView?.reloadData() + } + } + }).disposed(by: disposeBag) + } + + private func getData(){ + Services.tutorInfo().subscribe(onNext: {[weak self] data in + guard let weakSelf = self else { return } + if let m = data.data{ + weakSelf.model = m + weakSelf.cell0!.setContent(title: "导师简介", content: m.tutorIntroduction) + weakSelf.cell1!.setItems(m.list) + weakSelf.tableView?.reloadData() + if let videoUrl = weakSelf.model?.videoUrl.jq_urlEncoded(),videoUrl.jq_isVideo{ + weakSelf.checkCacheAudio(from: URL(string:videoUrl)!) { state, url in + weakSelf.headerView.updateVideoUrl(videoUrl,autoPlay: false,placeHoderImageUrl: m.coverUrl.jq_urlEncoded(),delegate: self) + } } } }).disposed(by: disposeBag) @@ -93,6 +108,45 @@ override var shouldAutorotate: Bool{ return true } + + internal func checkCacheAudio(from url: URL, completion: @escaping (Bool,URL) -> Void) { + + let cacheDirectory = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask).first!.appendingPathComponent("Masters") + + let videoCacheUrl = cacheDirectory.appendingPathComponent(url.lastPathComponent.jq_md5String() + "." + url.pathExtension) + + // 检查缓存中是否已存在文件 + if FileManager.default.fileExists(atPath: videoCacheUrl.path) { + print("启用缓存") + completion(true,videoCacheUrl) + return + }else{ + completion(false,url) + print("没有缓存:执行下载") + } + + // 使用URLSession下载视频 + let downloadTask = URLSession.shared.downloadTask(with: url) { + tempLocalUrl, response, error in + print("执行下载任务") + if let tempLocalUrl = tempLocalUrl, error == nil { + do { + let temp = videoCacheUrl + + if !(FileManager.default.fileExists(atPath: cacheDirectory.path)){ + try FileManager.default.createDirectory(at: cacheDirectory, withIntermediateDirectories: true) + } + + try FileManager.default.moveItem(at: tempLocalUrl, to: temp) + } catch let e { + print("视频缓存失败:catch:\(e)") + } + } else { + print("视频缓存失败:\(error?.localizedDescription ?? "")") + } + } + downloadTask.resume() + } } extension CourseVCTeacherSpecialVC:UITableViewDataSource{ func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { diff --git a/XQMuse/Root/Course/View/CourseDetailHeaderView.swift b/XQMuse/Root/Course/View/CourseDetailHeaderView.swift index 36f4835..4cb8808 100644 --- a/XQMuse/Root/Course/View/CourseDetailHeaderView.swift +++ b/XQMuse/Root/Course/View/CourseDetailHeaderView.swift @@ -16,7 +16,7 @@ @IBOutlet weak var image_cover: UIImageView! @IBOutlet weak var icon: UIImageView! - private var videoView:VideoView? + private(set) var videoView:VideoView? override func awakeFromNib() { diff --git a/XQMuse/Root/Home/HomeVC.swift b/XQMuse/Root/Home/HomeVC.swift index c9d1add..afabaac 100644 --- a/XQMuse/Root/Home/HomeVC.swift +++ b/XQMuse/Root/Home/HomeVC.swift @@ -54,6 +54,7 @@ viewModel?.userFirstOpenTreeTask = true UserDefaultSettingViewModel.saveSetting(viewModel!) self?.navigationController?.tabBarController?.selectedIndex = 2 + self?.toPlanGuide() } }).disposed(by: disposeBag) @@ -71,7 +72,6 @@ if AudioPlayer.getSharedInstance().bgmPlayer != nil && PayMusicVC.getCurrentStatus() != .pause{ AudioPlayer.getSharedInstance().bgmPlayer?.play() -// AudioPlayer.getSharedInstance().masterPlayer?.play() return } @@ -113,30 +113,7 @@ switch state{ case .notRestricted: - if UserDefaultSettingViewModel.getSetting()?.userFirstLaunch ?? true{ - DispatchQueue.main.async {[weak self] in - guard let weakSelf = self else { return } - let vc = LoginTreatyVC() - vc.topIndex = 0 - vc.clickHandle { state in - if !state{ - exit(0) - }else{ - if var m = UserDefaultSettingViewModel.getSetting(){ - m.userFirstLaunch = false - UserDefaultSettingViewModel.saveSetting(m) - } - //跳转计划引导 - let nav = BaseNav(rootViewController: PlanGuideVC(isFromFist: true)) - nav.modalPresentationStyle = .fullScreen - weakSelf.present(nav, animated: true) - } - } - vc.modalPresentationStyle = .custom - weakSelf.present(vc, animated: true) - } - } - + self?.toPlanGuide() DispatchQueue.main.async { self?.getBGMData() self?.tableView.mj_header?.beginRefreshing() @@ -389,6 +366,32 @@ } } + private func toPlanGuide(){ + if UserDefaultSettingViewModel.getSetting()?.userFirstLaunch ?? true{ + DispatchQueue.main.async {[weak self] in + guard let weakSelf = self else { return } + let vc = LoginTreatyVC() + vc.topIndex = 0 + vc.clickHandle { state in + if !state{ + exit(0) + }else{ + if var m = UserDefaultSettingViewModel.getSetting(){ + m.userFirstLaunch = false + UserDefaultSettingViewModel.saveSetting(m) + } + //跳转计划引导 + let nav = BaseNav(rootViewController: PlanGuideVC(isFromFist: true)) + nav.modalPresentationStyle = .fullScreen + weakSelf.present(nav, animated: true) + } + } + vc.modalPresentationStyle = .custom + weakSelf.present(vc, animated: true) + } + } + } + private func updateBGMData(userDefaultSettingModel:UserDefaultSettingModel){ if AudioPlayer.getSharedInstance().bgmPlayer != nil && PayMusicVC.getCurrentStatus() != .pause{ AudioPlayer.getSharedInstance().bgmPlayer?.play() @@ -416,10 +419,6 @@ }else{ self.titleItems[0] = TitleItem(title: "每日疗愈", subTitle: "Daily Meditation") } - - -// self.tableView.reloadRows(at: [IndexPath(row: 0, section: 0)], with: .none) -// self.tableView.reloadRows(at: [IndexPath(row: 1, section: 0)], with: .none) self.tableView.reloadData() }).disposed(by: disposeBag) } diff --git a/XQMuse/Root/Home/VC/BackgroundVoiceVC.swift b/XQMuse/Root/Home/VC/BackgroundVoiceVC.swift index 7188235..3714435 100644 --- a/XQMuse/Root/Home/VC/BackgroundVoiceVC.swift +++ b/XQMuse/Root/Home/VC/BackgroundVoiceVC.swift @@ -107,9 +107,6 @@ v1.jq_borderColor = .white v1.jq_cornerRadius = 8.5 -// slider_voice.setThumbImage(v1.qmui_snapshotLayerImage(), for: .normal) -// slider_voice.setThumbImage(v1.qmui_snapshotLayerImage(), for: .highlighted) - collectionView.collectionViewLayout = TestLeftRightCollectionViewFlowLayout(width: JQ_ScreenW, height: 213.5) collectionView.delegate = self collectionView.dataSource = self @@ -182,11 +179,11 @@ collectionView.scrollToItem(at: indexPath, at: .centeredHorizontally, animated: true) guard let URL = URL(string: model.audioFile.jq_urlEncoded()) else { return } - - tempPlayer = AVPlayer(url: URL) -// tempPlayer?.volume = slider_voice.value - tempPlayer!.play() - isPlaying = true + checkCacheAudio(from: URL) {[unowned self] state, url in + self.tempPlayer = AVPlayer(url: url) + self.tempPlayer!.play() + self.isPlaying = true + } collectionView.reloadData() } @@ -210,6 +207,45 @@ } return cell } + + internal func checkCacheAudio(from url: URL, completion: @escaping (Bool,URL) -> Void) { + + let cacheDirectory = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask).first!.appendingPathComponent("BGMs") + + let videoCacheUrl = cacheDirectory.appendingPathComponent(url.lastPathComponent.jq_md5String() + "." + url.pathExtension) + + // 检查缓存中是否已存在文件 + if FileManager.default.fileExists(atPath: videoCacheUrl.path) { + print("启用缓存") + completion(true,videoCacheUrl) + return + }else{ + completion(false,url) + print("没有缓存:执行下载") + } + + // 使用URLSession下载视频 + let downloadTask = URLSession.shared.downloadTask(with: url) { + tempLocalUrl, response, error in + print("执行下载任务") + if let tempLocalUrl = tempLocalUrl, error == nil { + do { + let temp = videoCacheUrl + + if !(FileManager.default.fileExists(atPath: cacheDirectory.path)){ + try FileManager.default.createDirectory(at: cacheDirectory, withIntermediateDirectories: true) + } + + try FileManager.default.moveItem(at: tempLocalUrl, to: temp) + } catch let e { + print("视频缓存失败:catch:\(e)") + } + } else { + print("视频缓存失败:\(error?.localizedDescription ?? "")") + } + } + downloadTask.resume() + } } extension BackgroundVoiceVC:UICollectionViewDelegateFlowLayout{ diff --git a/XQMuse/Root/Home/View/HomeTopMenuView.swift b/XQMuse/Root/Home/View/HomeTopMenuView.swift index d813fe2..96250c9 100644 --- a/XQMuse/Root/Home/View/HomeTopMenuView.swift +++ b/XQMuse/Root/Home/View/HomeTopMenuView.swift @@ -31,7 +31,7 @@ private var disposeBag = DisposeBag() private var defaultItems = [HomeTopMenuItem]() private var clouse:((HomeTopMenuItem)->Void)? - + private let session = URLSession.shared private var aVPlayerLayer:AVPlayerLayer? override func awakeFromNib() { @@ -82,7 +82,9 @@ } if let videoUrl = model.backUrl,videoUrl.isEmpty == false{ - setPlayer(url: URL(string: videoUrl)!) + checkCacheAudio(from: URL(string: videoUrl)!) {[unowned self] state, url in + self.setPlayer(url: url) + } return } @@ -109,6 +111,49 @@ } } + // 下载视频并缓存,如果没有缓存,原路返回并异步下载 + internal func checkCacheAudio(from url: URL, completion: @escaping (Bool,URL) -> Void) { + + let cacheDirectory = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask).first!.appendingPathComponent("bgVideos") + + let videoCacheUrl = cacheDirectory.appendingPathComponent(url.lastPathComponent.jq_md5String() + "." + url.pathExtension) + + // 检查缓存中是否已存在文件 + if FileManager.default.fileExists(atPath: videoCacheUrl.path) { + print("启用缓存") + completion(true,videoCacheUrl) + return + }else{ + completion(false,url) + print("没有缓存:执行下载") + } + + // 使用URLSession下载视频 + let downloadTask = session.downloadTask(with: url) { + tempLocalUrl, response, error in + print("执行下载任务") + if let tempLocalUrl = tempLocalUrl, error == nil { + do { + let temp = videoCacheUrl + + if !(FileManager.default.fileExists(atPath: cacheDirectory.path)){ + try FileManager.default.createDirectory(at: cacheDirectory, withIntermediateDirectories: true) + } + + try FileManager.default.moveItem(at: tempLocalUrl, to: temp) + } catch let e { + print("视频缓存失败:catch:\(e)") + + + + } + } else { + print("视频缓存失败:\(error?.localizedDescription ?? "")") + } + } + downloadTask.resume() + } + func resetItems(_ items:[HomeTopMenuItem]){ defaultItems.removeAll() defaultItems = items diff --git a/XQMuse/Root/Me/MeVC.swift b/XQMuse/Root/Me/MeVC.swift index 229b346..56c9053 100644 --- a/XQMuse/Root/Me/MeVC.swift +++ b/XQMuse/Root/Me/MeVC.swift @@ -68,6 +68,9 @@ let loginNav = LoginNav(rootViewController: LoginVC()) loginNav.modalPresentationStyle = .fullScreen JQ_currentViewController().present(loginNav, animated: true) + }else{ + getData() + queryNotice() } //通讯录通讯录通讯录 @@ -113,9 +116,6 @@ } needLaunch = false - - getData() - queryNotice() } override func setUI() { @@ -182,7 +182,6 @@ if let model = data.data{ UserViewModel.saveAvatarInfo(model) self?.setUserUI(model: model) - } }) {[weak self] error in let model = UserViewModel.getAvatarInfo() diff --git a/XQMuse/Root/Me/VC/LogoutAccountVC.swift b/XQMuse/Root/Me/VC/LogoutAccountVC.swift index 5193d74..454f68a 100644 --- a/XQMuse/Root/Me/VC/LogoutAccountVC.swift +++ b/XQMuse/Root/Me/VC/LogoutAccountVC.swift @@ -42,6 +42,7 @@ Services.deleteUser().subscribe(onNext: {data in CommonAlertView.show(title: "提示", content: "注销成功", cancelStr: nil, completeStr: "确定", isSingle: true) { state in if state{ + UserDefaultSettingViewModel.clearSetting() sceneDelegate?.needLogin() self.navigationController?.popToRootViewController(animated: false) DispatchQueue.main.asyncAfter(delay: 0.5) { diff --git a/XQMuse/Root/Me/VC/VIPCenterVC.swift b/XQMuse/Root/Me/VC/VIPCenterVC.swift index 12d3190..1b0410f 100644 --- a/XQMuse/Root/Me/VC/VIPCenterVC.swift +++ b/XQMuse/Root/Me/VC/VIPCenterVC.swift @@ -93,6 +93,22 @@ self.webView.loadHTMLString(string.jq_wrapHtml(), baseURL: nil) } }).disposed(by: disposeBag) + + Services.getUserDetail(showProgress: false).subscribe(onNext: {[weak self]data in + if let model = data.data{ + if model.isVip == .yes{ + self?.bg_vip.image = UIImage(named: "bg_vip") + self?.label_vipHint.text = "您将享受所有会员专享音频,尽情畅游泉疗愈世界" + self?.label_expirtTime.text = model.vipExpireTime.components(separatedBy: " ").first! + "到期" + }else{ + self?.bg_vip.image = UIImage(named: "bg_vip_u") + self?.label_vipHint.text = "升级为会员,解锁会员专属体验" + self?.label_expirtTime.text = "你还未开通会员服务" + } + } + }) { _ in + + }.disposed(by: disposeBag) } override func setRx() { @@ -358,7 +374,7 @@ priorDayPrice = product.price.doubleValue / 365.0 // case "com.XQmuse.Non.renewing.half.year.1": case "com.XQmuse.non.renewable.sub.quarter.1": - priorDayPrice = product.price.doubleValue / 180.0 + priorDayPrice = product.price.doubleValue / 90.0 // case "com.XQmuse.Non.renewing.month.1": case "com.XQmuse.non.renewable.sub.month.1": priorDayPrice = product.price.doubleValue / 30.0 @@ -395,14 +411,14 @@ lable_priorDay.text = String(format: "¥%.2lf/天", vipContentModel.monthlyVipIos / 30.0) case 1: // price = vipContentModel.quarterlyVipIos - label_title.text = "半年会员" + label_title.text = "季度会员" formartPrice = vipContentModel.quarterlyVipIos.jq_formatFloat - lable_priorDay.text = String(format: "¥%.2lf/天", vipContentModel.quarterlyVipIos / 30.0) + lable_priorDay.text = String(format: "¥%.2lf/天", vipContentModel.quarterlyVipIos / 90) case 2: // price = vipContentModel.annualVipIos label_title.text = "年度会员" formartPrice = vipContentModel.annualVipIos.jq_formatFloat - lable_priorDay.text = String(format: "¥%.2lf/天", vipContentModel.annualVipIos / 30.0) + lable_priorDay.text = String(format: "¥%.2lf/天", vipContentModel.annualVipIos / 365) default:break } diff --git a/XQMuse/Root/Network/NetworkRequest.swift b/XQMuse/Root/Network/NetworkRequest.swift index 700804c..a8007fb 100644 --- a/XQMuse/Root/Network/NetworkRequest.swift +++ b/XQMuse/Root/Network/NetworkRequest.swift @@ -239,13 +239,15 @@ if let next = BaseResponse<T>.deserialize(from: jsonString){ switch next.code{ case 200:ob.onNext(next) - case 401:ob.onError(NetRequestError.InvaildSession) + case 401: + ob.onError(NetRequestError.InvaildSession) + sceneDelegate?.needLogin() case 501: sceneDelegate?.needLogin() ob.onError(NetRequestError.InvaildSession) default: if !ignoreAlert{ - alertError(msg: "网络连接超时") + alertError(msg: "\(next.msg)") } ob.onError(NetRequestError.Other(next.code,next.msg)) } diff --git a/XQMuse/Root/PayMusicView/PayMusicVC.swift b/XQMuse/Root/PayMusicView/PayMusicVC.swift index da1beae..abcf9b3 100644 --- a/XQMuse/Root/PayMusicView/PayMusicVC.swift +++ b/XQMuse/Root/PayMusicView/PayMusicVC.swift @@ -507,27 +507,27 @@ /// 播放场景音乐 func playSceneAt(_ url:String){ - guard let URL = URL(string: url.jq_urlEncoded()) else { return } - scenePlayer?.pause() + checkCacheAudio(from: URL(string: url.jq_urlEncoded())!) {[weak self] state, url in + guard let weakSelf = self else { return } + weakSelf.scenePlayer?.pause() - if scenePlayer == nil{ - scenePlayer = AVPlayer(url: URL) - }else{ - scenePlayer?.replaceCurrentItem(with: AVPlayerItem(url: URL)) - } + if weakSelf.scenePlayer == nil{ + weakSelf.scenePlayer = AVPlayer(url: url) + }else{ + weakSelf.scenePlayer?.replaceCurrentItem(with: AVPlayerItem(url: url)) + } - do { - try AVAudioSession.sharedInstance().setActive(false) - try AVAudioSession.sharedInstance().setCategory(.ambient, mode: .default, options: []) - } catch { - print(error) + do { + try AVAudioSession.sharedInstance().setActive(false) + try AVAudioSession.sharedInstance().setCategory(.ambient, mode: .default, options: []) + } catch { + print(error) + } + + DispatchQueue.main.asyncAfter(delay: 0.5) { + weakSelf.scenePlayer?.play() + } } - - DispatchQueue.main.asyncAfter(delay: 0.5) { - self.scenePlayer?.play() -// self.scenePlayer?.allowsExternalPlayback = false -// self.scenePlayer?.usesExternalPlaybackWhileExternalScreenIsActive = false - } } func dellocScene(){ @@ -651,14 +651,18 @@ // 检查缓存中是否已存在文件 if FileManager.default.fileExists(atPath: videoCacheUrl.path) { + print("启用缓存") completion(true,videoCacheUrl) return }else{ completion(false,url) + print("没有缓存:执行下载") } // 使用URLSession下载视频 - let downloadTask = session.downloadTask(with: url) { tempLocalUrl, response, error in + let downloadTask = session.downloadTask(with: url) { + tempLocalUrl, response, error in + print("执行下载任务") if let tempLocalUrl = tempLocalUrl, error == nil { do { let temp = videoCacheUrl diff --git a/XQMuse/Root/TreeGroup/Pngs/apngb-animated-level-1.png b/XQMuse/Root/TreeGroup/Pngs/apngb-animated-level-1.png deleted file mode 100644 index 58f4538..0000000 --- a/XQMuse/Root/TreeGroup/Pngs/apngb-animated-level-1.png +++ /dev/null Binary files differ diff --git a/XQMuse/Root/TreeGroup/Pngs/apngb-animated-level-10.png b/XQMuse/Root/TreeGroup/Pngs/apngb-animated-level-10.png deleted file mode 100644 index 11fc3df..0000000 --- a/XQMuse/Root/TreeGroup/Pngs/apngb-animated-level-10.png +++ /dev/null Binary files differ diff --git a/XQMuse/Root/TreeGroup/Pngs/apngb-animated-level-2.png b/XQMuse/Root/TreeGroup/Pngs/apngb-animated-level-2.png deleted file mode 100644 index 1b228ff..0000000 --- a/XQMuse/Root/TreeGroup/Pngs/apngb-animated-level-2.png +++ /dev/null Binary files differ diff --git a/XQMuse/Root/TreeGroup/Pngs/apngb-animated-level-3.png b/XQMuse/Root/TreeGroup/Pngs/apngb-animated-level-3.png deleted file mode 100644 index 212d4cd..0000000 --- a/XQMuse/Root/TreeGroup/Pngs/apngb-animated-level-3.png +++ /dev/null Binary files differ diff --git a/XQMuse/Root/TreeGroup/Pngs/apngb-animated-level-4.png b/XQMuse/Root/TreeGroup/Pngs/apngb-animated-level-4.png deleted file mode 100644 index d83606d..0000000 --- a/XQMuse/Root/TreeGroup/Pngs/apngb-animated-level-4.png +++ /dev/null Binary files differ diff --git a/XQMuse/Root/TreeGroup/Pngs/apngb-animated-level-5.png b/XQMuse/Root/TreeGroup/Pngs/apngb-animated-level-5.png deleted file mode 100644 index 8595004..0000000 --- a/XQMuse/Root/TreeGroup/Pngs/apngb-animated-level-5.png +++ /dev/null Binary files differ diff --git a/XQMuse/Root/TreeGroup/Pngs/apngb-animated-level-6.png b/XQMuse/Root/TreeGroup/Pngs/apngb-animated-level-6.png deleted file mode 100644 index 86b613a..0000000 --- a/XQMuse/Root/TreeGroup/Pngs/apngb-animated-level-6.png +++ /dev/null Binary files differ diff --git a/XQMuse/Root/TreeGroup/Pngs/apngb-animated-level-7.png b/XQMuse/Root/TreeGroup/Pngs/apngb-animated-level-7.png deleted file mode 100644 index c3cf531..0000000 --- a/XQMuse/Root/TreeGroup/Pngs/apngb-animated-level-7.png +++ /dev/null Binary files differ diff --git a/XQMuse/Root/TreeGroup/Pngs/apngb-animated-level-8.png b/XQMuse/Root/TreeGroup/Pngs/apngb-animated-level-8.png deleted file mode 100644 index e09511b..0000000 --- a/XQMuse/Root/TreeGroup/Pngs/apngb-animated-level-8.png +++ /dev/null Binary files differ diff --git a/XQMuse/Root/TreeGroup/Pngs/apngb-animated-level-9.png b/XQMuse/Root/TreeGroup/Pngs/apngb-animated-level-9.png deleted file mode 100644 index da6dc53..0000000 --- a/XQMuse/Root/TreeGroup/Pngs/apngb-animated-level-9.png +++ /dev/null Binary files differ diff --git a/XQMuse/Root/TreeGroup/Pngs/apngb-animated_sun.png b/XQMuse/Root/TreeGroup/Pngs/apngb-animated_sun.png deleted file mode 100644 index dd51412..0000000 --- a/XQMuse/Root/TreeGroup/Pngs/apngb-animated_sun.png +++ /dev/null Binary files differ diff --git a/XQMuse/Root/TreeGroup/TreeTeskVC.swift b/XQMuse/Root/TreeGroup/TreeTeskVC.swift index a4421cc..5cd1190 100644 --- a/XQMuse/Root/TreeGroup/TreeTeskVC.swift +++ b/XQMuse/Root/TreeGroup/TreeTeskVC.swift @@ -9,6 +9,7 @@ import AVKit import JQTools import APNGKit +import SDWebImage import UserDefaultsStore let TreeTaskUpdate_Noti = Notification.Name.init(rawValue: "TreeTaskUpdate_Noti") @@ -146,17 +147,21 @@ view_group_inner.jq_addCorners(corner: [.topLeft,.bottomRight], radius: 8) + let path = JQ_LibaryPath + "/tree_img/" + SDImageCacheHealper.cache(namespace:"treeCache", path: path, url: TreeLevel.sunAni) { [unowned self] data in + guard let originData = data else {return} + if let sunApngImage = try? APNGImage(data: originData){ + sunApngImage.numberOfPlays = 2 + aPNGSunImageView = APNGImageView(image: sunApngImage) + view.addSubview(aPNGSunImageView!) + aPNGSunImageView?.layer.zPosition = -998 + aPNGSunImageView!.snp.makeConstraints { make in + make.edges.equalToSuperview() + } + aPNGSunImageView!.startAnimating() + } + } - if let sunApngImage = try? APNGImage(fileURL: Bundle.main.url(forResource: "apngb-animated_sun", withExtension: "png")!){ - sunApngImage.numberOfPlays = 2 - aPNGSunImageView = APNGImageView(image: sunApngImage) - view.addSubview(aPNGSunImageView!) - aPNGSunImageView?.layer.zPosition = -998 - aPNGSunImageView!.snp.makeConstraints { make in - make.edges.equalToSuperview() - } - aPNGSunImageView!.startAnimating() - } updateAni() view.addSubview(taskListView) @@ -417,63 +422,65 @@ private func updateAni(_ needAni:Bool = true){ guard let treeLevel = currentLevel else {return} - - guard let animateUrl = Bundle.main.url(forResource: treeLevel.aniResource, withExtension: "png") else {return} guard let staticDroopUrl = Bundle.main.url(forResource: treeLevel.staticDroopResource, withExtension: "png") else {return} - if let treeApngImage = try? APNGImage(fileURL: animateUrl){ + let path = JQ_LibaryPath + "/tree_img/" + SDImageCacheHealper.cache(namespace:"treeCache", path: path, url: treeLevel.aniResourceUrl) { [unowned self] data in + guard let dataOrigin = data else {return} + if let treeApngImage = try? APNGImage(data: dataOrigin){ - if treeLevel == .level_1{ - treeApngImage.numberOfPlays = 1 - }else{ - treeApngImage.numberOfPlays = 0 - } + if treeLevel == .level_1{ + treeApngImage.numberOfPlays = 1 + }else{ + treeApngImage.numberOfPlays = 0 + } - if aPNGTreeImageView == nil{ - aPNGTreeImageView = APNGImageView(image: treeApngImage) - aPNGTreeImageView?.tag = 10101 - aPNGTreeImageView!.contentMode = .redraw - let tap = UITapGestureRecognizer(target: self, action: #selector(jumpAction)) - aPNGTreeImageView!.addGestureRecognizer(tap) - } + if self.aPNGTreeImageView == nil{ + self.aPNGTreeImageView = APNGImageView(image: treeApngImage) + self.aPNGTreeImageView?.tag = 10101 + self.aPNGTreeImageView!.contentMode = .redraw + let tap = UITapGestureRecognizer(target: self, action: #selector(jumpAction)) + self.aPNGTreeImageView!.addGestureRecognizer(tap) + } - if view.viewWithTag(10101) == nil{ - view.addSubview(aPNGTreeImageView!) - } + if view.viewWithTag(10101) == nil{ + view.addSubview(self.aPNGTreeImageView!) + } - let scale:Double = 0.55 //放大倍数 + let scale:Double = 0.55 //放大倍数 - aPNGTreeImageView!.snp.remakeConstraints { make in - make.centerX.equalToSuperview().offset(-10) - make.bottom.equalToSuperview().offset(-220) - make.width.equalTo(642 * scale) - make.height.equalTo(731 * scale) - } + self.aPNGTreeImageView!.snp.remakeConstraints { make in + make.centerX.equalToSuperview().offset(-10) + make.bottom.equalToSuperview().offset(-220) + make.width.equalTo(642 * scale) + make.height.equalTo(731 * scale) + } - let duration = needAni ? 0.6:0 - UIView.animate(withDuration: duration) { - self.aPNGTreeImageView?.alpha = 0 + let duration = needAni ? 0.6:0 + UIView.animate(withDuration: duration) { + self.aPNGTreeImageView?.alpha = 0 - }completion: { state in - if state{ - self.aPNGTreeImageView!.image = treeApngImage - UIView.animate(withDuration: 0.5, delay: 0.2) { - self.aPNGTreeImageView?.alpha = 1 - }completion: { _ in - self.aPNGTreeImageView!.startAnimating() + }completion: { state in + if state{ + self.aPNGTreeImageView!.image = treeApngImage + UIView.animate(withDuration: 0.5, delay: 0.2) { + self.aPNGTreeImageView?.alpha = 1 + }completion: { _ in + self.aPNGTreeImageView!.startAnimating() - if self.treeInfoModel?.status == .yes{ - self.aPNGTreeImageView?.stopAnimating() - self.aPNGTreeImageView?.image = nil - self.aPNGTreeImageView?.staticImage = UIImage(contentsOfFile: staticDroopUrl.droppedScheme()!.absoluteString) - }else{ - self.aPNGTreeImageView?.staticImage = nil - self.aPNGTreeImageView?.image = treeApngImage + if self.treeInfoModel?.status == .yes{ + self.aPNGTreeImageView?.stopAnimating() + self.aPNGTreeImageView?.image = nil + self.aPNGTreeImageView?.staticImage = UIImage(contentsOfFile: staticDroopUrl.droppedScheme()!.absoluteString) + }else{ + self.aPNGTreeImageView?.staticImage = nil + self.aPNGTreeImageView?.image = treeApngImage + } } - } - } - } - } + } + } + } + } } } @@ -490,3 +497,32 @@ // } } } + +class SDImageCacheHealper{ + static func cache(namespace:String,path:String,url:String,clouse:@escaping (Data?)->Void){ + let image = SDImageCache(namespace: namespace.jq_md5String(), diskCacheDirectory: path) + let loader = SDImageLoadersManager.shared + + let manager = SDWebImageManager(cache: image, loader: loader) + + //过滤链接,去除参数,保证缓存的KEY被MD5后不变 + manager.cacheKeyFilter = SDWebImageCacheKeyFilter(block: { url in + let img = url.absoluteString.components(separatedBy: "?").first + return img + }) + + if let localImgData = image.diskImageData(forKey: url){ + clouse(localImgData) + }else{ + let originUrl = URL(string: url) + manager.loadImage(with: originUrl, progress: nil) { imageData, data,error, cacheType, finished, imageUrl in + if error != nil{ + clouse(nil) + } + if data != nil{ + clouse(data) + } + } + } + } +} diff --git a/XQMuse/SceneDelegate.swift b/XQMuse/SceneDelegate.swift index 0b9d815..2b9e30c 100644 --- a/XQMuse/SceneDelegate.swift +++ b/XQMuse/SceneDelegate.swift @@ -63,6 +63,10 @@ } func needLogin(){ + if JQ_currentNavigationController() is LoginNav{ + return + } + UserViewModel.clearToken() UserViewModel.clearLoginInfo() UserViewModel.clearAvatarInfo() -- Gitblit v1.7.1