杨锴
2025-04-16 09a372bc45fde16fd42257ab6f78b8deeecf720b
fix bug
19个文件已修改
11个文件已删除
644 ■■■■■ 已修改文件
Pods/Pods.xcodeproj/project.pbxproj 32 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse.xcodeproj/project.pbxproj 76 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Config/Enums/Enums.swift 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Config/StoreKit/XQMuseStoreKit.storekit 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Info.plist 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/CLPlayer/CLPlayerView.swift 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Course/VC/CourseVCOfficalCommentVC.swift 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Course/VC/CourseVCTeacherSpecialVC.swift 72 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Course/View/CourseDetailHeaderView.swift 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Home/HomeVC.swift 57 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Home/VC/BackgroundVoiceVC.swift 52 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Home/View/HomeTopMenuView.swift 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Me/MeVC.swift 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Me/VC/LogoutAccountVC.swift 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Me/VC/VIPCenterVC.swift 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/Network/NetworkRequest.swift 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/PayMusicView/PayMusicVC.swift 42 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/TreeGroup/Pngs/apngb-animated-level-1.png 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/TreeGroup/Pngs/apngb-animated-level-10.png 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/TreeGroup/Pngs/apngb-animated-level-2.png 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/TreeGroup/Pngs/apngb-animated-level-3.png 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/TreeGroup/Pngs/apngb-animated-level-4.png 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/TreeGroup/Pngs/apngb-animated-level-5.png 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/TreeGroup/Pngs/apngb-animated-level-6.png 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/TreeGroup/Pngs/apngb-animated-level-7.png 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/TreeGroup/Pngs/apngb-animated-level-8.png 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/TreeGroup/Pngs/apngb-animated-level-9.png 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/TreeGroup/Pngs/apngb-animated_sun.png 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/Root/TreeGroup/TreeTeskVC.swift 148 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
XQMuse/SceneDelegate.swift 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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",
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",
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"
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,
XQMuse/Info.plist
@@ -23,6 +23,8 @@
            </array>
        </dict>
    </array>
    <key>ITSAppUsesNonExemptEncryption</key>
    <false/>
    <key>LSApplicationQueriesSchemes</key>
    <array>
        <string>weixin</string>
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
            }
        }
    }
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()
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 {
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() {
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)
        }
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{
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
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()
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) {
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
        }
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))
                                                                                                }
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
XQMuse/Root/TreeGroup/Pngs/apngb-animated-level-1.png
Binary files differ
XQMuse/Root/TreeGroup/Pngs/apngb-animated-level-10.png
Binary files differ
XQMuse/Root/TreeGroup/Pngs/apngb-animated-level-2.png
Binary files differ
XQMuse/Root/TreeGroup/Pngs/apngb-animated-level-3.png
Binary files differ
XQMuse/Root/TreeGroup/Pngs/apngb-animated-level-4.png
Binary files differ
XQMuse/Root/TreeGroup/Pngs/apngb-animated-level-5.png
Binary files differ
XQMuse/Root/TreeGroup/Pngs/apngb-animated-level-6.png
Binary files differ
XQMuse/Root/TreeGroup/Pngs/apngb-animated-level-7.png
Binary files differ
XQMuse/Root/TreeGroup/Pngs/apngb-animated-level-8.png
Binary files differ
XQMuse/Root/TreeGroup/Pngs/apngb-animated-level-9.png
Binary files differ
XQMuse/Root/TreeGroup/Pngs/apngb-animated_sun.png
Binary files differ
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)
                }
            }
        }
    }
}
XQMuse/SceneDelegate.swift
@@ -63,6 +63,10 @@
                }
                func needLogin(){
        if JQ_currentNavigationController() is LoginNav{
            return
        }
                                UserViewModel.clearToken()
                                UserViewModel.clearLoginInfo()
                                UserViewModel.clearAvatarInfo()