From ecb612fce151fd7693ea2e1e2449abf4b7292e80 Mon Sep 17 00:00:00 2001 From: "Mr.zhou" <1422157428@qq.com> Date: Fri, 9 Aug 2024 17:48:28 +0800 Subject: [PATCH] =?UTF-8?q?1.1.6=EF=BC=8C=E6=96=B0=E5=A2=9E=E5=B9=BF?= =?UTF-8?q?=E5=91=8A=E4=B8=AD=E4=BB=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../project.pbxproj | 39 ++- .../xcshareddata/swiftpm/Package.resolved | 11 +- .../UserInterfaceState.xcuserstate | Bin 140549 -> 299287 bytes relax.offline.mp3.music/AppDelegate.swift | 1 - .../Controllers/MP_LunchViewController.swift | 20 +- .../Views/MP_WaveAnimationMaskView.swift | 49 +++ .../MP/Common/Extension(扩展)/String.swift | 4 +- .../Common/Macro(宏定义与全局量)/Macro.swift | 10 +- .../Common/Resource(资源)/Wave_Animation.json | 1 + .../Tool(工具封装)/MP_AdMobManager.swift | 288 +++++++++++------- .../Tool(工具封装)/MP_AnalyticsManager.swift | 49 +-- .../Common/Tool(工具封装)/MP_IAPManager.swift | 3 - .../Tool(工具封装)/MP_NetWorkManager.swift | 3 + .../Tool(工具封装)/MP_PlayerManager.swift | 4 +- .../MPPositive_BaseViewController.swift | 19 +- .../MPPositive_TabBarController.swift | 71 +++-- .../MPPositive_HomeViewController.swift | 164 +++++----- ...MPPositive_SearchResultShowViewController.swift | 2 + .../MPPositive_SearchViewController.swift | 3 - .../Views/Base/MPPositive_BaseShowView.swift | 39 +++ ...Positive_ArtistShowSongTableViewCell.swift | 18 ++ ...ositive_HomeSingleCollectionViewCell.swift | 203 +++++++++++- .../MPPositive_HomeSinglesTableViewCell.swift | 43 ++- ...PPositive_MusicItemShowTableViewCell.swift | 20 +- .../MPPositive_RecommendShowTypeView.swift | 2 +- .../Search/MPPositive_SearchHistoryView.swift | 8 +- ...Positive_SearchResultPreviewShowView.swift | 2 +- ...sitive_SearchResultShowTableViewCell.swift | 36 +++ .../MPPositive_SearchResultTypeShowView.swift | 2 +- .../MPSideA_TabBarController.swift | 49 +-- .../MPSideA_CenterTableViewCell.swift | 9 + .../MPSideA_CenterTableViewCell.xib | 16 +- .../MPSideA_Home_FirstListCollectionViewCell.swift | 9 + .../MPSideA_Home_FirstListCollectionViewCell.xib | 11 +- .../MPSideA_Home_FourthListCollectionViewCell.swift | 12 +- .../MPSideA_Home_FourthListCollectionViewCell.xib | 30 +- .../MPSideA_Home_SecondListCollectionViewCell.swift | 12 +- .../MPSideA_Home_SecondListCollectionViewCell.xib | 28 +- 38 files changed, 913 insertions(+), 377 deletions(-) create mode 100644 relax.offline.mp3.music/MP/Common/Base(公用基类)/Views/MP_WaveAnimationMaskView.swift create mode 100644 relax.offline.mp3.music/MP/Common/Resource(资源)/Wave_Animation.json create mode 100644 relax.offline.mp3.music/MP/MPPositive/Views/Base/MPPositive_BaseShowView.swift diff --git a/relax.offline.mp3.music.xcodeproj/project.pbxproj b/relax.offline.mp3.music.xcodeproj/project.pbxproj index 6e7bec8..20986a7 100644 --- a/relax.offline.mp3.music.xcodeproj/project.pbxproj +++ b/relax.offline.mp3.music.xcodeproj/project.pbxproj @@ -17,6 +17,10 @@ CB0968752C2121410045E55B /* GADTSmallTemplateView.m in Sources */ = {isa = PBXBuildFile; fileRef = CB09686C2C2121410045E55B /* GADTSmallTemplateView.m */; }; CB0968762C2121410045E55B /* GADTSmallTemplateView.xib in Resources */ = {isa = PBXBuildFile; fileRef = CB09686D2C2121410045E55B /* GADTSmallTemplateView.xib */; }; CB0968772C2121410045E55B /* GADTTemplateView.m in Sources */ = {isa = PBXBuildFile; fileRef = CB09686F2C2121410045E55B /* GADTTemplateView.m */; }; + CB0B368B2C65AE3A004036E2 /* Lottie in Frameworks */ = {isa = PBXBuildFile; productRef = CB0B368A2C65AE3A004036E2 /* Lottie */; }; + CB0B368D2C65AEEF004036E2 /* Wave_Animation.json in Resources */ = {isa = PBXBuildFile; fileRef = CB0B368C2C65AEEF004036E2 /* Wave_Animation.json */; }; + CB0B368F2C65B026004036E2 /* MP_WaveAnimationMaskView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB0B368E2C65B026004036E2 /* MP_WaveAnimationMaskView.swift */; }; + CB0B36912C65EBFC004036E2 /* MPPositive_BaseShowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB0B36902C65EBFC004036E2 /* MPPositive_BaseShowView.swift */; }; CB15B89B2C353B2400756E89 /* MP_GuideViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB15B8992C353B2400756E89 /* MP_GuideViewController.swift */; }; CB15B89C2C353B2400756E89 /* MP_GuideViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = CB15B89A2C353B2400756E89 /* MP_GuideViewController.xib */; }; CB1E3B662C23DA8500071DEA /* MPPositive_CustomPlayListModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB1E3B652C23DA8500071DEA /* MPPositive_CustomPlayListModel.swift */; }; @@ -274,6 +278,9 @@ CB09686E2C2121410045E55B /* GADTTemplateView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GADTTemplateView.h; sourceTree = ""; }; CB09686F2C2121410045E55B /* GADTTemplateView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GADTTemplateView.m; sourceTree = ""; }; CB09687E2C2126DD0045E55B /* Swift-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Swift-Bridging-Header.h"; sourceTree = ""; }; + CB0B368C2C65AEEF004036E2 /* Wave_Animation.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = Wave_Animation.json; sourceTree = ""; }; + CB0B368E2C65B026004036E2 /* MP_WaveAnimationMaskView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MP_WaveAnimationMaskView.swift; sourceTree = ""; }; + CB0B36902C65EBFC004036E2 /* MPPositive_BaseShowView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPPositive_BaseShowView.swift; sourceTree = ""; }; CB15B8992C353B2400756E89 /* MP_GuideViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MP_GuideViewController.swift; sourceTree = ""; }; CB15B89A2C353B2400756E89 /* MP_GuideViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MP_GuideViewController.xib; sourceTree = ""; }; CB1E3B652C23DA8500071DEA /* MPPositive_CustomPlayListModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPPositive_CustomPlayListModel.swift; sourceTree = ""; }; @@ -521,6 +528,7 @@ CBAFCBAD2C0A10DA0054500E /* FirebaseCrashlytics in Frameworks */, CBD4570D2C2EC38400CE766D /* AppTrackingTransparency.framework in Frameworks */, CBAFCBAB2C0A10DA0054500E /* FirebaseAnalytics in Frameworks */, + CB0B368B2C65AE3A004036E2 /* Lottie in Frameworks */, CB6EEB8E2C5DFE6100AEC414 /* StoreKit.framework in Frameworks */, CBAFCBAF2C0A10DA0054500E /* FirebaseRemoteConfig in Frameworks */, CB7FC5462C2AA01F00292A43 /* FacebookCore in Frameworks */, @@ -582,6 +590,7 @@ isa = PBXGroup; children = ( CBAFC9F72C0A10500054500E /* MP_Lunch_ProgressView.swift */, + CB0B368E2C65B026004036E2 /* MP_WaveAnimationMaskView.swift */, ); path = Views; sourceTree = ""; @@ -680,6 +689,7 @@ CBAFCA122C0A10500054500E /* Sounds of appliances */, CBAFCA1C2C0A10500054500E /* Sounds of nature */, CBAFCA1D2C0A10500054500E /* Resource.plist */, + CB0B368C2C65AEEF004036E2 /* Wave_Animation.json */, ); path = "Resource(资源)"; sourceTree = ""; @@ -903,6 +913,7 @@ CBAFCA782C0A10500054500E /* MPPositive_BottomShowView.swift */, CBAFCA7C2C0A10500054500E /* MPPositive_MoreOperationDownLoadTableViewCell.swift */, CB0033F52C295E3100B18FD3 /* MPPositive_MoreOperationShowTableViewCell.swift */, + CB0B36902C65EBFC004036E2 /* MPPositive_BaseShowView.swift */, ); path = Base; sourceTree = ""; @@ -1098,13 +1109,6 @@ path = ViewControllers; sourceTree = ""; }; - CBAFCACA2C0A10500054500E /* Add(新增资源) */ = { - isa = PBXGroup; - children = ( - ); - path = "Add(新增资源)"; - sourceTree = ""; - }; CBAFCAD12C0A10500054500E /* Base(基类-导航栏-标签栏) */ = { isa = PBXGroup; children = ( @@ -1149,10 +1153,9 @@ CBAFCAE22C0A10500054500E /* Views */ = { isa = PBXGroup; children = ( - CBAFCACA2C0A10500054500E /* Add(新增资源) */, CBAFCAD12C0A10500054500E /* Base(基类-导航栏-标签栏) */, - CBAFCAD62C0A10500054500E /* Center(个人资源) */, CBAFCAE12C0A10500054500E /* Home(音乐资源列表-播放器) */, + CBAFCAD62C0A10500054500E /* Center(个人资源) */, ); path = Views; sourceTree = ""; @@ -1238,6 +1241,7 @@ CB7FC5412C2AA01F00292A43 /* FacebookAEM */, CB7FC5432C2AA01F00292A43 /* FacebookBasics */, CB7FC5452C2AA01F00292A43 /* FacebookCore */, + CB0B368A2C65AE3A004036E2 /* Lottie */, ); productName = relax.offline.mp3.music; productReference = CBC2D6E82BFDF3D700E17703 /* relax.offline.mp3.music.app */; @@ -1270,6 +1274,7 @@ packageReferences = ( CBAFCBA92C0A10DA0054500E /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */, CB7FC5402C2AA01F00292A43 /* XCRemoteSwiftPackageReference "facebook-ios-sdk" */, + CB0B36892C65AE3A004036E2 /* XCRemoteSwiftPackageReference "lottie-spm" */, ); productRefGroup = CBC2D6E92BFDF3D700E17703 /* Products */; projectDirPath = ""; @@ -1331,6 +1336,7 @@ CB15B89C2C353B2400756E89 /* MP_GuideViewController.xib in Resources */, CBAFCB002C0A10500054500E /* Chirping of Birds.mp3 in Resources */, CBAFCBA72C0A10500054500E /* MPSideA_Home_SecondListCollectionViewCell.xib in Resources */, + CB0B368D2C65AEEF004036E2 /* Wave_Animation.json in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1464,6 +1470,7 @@ CB2CAAD82C5A1AC500EF691D /* MP_IAPViewController.swift in Sources */, CBC1FB7E2C509BB400AC0633 /* MPPositive_LibraryListViewModel.swift in Sources */, CBAFCB992C0A10500054500E /* MPSideA_CustomTabBarView.swift in Sources */, + CB0B368F2C65B026004036E2 /* MP_WaveAnimationMaskView.swift in Sources */, CBAFCB342C0A10500054500E /* MPPositive_DownloadViewModel.swift in Sources */, CBAFCB1E2C0A10500054500E /* MPPositive_JsonRecommend.swift in Sources */, CB7FC5482C2AC25C00292A43 /* MPPositive_CenterListSearchView.swift in Sources */, @@ -1472,6 +1479,7 @@ CBAFCB402C0A10500054500E /* MPPositive_SearchResultsLoadViewModel.swift in Sources */, CBAFCB132C0A10500054500E /* MP_WebWork.swift in Sources */, CBAFCB3A2C0A10500054500E /* MPPositive_SearchSuggestionItemListModel.swift in Sources */, + CB0B36912C65EBFC004036E2 /* MPPositive_BaseShowView.swift in Sources */, CBAFCB122C0A10500054500E /* MP_PlayerSlider.swift in Sources */, CBAFCB082C0A10500054500E /* MP_AnalyticsManager.swift in Sources */, CBAFCB1C2C0A10500054500E /* MPPositive_JsonNext.swift in Sources */, @@ -1873,6 +1881,14 @@ /* End XCConfigurationList section */ /* Begin XCRemoteSwiftPackageReference section */ + CB0B36892C65AE3A004036E2 /* XCRemoteSwiftPackageReference "lottie-spm" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/airbnb/lottie-spm.git"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 4.5.0; + }; + }; CB7FC5402C2AA01F00292A43 /* XCRemoteSwiftPackageReference "facebook-ios-sdk" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/facebook/facebook-ios-sdk"; @@ -1892,6 +1908,11 @@ /* End XCRemoteSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ + CB0B368A2C65AE3A004036E2 /* Lottie */ = { + isa = XCSwiftPackageProductDependency; + package = CB0B36892C65AE3A004036E2 /* XCRemoteSwiftPackageReference "lottie-spm" */; + productName = Lottie; + }; CB7FC5412C2AA01F00292A43 /* FacebookAEM */ = { isa = XCSwiftPackageProductDependency; package = CB7FC5402C2AA01F00292A43 /* XCRemoteSwiftPackageReference "facebook-ios-sdk" */; diff --git a/relax.offline.mp3.music.xcworkspace/xcshareddata/swiftpm/Package.resolved b/relax.offline.mp3.music.xcworkspace/xcshareddata/swiftpm/Package.resolved index 7376276..8f44fed 100644 --- a/relax.offline.mp3.music.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/relax.offline.mp3.music.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -1,5 +1,5 @@ { - "originHash" : "356668427da72005d8cb60963e877385296f1863605fc5a20d1f75f2cec3b22c", + "originHash" : "faf6001fdda5daa8e1887ad5537209b76d1294d394c19dacdef18322dc72fcd3", "pins" : [ { "identity" : "abseil-cpp-binary", @@ -100,6 +100,15 @@ "version" : "1.22.5" } }, + { + "identity" : "lottie-spm", + "kind" : "remoteSourceControl", + "location" : "https://github.com/airbnb/lottie-spm.git", + "state" : { + "revision" : "b842598f1295f3ffa1475b1580672d1fe5b83580", + "version" : "4.5.0" + } + }, { "identity" : "nanopb", "kind" : "remoteSourceControl", diff --git a/relax.offline.mp3.music.xcworkspace/xcuserdata/zhou.xcuserdatad/UserInterfaceState.xcuserstate b/relax.offline.mp3.music.xcworkspace/xcuserdata/zhou.xcuserdatad/UserInterfaceState.xcuserstate index f4e37e8579cf6a82e33bfa53d71021923e86d370..1b245bdf4d115f435dbcd5cf8b0a851417fdc1e1 100644 GIT binary patch literal 299287 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 HcQyV$-9N&& literal 140549 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 diff --git a/relax.offline.mp3.music/AppDelegate.swift b/relax.offline.mp3.music/AppDelegate.swift index 70aeb4c..e8500e1 100644 --- a/relax.offline.mp3.music/AppDelegate.swift +++ b/relax.offline.mp3.music/AppDelegate.swift @@ -222,7 +222,6 @@ class AppDelegate: UIResponder, UIApplicationDelegate { } //MARK: - 当应用被用户关闭时 func applicationWillTerminate(_ application: UIApplication) { - MP_AnalyticsManager.shared.ad_session_total_valueAction() print("应用关闭了") //检索应用是否播放歌曲 guard let load = MP_PlayerManager.shared.loadPlayer, let videoId = load.currentVideoId, let songs = load.songVideos else {return} diff --git a/relax.offline.mp3.music/MP/Common/Base(公用基类)/Controllers/MP_LunchViewController.swift b/relax.offline.mp3.music/MP/Common/Base(公用基类)/Controllers/MP_LunchViewController.swift index bb75e72..d7d3a5b 100644 --- a/relax.offline.mp3.music/MP/Common/Base(公用基类)/Controllers/MP_LunchViewController.swift +++ b/relax.offline.mp3.music/MP/Common/Base(公用基类)/Controllers/MP_LunchViewController.swift @@ -344,15 +344,23 @@ class MP_LunchViewController: UIViewController, GADFullScreenContentDelegate { if ad === MP_AdMobManager.shared.appOpenAd || ad === MP_AdMobManager.shared.appInterstitialAd { if let openAd = MP_AdMobManager.shared.appOpenAd { print("当前展示的广告是开屏广告,广告ID--\(openAd.adUnitID)") - //上传广告收益 - openAd.paidEventHandler = { adValue in - MP_AnalyticsManager.shared.cold_ads_showSuccessAction(openAd.responseInfo, adValue: adValue) + if MP_AnalyticsManager.shared.infoFromAdMobSource(openAd.responseInfo) { + //上传广告收益 + openAd.paidEventHandler = { adValue in + MP_AnalyticsManager.shared.cold_ads_showSuccessAction(openAd.responseInfo, adValue: adValue) + } + }else { + MP_AnalyticsManager.shared.cold_ads_showSuccessAction(openAd.responseInfo, adValue: .init()) } }else if let openAd = MP_AdMobManager.shared.appInterstitialAd { print("当前展示的广告是开屏广告,广告ID--\(openAd.adUnitID)") - //上传广告收益 - openAd.paidEventHandler = { adValue in - MP_AnalyticsManager.shared.cold_ads_showSuccessAction(openAd.responseInfo, adValue: adValue) + if MP_AnalyticsManager.shared.infoFromAdMobSource(openAd.responseInfo) { + //上传广告收益 + openAd.paidEventHandler = { adValue in + MP_AnalyticsManager.shared.cold_ads_showSuccessAction(openAd.responseInfo, adValue: adValue) + } + }else { + MP_AnalyticsManager.shared.cold_ads_showSuccessAction(openAd.responseInfo, adValue: .init()) } } } diff --git a/relax.offline.mp3.music/MP/Common/Base(公用基类)/Views/MP_WaveAnimationMaskView.swift b/relax.offline.mp3.music/MP/Common/Base(公用基类)/Views/MP_WaveAnimationMaskView.swift new file mode 100644 index 0000000..400686a --- /dev/null +++ b/relax.offline.mp3.music/MP/Common/Base(公用基类)/Views/MP_WaveAnimationMaskView.swift @@ -0,0 +1,49 @@ +// +// MP_WaveAnimationMaskView.swift +// relax.offline.mp3.music +// +// Created by Mr.Zhou on 2024/8/9. +// + +import UIKit +import Lottie +class MP_WaveAnimationMaskView: UIView { + ///动画View + private lazy var lotView:LottieAnimationView = { + //获取动画View + let json = Bundle.main.path(forResource: "Wave_Animation", ofType: "json") + let animationView:LottieAnimationView = .init(filePath: json ?? "") + //无限循环 + animationView.loopMode = .loop + //填充 + animationView.contentMode = .scaleAspectFill + animationView.backgroundColor = .clear + return animationView + }() + init(frame: CGRect, cornerRadius:CGFloat) { + super.init(frame: frame) + backgroundColor = .init(hex: "#000000", alpha: 0.6) + layer.masksToBounds = true + layer.cornerRadius = cornerRadius + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + } + //配置 + func configure() { + addSubview(lotView) + lotView.snp.makeConstraints { make in + make.center.equalToSuperview() + make.width.height.equalToSuperview().multipliedBy(0.35) + } + } + //启动动画 + func startAnimation() { + lotView.play() + } + //暂停动画 + func stopAnimation() { + lotView.stop() + } +} diff --git a/relax.offline.mp3.music/MP/Common/Extension(扩展)/String.swift b/relax.offline.mp3.music/MP/Common/Extension(扩展)/String.swift index eb38543..ae96ddd 100644 --- a/relax.offline.mp3.music/MP/Common/Extension(扩展)/String.swift +++ b/relax.offline.mp3.music/MP/Common/Extension(扩展)/String.swift @@ -49,7 +49,7 @@ extension Range where Bound == String.Index { ///扩展UILabel extension UILabel { ///设置文本渐变色 - func setGradientTextColor(_ colors:[CGColor]) { + func setGradientTextColor(_ colors:[CGColor], alignmentMode:CATextLayerAlignmentMode = .center) { self.layoutIfNeeded() //设置一个渐变层 let gradientLayer = CAGradientLayer() @@ -63,7 +63,7 @@ extension UILabel { textLayer.string = self.attributedText textLayer.isWrapped = true textLayer.truncationMode = .end - textLayer.alignmentMode = .center + textLayer.alignmentMode = alignmentMode textLayer.contentsScale = UIScreen.main.scale gradientLayer.mask = textLayer //添加层级 diff --git a/relax.offline.mp3.music/MP/Common/Macro(宏定义与全局量)/Macro.swift b/relax.offline.mp3.music/MP/Common/Macro(宏定义与全局量)/Macro.swift index 0db53de..a5b8bb0 100644 --- a/relax.offline.mp3.music/MP/Common/Macro(宏定义与全局量)/Macro.swift +++ b/relax.offline.mp3.music/MP/Common/Macro(宏定义与全局量)/Macro.swift @@ -79,6 +79,8 @@ let serviceUrl:URL = .init(string: "https://musiclax.mystrikingly.com/terms")! let gradientTextColors:[CGColor] = [UIColor(red: 0, green: 0.863, blue: 1, alpha: 1).cgColor, UIColor(red: 0, green: 1, blue: 0.561, alpha: 1).cgColor, UIColor(red: 0.776, green: 1, blue: 0.639, alpha: 1).cgColor] +///常用文本颜色-绿色 +let greenTextColor:UIColor = .init(hex: "#80F988", alpha: 1.0) //MARK: - 全局变量与方法 //存储默认配置值 @@ -160,7 +162,8 @@ func coreDefaultValues() { if UserDefaults.standard.object(forKey: "LoadINSERTID") == nil { if let array = coreAdModelforJson([.init(level: 3, identifier: "ca-app-pub-1371732277241593/4335559460", ad: "AdMob", type: .Insert), .init(level: 2, identifier: "ca-app-pub-1371732277241593/2398278378", ad: "AdMob", type: .Insert), - .init(level: 1, identifier: "ca-app-pub-1371732277241593/3107763383", ad: "AdMob", type: .Insert)]) { + .init(level: 1, identifier: "ca-app-pub-1371732277241593/7827517266", ad: "AdMob", type: .Insert), + .init(level: 0, identifier: "ca-app-pub-1371732277241593/3107763383", ad: "AdMob", type: .Insert)]) { //存入默认开屏热启动广告ID UserDefaults.standard.set(array, forKey: "LoadINSERTID") } @@ -190,7 +193,10 @@ func coreDefaultValues() { UserDefaults.standard.removeObject(forKey: "GlobalINSERTID") } if UserDefaults.standard.object(forKey: "GlobalINSERTID") == nil { - if let array = coreAdModelforJson([.init(level: 3, identifier: "ca-app-pub-1371732277241593/9449223728", ad: "AdMob", type: .Insert)]) { + if let array = coreAdModelforJson([.init(level: 3, identifier: "ca-app-pub-1371732277241593/2696862512", ad: "AdMob", type: .Insert), + .init(level: 2, identifier: "ca-app-pub-1371732277241593/2477370661", ad: "AdMob", type: .Insert), + .init(level: 1, identifier: "ca-app-pub-1371732277241593/3391529916", ad: "AdMob", type: .Insert), + .init(level: 0, identifier: "ca-app-pub-1371732277241593/9449223728", ad: "AdMob", type: .Insert)]) { //存入默认开屏热启动广告ID UserDefaults.standard.set(array, forKey: "GlobalINSERTID") } diff --git a/relax.offline.mp3.music/MP/Common/Resource(资源)/Wave_Animation.json b/relax.offline.mp3.music/MP/Common/Resource(资源)/Wave_Animation.json new file mode 100644 index 0000000..b4513f4 --- /dev/null +++ b/relax.offline.mp3.music/MP/Common/Resource(资源)/Wave_Animation.json @@ -0,0 +1 @@ +{"v":"4.8.0","meta":{"g":"LottieFiles AE ","a":"","k":"","d":"","tc":""},"fr":25,"ip":0,"op":24,"w":1080,"h":1080,"nm":"Comp 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[890,540,0],"ix":2},"a":{"a":0,"k":[-55.281,30.914,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"t":6,"s":[300,418]},{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"t":14,"s":[300,1018]},{"t":23,"s":[300,418]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":364,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false,"_render":true},{"ty":"fl","c":{"a":0,"k":[0.051,0.8745,0.1176,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false,"_render":true},{"ty":"tr","p":{"a":0,"k":[-55.281,30.914],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform","_render":true}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false,"_render":true}],"ip":0,"op":750,"st":0,"bm":0,"completed":true},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[540,540,0],"ix":2},"a":{"a":0,"k":[-55.281,30.914,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"t":0,"s":[300,1018]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":13,"s":[300,300]},{"t":24,"s":[300,1018]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":364,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false,"_render":true},{"ty":"fl","c":{"a":0,"k":[0.051,0.8745,0.1176,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false,"_render":true},{"ty":"tr","p":{"a":0,"k":[-55.281,30.914],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform","_render":true}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false,"_render":true}],"ip":0,"op":750,"st":0,"bm":0,"completed":true},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[190,540,0],"ix":2},"a":{"a":0,"k":[-55.281,30.914,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"t":0,"s":[300,300]},{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"t":11,"s":[300,1018]},{"t":22,"s":[300,300]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":364,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false,"_render":true},{"ty":"fl","c":{"a":0,"k":[0.051,0.8745,0.1176,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false,"_render":true},{"ty":"tr","p":{"a":0,"k":[-55.281,30.914],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform","_render":true}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false,"_render":true}],"ip":0,"op":750,"st":0,"bm":0,"completed":true}],"markers":[],"__complete":true} \ No newline at end of file diff --git a/relax.offline.mp3.music/MP/Common/Tool(工具封装)/MP_AdMobManager.swift b/relax.offline.mp3.music/MP/Common/Tool(工具封装)/MP_AdMobManager.swift index 014c62b..5bfff39 100644 --- a/relax.offline.mp3.music/MP/Common/Tool(工具封装)/MP_AdMobManager.swift +++ b/relax.offline.mp3.music/MP/Common/Tool(工具封装)/MP_AdMobManager.swift @@ -8,8 +8,8 @@ import UIKit import AVFoundation import GoogleMobileAds -import AppLovinSDK import AppLovinAdapter +import AppLovinSDK import LiftoffMonetizeAdapter import VungleAdsSDK import PangleAdapter @@ -70,6 +70,7 @@ class MP_AdMobManager: NSObject, GADAudioVideoManagerDelegate, GADFullScreenCont } private override init() { super.init() + NotificationCenter.notificationKey.add(observer: self, selector: #selector(netWorkReachableAction(_:)), notificationName: .net_switch_reachable) GADMobileAds.sharedInstance().audioVideoManager.delegate = self GADMobileAds.sharedInstance().audioVideoManager.audioSessionIsApplicationManaged = false reloadAdMobIDs() @@ -311,7 +312,16 @@ class MP_AdMobManager: NSObject, GADAudioVideoManagerDelegate, GADFullScreenCont } } } + //网络可用时触发 + @objc private func netWorkReachableAction(_ sender:Notification) { + DispatchQueue.main.async { + [weak self] in + guard let self = self else {return} + loadMoreAdMobs() + } + } deinit{ + NotificationCenter.default.removeObserver(self) displaySearchTimer?.invalidate() displaySearchTimer = nil displayLibraryTimer?.invalidate() @@ -414,6 +424,16 @@ class MP_AdMobManager: NSObject, GADAudioVideoManagerDelegate, GADFullScreenCont print("热启动广告组已经全部加载失败,停止继续加载") MP_AnalyticsManager.shared.hot_ads_loadFailureAction("No Ads Fill") completion(false) + DispatchQueue.main.asyncAfter(deadline: .now() + 3) { + [weak self] in + self?.loadOpenAd(.HOST, completion: { status in + if status { + print("重新加载热启动广告成功") + }else { + print("重新加载热启动广告失败") + } + }) + } return } item = OpenHOSTID[level] @@ -490,6 +510,16 @@ class MP_AdMobManager: NSObject, GADAudioVideoManagerDelegate, GADFullScreenCont self.showOpenAdIfAvailable(type, completion: completion) } } + if type == .HOST { + //同步展示全屏广告 + showGlobalInterstitialAdIfAvailable { ad in + if let ad = ad { + if let block = completion { + block(ad, false) + } + } + } + } return } if type == .ICE { @@ -542,6 +572,7 @@ class MP_AdMobManager: NSObject, GADAudioVideoManagerDelegate, GADFullScreenCont } } }else { + print("开屏广告展示失败") if type == .ICE { MP_AnalyticsManager.shared.cold_ads_showFailureAction("Ad loading failed") }else { @@ -674,9 +705,15 @@ class MP_AdMobManager: NSObject, GADAudioVideoManagerDelegate, GADFullScreenCont guard level < (SearchINSERTID.count) else { print("搜索插页广告组已经全部加载失败,停止继续加载") MP_AnalyticsManager.shared.search_ads_loadFailureAction("No Ads Fill") - //开始加载全局插页 - loadGlobalInterstitialAd { status in - completion(status) + DispatchQueue.main.asyncAfter(deadline: .now() + 10) { + [weak self] in + self?.loadSearchInterstitialAd { status in + if status { + print("重新加载搜索插页广告") + }else { + print("加载搜索插页广告失败") + } + } } return } @@ -728,6 +765,8 @@ class MP_AdMobManager: NSObject, GADAudioVideoManagerDelegate, GADFullScreenCont self.showSearchInterstitialAdIfAvailable(completion: completion) } } + //展示全屏广告 + showGlobalInterstitialAdIfAvailable(completion: nil) return } MP_AnalyticsManager.shared.search_ads_chanceAction() @@ -741,16 +780,6 @@ class MP_AdMobManager: NSObject, GADAudioVideoManagerDelegate, GADFullScreenCont interstitialSwitch = true ad.present(fromRootViewController: nil) } - }else if let ad = globalInterstitialAd { - //加载全局插页广告 - //传递加载完成事件 - if let block = completion { - block(ad) - }else { - isShowingGlobalInterstitialAd = true - interstitialSwitch = true - ad.present(fromRootViewController: nil) - } }else { MP_AnalyticsManager.shared.search_ads_showFailureAction("Ad loading failed") } @@ -796,9 +825,15 @@ class MP_AdMobManager: NSObject, GADAudioVideoManagerDelegate, GADFullScreenCont guard level < (PlayerINSERTID.count) else { print("播放插页广告组已经全部加载失败,停止继续加载") MP_AnalyticsManager.shared.play_ads_loadFailureAction("No Ads Fill") - //开始加载全局插页 - loadGlobalInterstitialAd { status in - completion(status) + DispatchQueue.main.asyncAfter(deadline: .now() + 10) { + [weak self] in + self?.loadPlayInterstitialAd { status in + if status { + print("重新加载播放插页广告") + }else { + print("加载播放插页广告失败") + } + } } return } @@ -826,17 +861,26 @@ class MP_AdMobManager: NSObject, GADAudioVideoManagerDelegate, GADFullScreenCont } } ///播放插页广告展示 - func showPlayInterstitialAdIfAvailable(completion:((GADInterstitialAd) -> Void)?) { + func showPlayInterstitialAdIfAvailable(completion:((GADInterstitialAd?) -> Void)?) { guard openAdStatus else { + completion?(nil) + return + } + guard MP_NetWorkManager.shared.netWorkStatu == .reachable else { + completion?(nil) return } // 如果应用插页广告或者开屏广告已经正在展示,则不再展示该广告。 - guard !interstitialSwitch, !isShowingPlayInterstitialAd else { return } + guard !interstitialSwitch, !isShowingPlayInterstitialAd else { + completion?(nil) + return + } //检索是否存在插页间隔时间 if let date = interstitialDate { if isShowInterstitialADAvailable(date) == false { //未超过插页间隔时长 print("距上一次展示插页广告时长未超过要求,此次插页广告展示滞后") + completion?(nil) return } } @@ -844,8 +888,10 @@ class MP_AdMobManager: NSObject, GADAudioVideoManagerDelegate, GADFullScreenCont if !isPlayInterstitialAdAvailable() { loadPlayInterstitialAd{ [weak self] success in guard let self = self else { return } - if success { + if success { self.showPlayInterstitialAdIfAvailable(completion: completion) + }else { + completion?(nil) } } return @@ -861,18 +907,9 @@ class MP_AdMobManager: NSObject, GADAudioVideoManagerDelegate, GADFullScreenCont interstitialSwitch = true ad.present(fromRootViewController: nil) } - }else if let ad = globalInterstitialAd { - //加载全局插页广告 - //传递加载完成事件 - if let block = completion { - block(ad) - }else { - isShowingGlobalInterstitialAd = true - interstitialSwitch = true - ad.present(fromRootViewController: nil) - } }else { MP_AnalyticsManager.shared.play_ads_showFailureAction("Ad loading failed") + completion?(nil) } } //查询是否有播放插页广告 @@ -916,9 +953,15 @@ class MP_AdMobManager: NSObject, GADAudioVideoManagerDelegate, GADFullScreenCont guard level < (SwitchINSERTID.count) else { print("切歌插页广告组已经全部加载失败,停止继续加载") MP_AnalyticsManager.shared.cut_ads_loadFailureAction("No Ads Fill") - //开始加载全局插页 - loadGlobalInterstitialAd { status in - completion(status) + DispatchQueue.main.asyncAfter(deadline: .now() + 10) { + [weak self] in + self?.loadSwitchInterstitialAd { status in + if status { + print("重新加载切歌插页广告") + }else { + print("加载切歌插页广告失败") + } + } } return } @@ -968,6 +1011,8 @@ class MP_AdMobManager: NSObject, GADAudioVideoManagerDelegate, GADFullScreenCont self.showSwitchInterstitialAdIfAvailable(completion: completion) } } + //展示全屏广告 + showGlobalInterstitialAdIfAvailable(completion: nil) return } MP_AnalyticsManager.shared.cut_ads_chanceAction() @@ -981,16 +1026,6 @@ class MP_AdMobManager: NSObject, GADAudioVideoManagerDelegate, GADFullScreenCont interstitialSwitch = true ad.present(fromRootViewController: nil) } - }else if let ad = globalInterstitialAd { - //加载全局插页广告 - //传递加载完成事件 - if let block = completion { - block(ad) - }else { - isShowingGlobalInterstitialAd = true - interstitialSwitch = true - ad.present(fromRootViewController: nil) - } }else { MP_AnalyticsManager.shared.cut_ads_showFailureAction("Ad loading failed") } @@ -1035,9 +1070,15 @@ class MP_AdMobManager: NSObject, GADAudioVideoManagerDelegate, GADFullScreenCont guard level < (LoadINSERTID.count) else { print("下载插页广告组已经全部加载失败,停止继续加载") MP_AnalyticsManager.shared.dl_ads_loadFailureAction("No Ads Fill") - //开始加载全局插页 - loadGlobalInterstitialAd { status in - completion(status) + DispatchQueue.main.asyncAfter(deadline: .now() + 10) { + [weak self] in + self?.loadLoadInterstitialAd { status in + if status { + print("重新加载下载插页广告") + }else { + print("加载下载插页广告失败") + } + } } return } @@ -1087,6 +1128,8 @@ class MP_AdMobManager: NSObject, GADAudioVideoManagerDelegate, GADFullScreenCont self.showLoadInterstitialAdIfAvailable(completion: completion) } } + //展示全屏广告 + showGlobalInterstitialAdIfAvailable(completion: nil) return } MP_AnalyticsManager.shared.dl_ads_chanceAction() @@ -1100,16 +1143,6 @@ class MP_AdMobManager: NSObject, GADAudioVideoManagerDelegate, GADFullScreenCont interstitialSwitch = true ad.present(fromRootViewController: nil) } - }else if let ad = globalInterstitialAd { - //加载全局插页广告 - //传递加载完成事件 - if let block = completion { - block(ad) - }else { - isShowingGlobalInterstitialAd = true - interstitialSwitch = true - ad.present(fromRootViewController: nil) - } }else { MP_AnalyticsManager.shared.dl_ads_showFailureAction("Ad loading failed") } @@ -1133,25 +1166,25 @@ class MP_AdMobManager: NSObject, GADAudioVideoManagerDelegate, GADFullScreenCont private var loadLibraryInterstitialAdTime:Date? ///曲库广告处理闭包 var completeLibraryInterstitialAdBlock:(() -> Void)? - ///搜索原生广告加载器 + ///曲库原生广告加载器 var libraryAdLoader:GADAdLoader? - ///搜索原生广告 + ///曲库原生广告 var libraryNativeAds:[GADNativeAd]? - ///搜索原生广告视图一 + ///曲库原生广告视图一 var libraryNativeAdFirstView:GADNativeAdView? ///原生广告视图二 var libraryNativeAdSecondView:GADNativeAdView? - ///搜索原生存储时长 + ///曲库原生存储时长 var refreshLibraryTimes:TimeInterval = 3600 - ///搜索原生显示刷新计时器 + ///曲库原生显示刷新计时器 var displayLibraryTimer:Timer? - ///搜索原生加载时间 + ///曲库原生加载时间 var expirationLibraryDate:Date? - ///搜索控制器 + ///曲库控制器 var libraryViewController:UIViewController? - ///搜索原生回调闭包 + ///曲库原生回调闭包 var onLibraryNativeAdBlock:(() -> Void)? - ///配置搜索原生广告加载器 + ///配置曲库原生广告加载器 func configureLibraryNativeAd(rootController vc:UIViewController) { guard openAdStatus else { return @@ -1160,7 +1193,7 @@ class MP_AdMobManager: NSObject, GADAudioVideoManagerDelegate, GADFullScreenCont libraryViewController = vc } } - ///搜索原生广告加载 + ///曲库原生广告加载 func loadLibraryNativeAd() { guard openAdStatus else {return} guard let vc = libraryViewController, libraryNativeAds == nil else {return} @@ -1181,7 +1214,7 @@ class MP_AdMobManager: NSObject, GADAudioVideoManagerDelegate, GADFullScreenCont libraryNativeAds = [] } } - ///将加载的搜索原生广告添加到页面中 + ///将加载的曲库原生广告添加到页面中 func layoutLibraryNativeAd(in containerView: UIView, index:Int) { guard openAdStatus else {return} containerView.subviews.forEach { item in @@ -1254,7 +1287,7 @@ class MP_AdMobManager: NSObject, GADAudioVideoManagerDelegate, GADFullScreenCont self?.loadLibraryNativeAd() } } - ///搜索原生存储时长 + ///曲库原生存储时长 private func refreshLibraryDate(_ date:Date?) -> Bool { guard let date = date else {return false} return Date().timeIntervalSince(date) < refreshLibraryTimes @@ -1281,9 +1314,15 @@ class MP_AdMobManager: NSObject, GADAudioVideoManagerDelegate, GADFullScreenCont guard level < (LibraryINSERTID.count) else { print("曲库插页广告组已经全部加载失败,停止继续加载") MP_AnalyticsManager.shared.listclk_ads_loadFailureAction("No Ads Fill") - //开始加载全局插页 - loadGlobalInterstitialAd { status in - completion(status) + DispatchQueue.main.asyncAfter(deadline: .now() + 10) { + [weak self] in + self?.loadLoadInterstitialAd { status in + if status { + print("重新加载曲库插页广告") + }else { + print("加载曲库插页广告失败") + } + } } return } @@ -1333,6 +1372,8 @@ class MP_AdMobManager: NSObject, GADAudioVideoManagerDelegate, GADFullScreenCont self.showLibraryInterstitialAdIfAvailable(completion: completion) } } + //展示全屏广告 + showGlobalInterstitialAdIfAvailable(completion: nil) return } MP_AnalyticsManager.shared.listclk_ads_chanceAction() @@ -1347,17 +1388,6 @@ class MP_AdMobManager: NSObject, GADAudioVideoManagerDelegate, GADFullScreenCont interstitialSwitch = true ad.present(fromRootViewController: nil) } - }else if let ad = globalInterstitialAd { - //加载全局插页广告 - - //传递加载完成事件 - if let block = completion { - block(ad) - }else { - isShowingGlobalInterstitialAd = true - interstitialSwitch = true - ad.present(fromRootViewController: nil) - } }else { MP_AnalyticsManager.shared.listclk_ads_showFailureAction("Ad loading failed") } @@ -1420,7 +1450,7 @@ class MP_AdMobManager: NSObject, GADAudioVideoManagerDelegate, GADFullScreenCont } } ///全局插页广告展示 - func showGlobalInterstitialAdIfAvailable(completion:((GADInterstitialAd) -> Void)?) { + func showGlobalInterstitialAdIfAvailable(completion:((GADInterstitialAd?) -> Void)?) { guard openAdStatus else { return } @@ -1440,6 +1470,8 @@ class MP_AdMobManager: NSObject, GADAudioVideoManagerDelegate, GADFullScreenCont guard let self = self else { return } if success { self.showGlobalInterstitialAdIfAvailable(completion: completion) + }else { + completion?(nil) } } return @@ -1488,63 +1520,109 @@ class MP_AdMobManager: NSObject, GADAudioVideoManagerDelegate, GADFullScreenCont if OpenICEID.contains(where: {($0.identifier == (appOpenAd?.adUnitID ?? "") || $0.identifier == (appInterstitialAd?.adUnitID ?? ""))}) { //冷启动,检索是插页还是开屏 if let openAd = appOpenAd { - //上传广告收益 - openAd.paidEventHandler = { adValue in - MP_AnalyticsManager.shared.cold_ads_showSuccessAction(openAd.responseInfo, adValue: adValue) + if MP_AnalyticsManager.shared.infoFromAdMobSource(openAd.responseInfo) { + //上传广告收益 + openAd.paidEventHandler = { adValue in + MP_AnalyticsManager.shared.cold_ads_showSuccessAction(openAd.responseInfo, adValue: adValue) + } + }else { + MP_AnalyticsManager.shared.cold_ads_showSuccessAction(openAd.responseInfo, adValue: .init()) } }else if let openAd = appInterstitialAd { - //上传广告收益 - openAd.paidEventHandler = { adValue in - MP_AnalyticsManager.shared.cold_ads_showSuccessAction(openAd.responseInfo, adValue: adValue) + if MP_AnalyticsManager.shared.infoFromAdMobSource(openAd.responseInfo) { + //上传广告收益 + openAd.paidEventHandler = { adValue in + MP_AnalyticsManager.shared.cold_ads_showSuccessAction(openAd.responseInfo, adValue: adValue) + } + }else { + MP_AnalyticsManager.shared.cold_ads_showSuccessAction(openAd.responseInfo, adValue: .init()) } } }else if OpenHOSTID.contains(where: {($0.identifier == (appOpenAd?.adUnitID ?? "") || $0.identifier == (appInterstitialAd?.adUnitID ?? ""))}) { //热启动,检索是插页还是开屏 if let openAd = appOpenAd { - //上传广告收益 - openAd.paidEventHandler = { adValue in - MP_AnalyticsManager.shared.hot_ads_showSuccessAction(openAd.responseInfo, adValue: adValue) + if MP_AnalyticsManager.shared.infoFromAdMobSource(openAd.responseInfo) { + //上传广告收益 + openAd.paidEventHandler = { adValue in + MP_AnalyticsManager.shared.hot_ads_showSuccessAction(openAd.responseInfo, adValue: adValue) + } + }else { + MP_AnalyticsManager.shared.hot_ads_showSuccessAction(openAd.responseInfo, adValue: .init()) } }else if let openAd = appInterstitialAd { - //上传广告收益 - openAd.paidEventHandler = { adValue in - MP_AnalyticsManager.shared.hot_ads_showSuccessAction(openAd.responseInfo, adValue: adValue) + if MP_AnalyticsManager.shared.infoFromAdMobSource(openAd.responseInfo) { + //上传广告收益 + openAd.paidEventHandler = { adValue in + MP_AnalyticsManager.shared.hot_ads_showSuccessAction(openAd.responseInfo, adValue: adValue) + } + }else { + MP_AnalyticsManager.shared.hot_ads_showSuccessAction(openAd.responseInfo, adValue: .init()) } } } }else if ad === searchInterstitialAd {//搜索插页广告 print("当前展示的广告是搜索插页广告,广告ID--\(searchInterstitialAd?.adUnitID ?? "")") - searchInterstitialAd?.paidEventHandler = { adValue in + if MP_AnalyticsManager.shared.infoFromAdMobSource(searchInterstitialAd?.responseInfo) { + searchInterstitialAd?.paidEventHandler = { adValue in + if let response = self.searchInterstitialAd?.responseInfo { + MP_AnalyticsManager.shared.search_ads_showSuccessAction(response, adValue: adValue) + } + } + }else { if let response = self.searchInterstitialAd?.responseInfo { - MP_AnalyticsManager.shared.search_ads_showSuccessAction(response, adValue: adValue) + MP_AnalyticsManager.shared.search_ads_showSuccessAction(response, adValue: .init()) } } }else if ad === playInterstitialAd {//播放插页广告 print("当前展示的广告是播放插页广告,广告ID--\(playInterstitialAd?.adUnitID ?? "")") - playInterstitialAd?.paidEventHandler = { adValue in + if MP_AnalyticsManager.shared.infoFromAdMobSource(playInterstitialAd?.responseInfo) { + playInterstitialAd?.paidEventHandler = { adValue in + if let response = self.playInterstitialAd?.responseInfo { + MP_AnalyticsManager.shared.play_ads_showSuccessAction(response, adValue: adValue) + } + } + }else { if let response = self.playInterstitialAd?.responseInfo { - MP_AnalyticsManager.shared.play_ads_showSuccessAction(response, adValue: adValue) + MP_AnalyticsManager.shared.play_ads_showSuccessAction(response, adValue: .init()) } } }else if ad === switchInterstitialAd {//切歌插页广告 print("当前展示的广告是切歌插页广告,广告ID--\(switchInterstitialAd?.adUnitID ?? "")") - switchInterstitialAd?.paidEventHandler = { adValue in + if MP_AnalyticsManager.shared.infoFromAdMobSource(switchInterstitialAd?.responseInfo) { + switchInterstitialAd?.paidEventHandler = { adValue in + if let response = self.switchInterstitialAd?.responseInfo { + MP_AnalyticsManager.shared.cut_ads_showSuccessAction(response, adValue: adValue) + } + } + }else { if let response = self.switchInterstitialAd?.responseInfo { - MP_AnalyticsManager.shared.cut_ads_showSuccessAction(response, adValue: adValue) + MP_AnalyticsManager.shared.cut_ads_showSuccessAction(response, adValue: .init()) } } }else if ad === loadInterstitialAd {//下载插页广告 print("当前展示的广告是下载插页广告,广告ID--\(loadInterstitialAd?.adUnitID ?? "")") - loadInterstitialAd?.paidEventHandler = { adValue in + if MP_AnalyticsManager.shared.infoFromAdMobSource(switchInterstitialAd?.responseInfo) { + loadInterstitialAd?.paidEventHandler = { adValue in + if let response = self.loadInterstitialAd?.responseInfo { + MP_AnalyticsManager.shared.dl_ads_showSuccessAction(response, adValue: adValue) + } + } + }else { if let response = self.loadInterstitialAd?.responseInfo { - MP_AnalyticsManager.shared.dl_ads_showSuccessAction(response, adValue: adValue) + MP_AnalyticsManager.shared.dl_ads_showSuccessAction(response, adValue: .init()) } } }else if ad === libraryInterstitialAd {//曲库插页广告 print("当前展示的广告是曲库插页广告,广告ID--\(libraryInterstitialAd?.adUnitID ?? "")") - libraryInterstitialAd?.paidEventHandler = { adValue in + if MP_AnalyticsManager.shared.infoFromAdMobSource(switchInterstitialAd?.responseInfo) { + libraryInterstitialAd?.paidEventHandler = { adValue in + if let response = self.libraryInterstitialAd?.responseInfo { + MP_AnalyticsManager.shared.listclk_ads_showSuccessAction(response, adValue: adValue) + } + } + }else { if let response = self.libraryInterstitialAd?.responseInfo { - MP_AnalyticsManager.shared.listclk_ads_showSuccessAction(response, adValue: adValue) + MP_AnalyticsManager.shared.listclk_ads_showSuccessAction(response, adValue: .init()) } } }else if ad === globalInterstitialAd {//全局插页广告 diff --git a/relax.offline.mp3.music/MP/Common/Tool(工具封装)/MP_AnalyticsManager.swift b/relax.offline.mp3.music/MP/Common/Tool(工具封装)/MP_AnalyticsManager.swift index bc438a2..8103ca8 100644 --- a/relax.offline.mp3.music/MP/Common/Tool(工具封装)/MP_AnalyticsManager.swift +++ b/relax.offline.mp3.music/MP/Common/Tool(工具封装)/MP_AnalyticsManager.swift @@ -54,6 +54,8 @@ class MP_AnalyticsManager: NSObject { private let player_b_success_action = "player_b_success_action" //播放失败 private let player_b_failure_error = "player_b_failure_error" + //资源获取失败 + private let player_resource_failure = "player_resource_failure" //点击收藏 private let player_b_love_click = "player_b_love_click" //取消收藏 @@ -64,6 +66,7 @@ class MP_AnalyticsManager: NSObject { private let player_b_downloadsuccess_action = "player_b_downloadsuccess_action" //资源下载失败 private let player_b_downloadfailure_error = "player_b_downloadfailure_error" + //B面搜索曝光 private let search_pv = "search_pv" //如何进入搜索结果页 @@ -138,7 +141,7 @@ class MP_AnalyticsManager: NSObject { if array.isEmpty == false, let data = coreAdModelforJson(array) { UserDefaults.standard.removeObject(forKey: key) //重新更新内容 - print("Reload--\(key)") + print("\(key)---IDs:\(array.count)") UserDefaults.standard.set(data, forKey: key) } } @@ -339,6 +342,11 @@ class MP_AnalyticsManager: NSObject { "error":error ]) } + ///资源获取失败 + func player_resource_failureAction(_ code:String) { + Analytics.logEvent(player_resource_failure, parameters: ["area_code":code]) + } + ///点击收藏 /// - Parameters: /// - videoid: 音乐id @@ -540,20 +548,13 @@ class MP_AnalyticsManager: NSObject { "CS_CURRENCY":adValue.currencyCode, "CS_VALUE":priceString, "CS_STATUS":isOLD ? "Old":"New"] - //同时执行当前活跃会话的总价格和总次数更新 - if var totalPrices = UserDefaults.standard.array(forKey: "Session_TotalPrices") as? [Double] { - print("更新了当前活跃会话的广告总次数和总价值") - totalPrices.append(price) - UserDefaults.standard.set(totalPrices, forKey: "Session_TotalPrices") - }else { - print("更新了当前活跃会话的广告总次数和总价值") - //没有这个数据 - var array:[Double] = [] - array.append(price) - UserDefaults.standard.set(array, forKey: "Session_TotalPrices") - } return parameters } + ///检索广告来源 + func infoFromAdMobSource(_ responseInfo:GADResponseInfo?) -> Bool { + guard let responseInfo = responseInfo else {return false} + return (responseInfo.loadedAdNetworkResponseInfo?.adSourceInstanceName ?? "").contains("AdMob") + } //价格转化(全部转化为美元) private func valueToUSD(_ adValue:GADAdValue) -> Double { @@ -765,28 +766,6 @@ class MP_AnalyticsManager: NSObject { print("列表原生成功展示信息--\(parameters)") Analytics.logEvent(list_ads_show, parameters: parameters) } - ///对总价值的价格上报事件 - func ad_session_total_valueAction() { - //取出当前活跃次数总价值以及对应数据 - if let totalPrices = UserDefaults.standard.array(forKey: "Session_TotalPrices") as? [Double] { - //成功获取了总价值与总次数 - var totalPrice:Double = 0 - totalPrices.forEach { item in - totalPrice += item - } - let priceString = String(format: "%.5f", totalPrices) - let count = totalPrices.count - let currentTime = getCurrentLosAngelesTime() - let parameters:[String:Any] = ["session_currentTime":currentTime, - "session_totalPrice":priceString, - "session_totalNumber":count] - print("当前活跃会话总价值--\(parameters)") - //发布事件 - Analytics.logEvent(ad_session_total_value, parameters: parameters) - //清理当前活跃会话广告总价值 - UserDefaults.standard.removeObject(forKey: "Session_TotalPrices") - } - } //获取太平洋洛杉矶时间 func getCurrentLosAngelesTime() -> String { // 获取当前日期和时间 diff --git a/relax.offline.mp3.music/MP/Common/Tool(工具封装)/MP_IAPManager.swift b/relax.offline.mp3.music/MP/Common/Tool(工具封装)/MP_IAPManager.swift index abeb877..ba7a184 100644 --- a/relax.offline.mp3.music/MP/Common/Tool(工具封装)/MP_IAPManager.swift +++ b/relax.offline.mp3.music/MP/Common/Tool(工具封装)/MP_IAPManager.swift @@ -285,7 +285,6 @@ extension MP_IAPManager: SKProductsRequestDelegate, SKPaymentTransactionObserver do { if let jsonResponse = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String: Any] { - print("Receipt validation response: \(jsonResponse)") if let status = jsonResponse["status"] as? Int { if status == 0 { completion(true) @@ -339,8 +338,6 @@ extension MP_IAPManager: SKProductsRequestDelegate, SKPaymentTransactionObserver } do { if let jsonResponse = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String: Any] { - print("Sandbox receipt validation response: \(jsonResponse)") - if let status = jsonResponse["status"] as? Int, status == 0 { completion(true) } else { diff --git a/relax.offline.mp3.music/MP/Common/Tool(工具封装)/MP_NetWorkManager.swift b/relax.offline.mp3.music/MP/Common/Tool(工具封装)/MP_NetWorkManager.swift index 96518e1..2e07b8c 100644 --- a/relax.offline.mp3.music/MP/Common/Tool(工具封装)/MP_NetWorkManager.swift +++ b/relax.offline.mp3.music/MP/Common/Tool(工具封装)/MP_NetWorkManager.swift @@ -2092,6 +2092,9 @@ extension MP_NetWorkManager { parsingAndroidPlayerStreamingData(streamingData){ videos,itags,mimeType in completion((videos,itags,mimeType),infos) } + }else { + MP_HUD.error("Failed to obtain resource, please try again later", delay: 1.0, completion: nil) + MP_AnalyticsManager.shared.player_resource_failureAction(locaton ?? "HK") } } diff --git a/relax.offline.mp3.music/MP/Common/Tool(工具封装)/MP_PlayerManager.swift b/relax.offline.mp3.music/MP/Common/Tool(工具封装)/MP_PlayerManager.swift index 17f1d97..14038a1 100644 --- a/relax.offline.mp3.music/MP/Common/Tool(工具封装)/MP_PlayerManager.swift +++ b/relax.offline.mp3.music/MP/Common/Tool(工具封装)/MP_PlayerManager.swift @@ -143,7 +143,7 @@ class MP_PlayerManager:NSObject{ } } //是否因为广告原因延迟了播放(当广告加载时,延迟播放器状态切换) - var isAdLate:Bool?{ + var isAdLate:Bool? = false{ didSet{ DispatchQueue.main.asyncAfter(deadline: .now()) { [weak self] in @@ -370,6 +370,8 @@ class MP_PlayerManager:NSObject{ }else { player.play() } + }else { + } //暂停计时器,并获取延时值 suspendTimer() diff --git a/relax.offline.mp3.music/MP/MPPositive/ViewControllers/Base(基类,导航栏,标签栏)/MPPositive_BaseViewController.swift b/relax.offline.mp3.music/MP/MPPositive/ViewControllers/Base(基类,导航栏,标签栏)/MPPositive_BaseViewController.swift index 401a1e7..59d05e8 100644 --- a/relax.offline.mp3.music/MP/MPPositive/ViewControllers/Base(基类,导航栏,标签栏)/MPPositive_BaseViewController.swift +++ b/relax.offline.mp3.music/MP/MPPositive/ViewControllers/Base(基类,导航栏,标签栏)/MPPositive_BaseViewController.swift @@ -37,6 +37,7 @@ class MPPositive_BaseViewController: MP_BaseViewController, UIGestureRecognizerD override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) NotificationCenter.notificationKey.add(observer: self, selector: #selector(errorAction(_ :)), notificationName: .netWork_error_deal) + NotificationCenter.notificationKey.add(observer: self, selector: #selector(switchCurrentVideoAction(_ :)), notificationName: .positive_player_reload) } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) @@ -161,5 +162,21 @@ class MPPositive_BaseViewController: MP_BaseViewController, UIGestureRecognizerD } return true } - + ///当用户切换了歌曲后 + @objc private func switchCurrentVideoAction(_ notification:Notification) { + DispatchQueue.main.async { + [weak self] in + guard let self = self else {return} + //检索当前View内部是否存在tableView + view.subviews.forEach { item in + if item is UITableView { + let tableView = item as? UITableView + tableView?.reloadData() + }else if item is UICollectionView { + let collectionView = item as? UICollectionView + collectionView?.reloadData() + } + } + } + } } diff --git a/relax.offline.mp3.music/MP/MPPositive/ViewControllers/Base(基类,导航栏,标签栏)/MPPositive_TabBarController.swift b/relax.offline.mp3.music/MP/MPPositive/ViewControllers/Base(基类,导航栏,标签栏)/MPPositive_TabBarController.swift index 2467546..4fcf6ec 100644 --- a/relax.offline.mp3.music/MP/MPPositive/ViewControllers/Base(基类,导航栏,标签栏)/MPPositive_TabBarController.swift +++ b/relax.offline.mp3.music/MP/MPPositive/ViewControllers/Base(基类,导航栏,标签栏)/MPPositive_TabBarController.swift @@ -21,6 +21,7 @@ class MPPositive_TabBarController: UITabBarController, UIViewControllerTransitio } //是否Push private var isPush:Bool = false + var pushPlayerBlock:(() -> Void)? override func viewDidLoad() { super.viewDidLoad() self.setValue(customTabBar, forKey: "tabBar") @@ -94,28 +95,38 @@ extension MPPositive_TabBarController { @objc private func pupPlayerAction() { MP_AdMobManager.shared.showPlayInterstitialAdIfAvailable { [weak self] ad in guard let self = self else {return} - //判断音乐播放器是否已经播放 - MP_AdMobManager.shared.isShowingPlayInterstitialAd = true - //播放器还未播放,可以弹出广告 - MP_AdMobManager.shared.setInterstitialSwitch(true) - ad.fullScreenContentDelegate = self - ad.present(fromRootViewController: self) + if let ad = ad { + //判断音乐播放器是否已经播放 + MP_AdMobManager.shared.isShowingPlayInterstitialAd = true + //播放器还未播放,可以弹出广告 + MP_AdMobManager.shared.setInterstitialSwitch(true) + ad.fullScreenContentDelegate = self + ad.present(fromRootViewController: self) + }else { + if let block = self.pushPlayerBlock { + block() + } + } } - //执行加载播放器页面 - DispatchQueue.main.async { + //赋予block任务块 + self.pushPlayerBlock = { [weak self] in - let playerVC = MPPositive_PlayerViewController() - playerVC.modalPresentationStyle = .fullScreen - playerVC.recommendBlock = { - let recommendVC = MPPositive_RecommendViewController(MP_PlayerManager.shared.loadPlayer?.currentVideo?.song.relatedID ?? "") - self?.viewControllers![self?.selectedIndex ?? 0].children[0].navigationController?.pushViewController(recommendVC, animated: false) + //执行加载播放器页面 + DispatchQueue.main.async { + [weak self] in + let playerVC = MPPositive_PlayerViewController() + playerVC.modalPresentationStyle = .fullScreen + playerVC.recommendBlock = { + let recommendVC = MPPositive_RecommendViewController(MP_PlayerManager.shared.loadPlayer?.currentVideo?.song.relatedID ?? "") + self?.viewControllers![self?.selectedIndex ?? 0].children[0].navigationController?.pushViewController(recommendVC, animated: false) + } + playerVC.searchBlock = { (text) in + MP_AnalyticsManager.shared.search_from_actionAction("player page") + let resultVC = MPPositive_SearchResultShowViewController(text, isShowAd: false) + self?.viewControllers![self?.selectedIndex ?? 0].children[0].navigationController?.pushViewController(resultVC, animated: false) + } + self?.present(playerVC, animated: true) } - playerVC.searchBlock = { (text) in - MP_AnalyticsManager.shared.search_from_actionAction("player page") - let resultVC = MPPositive_SearchResultShowViewController(text, isShowAd: false) - self?.viewControllers![self?.selectedIndex ?? 0].children[0].navigationController?.pushViewController(resultVC, animated: false) - } - self?.present(playerVC, animated: true) } } //切换底部音乐模块状态 @@ -167,9 +178,15 @@ extension MPPositive_TabBarController { // UIApplication.shared.isStatusBarHidden = true if ad === MP_AdMobManager.shared.playInterstitialAd {//播放插页广告 print("当前展示的广告是播放插页广告,广告ID--\(MP_AdMobManager.shared.playInterstitialAd?.adUnitID ?? "")") - MP_AdMobManager.shared.playInterstitialAd?.paidEventHandler = { adValue in + if MP_AnalyticsManager.shared.infoFromAdMobSource(MP_AdMobManager.shared.playInterstitialAd?.responseInfo) { + MP_AdMobManager.shared.playInterstitialAd?.paidEventHandler = { adValue in + if let response = MP_AdMobManager.shared.playInterstitialAd?.responseInfo { + MP_AnalyticsManager.shared.play_ads_showSuccessAction(response, adValue: adValue) + } + } + }else { if let response = MP_AdMobManager.shared.playInterstitialAd?.responseInfo { - MP_AnalyticsManager.shared.play_ads_showSuccessAction(response, adValue: adValue) + MP_AnalyticsManager.shared.play_ads_showSuccessAction(response, adValue: .init()) } } } @@ -185,16 +202,8 @@ extension MPPositive_TabBarController { if MP_AdMobManager.shared.completePlayInterstitialAdBlock != nil { MP_AdMobManager.shared.completePlayInterstitialAdBlock!() } - //执行加载播放器页面 - DispatchQueue.main.async { - [weak self] in - let playerVC = MPPositive_PlayerViewController() - playerVC.modalPresentationStyle = .fullScreen - playerVC.recommendBlock = { - let recommendVC = MPPositive_RecommendViewController(MP_PlayerManager.shared.loadPlayer.currentVideo.song.relatedID) - self?.viewControllers![self?.selectedIndex ?? 0].children[0].navigationController?.pushViewController(recommendVC, animated: false) - } - self?.present(playerVC, animated: true) + if let block = self.pushPlayerBlock { + block() } } diff --git a/relax.offline.mp3.music/MP/MPPositive/ViewControllers/Home(首页,各项列表页,艺术家页)/MPPositive_HomeViewController.swift b/relax.offline.mp3.music/MP/MPPositive/ViewControllers/Home(首页,各项列表页,艺术家页)/MPPositive_HomeViewController.swift index 7cb0d13..504e296 100644 --- a/relax.offline.mp3.music/MP/MPPositive/ViewControllers/Home(首页,各项列表页,艺术家页)/MPPositive_HomeViewController.swift +++ b/relax.offline.mp3.music/MP/MPPositive/ViewControllers/Home(首页,各项列表页,艺术家页)/MPPositive_HomeViewController.swift @@ -102,6 +102,10 @@ class MPPositive_HomeViewController: MPPositive_BaseViewController, UIViewContro MP_HUD.loading() } MP_AdMobManager.shared.configureLibraryNativeAd(rootController: self) + MP_AdMobManager.shared.loadLibraryNativeAd() + //加载搜索原生广告 + MP_AdMobManager.shared.configureSreachNativeAd(rootController: self) + MP_AdMobManager.shared.loadSearchNativeAd() errorBlock = { [weak self] in guard let self = self else { @@ -454,102 +458,96 @@ extension MPPositive_HomeViewController: UITableViewDataSource, UITableViewDeleg } func numberOfSections(in tableView: UITableView) -> Int { - if MPPositive_BrowseLoadViewModel.shared.libraryList.libraryViewModels.isEmpty { - return 1 - }else { - return 2 - } + return 1 } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - if MPPositive_BrowseLoadViewModel.shared.libraryList.libraryViewModels.isEmpty { - return MPPositive_BrowseLoadViewModel.shared.browseModuleLists.count - }else { - switch section { - case 0: - return 1 - default: - return MPPositive_BrowseLoadViewModel.shared.browseModuleLists.count - } - } + return MPPositive_BrowseLoadViewModel.shared.browseModuleLists.count + 1 } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - switch indexPath.section { - case 0: + switch indexPath.row { + case 1: let cell = tableView.dequeueReusableCell(withIdentifier: MPPositive_HomeLibraryListstableViewCellID, for: indexPath) as! MPPositive_HomeLibraryListstableViewCell cell.libraryViewModels = MPPositive_BrowseLoadViewModel.shared.libraryList.libraryViewModels return cell default: - if let first = MPPositive_BrowseLoadViewModel.shared.browseModuleLists[indexPath.row].items.first, first.browseItem.itemType == .single, (first.browseItem.pageType == "MUSIC_VIDEO_TYPE_ATV" || first.browseItem.pageType == "MUSIC_VIDEO_TYPE_UGC") { - //是单曲 - let cell = tableView.dequeueReusableCell(withIdentifier: MPPositive_HomeSinglesTableViewCellID, for: indexPath) as! MPPositive_HomeSinglesTableViewCell - cell.browseViewModel = MPPositive_BrowseLoadViewModel.shared.browseModuleLists[indexPath.row] - return cell - }else { - let cell = tableView.dequeueReusableCell(withIdentifier: MPPositive_HomeShowTableViewCellID, for: indexPath) as! MPPositive_HomeShowTableViewCell - cell.browseViewModel = MPPositive_BrowseLoadViewModel.shared.browseModuleLists[indexPath.row] - if let first = MPPositive_BrowseLoadViewModel.shared.browseModuleLists[indexPath.row].items.first, first.browseItem.itemType == .single, first.browseItem.pageType == "MUSIC_VIDEO_TYPE_OMV" { - cell.showType = .Fifth + let row:Int = indexPath.row == 0 ? 0:(indexPath.row-1) + if row < MPPositive_BrowseLoadViewModel.shared.browseModuleLists.count { + if let first = MPPositive_BrowseLoadViewModel.shared.browseModuleLists[row].items.first, first.browseItem.itemType == .single, (first.browseItem.pageType == "MUSIC_VIDEO_TYPE_ATV" || first.browseItem.pageType == "MUSIC_VIDEO_TYPE_UGC") { + //是单曲 + let cell = tableView.dequeueReusableCell(withIdentifier: MPPositive_HomeSinglesTableViewCellID, for: indexPath) as! MPPositive_HomeSinglesTableViewCell + cell.browseViewModel = MPPositive_BrowseLoadViewModel.shared.browseModuleLists[row] + return cell }else { - //判断是列表还是艺术家 - if MPPositive_BrowseLoadViewModel.shared.browseModuleLists[indexPath.row].items.first?.browseItem.pageType == "MUSIC_PAGE_TYPE_ARTIST" { - cell.showType = .Fourth + let cell = tableView.dequeueReusableCell(withIdentifier: MPPositive_HomeShowTableViewCellID, for: indexPath) as! MPPositive_HomeShowTableViewCell + cell.browseViewModel = MPPositive_BrowseLoadViewModel.shared.browseModuleLists[row] + if let first = MPPositive_BrowseLoadViewModel.shared.browseModuleLists[row].items.first, first.browseItem.itemType == .single, first.browseItem.pageType == "MUSIC_VIDEO_TYPE_OMV" { + cell.showType = .Fifth }else { - cell.showType = .Third - } - } - cell.requestNextBlock = { - [weak self] (item) in - guard let self = self else {return} - MP_AnalyticsManager.shared.home_b_module_clickAction(item.browseItem.pageType ?? "") - switch item.browseItem.itemType { - case .single: - //单曲/视频跳转 - MPPositive_Debouncer.shared.call { - [weak self] in - guard let self = self else {return} - guard MP_NetWorkManager.shared.netWorkStatu == .reachable else { - MP_HUD.text("Weak connection.", delay: 2.0, completion: nil) - return - } - MP_AnalyticsManager.shared.song_clickAction("Home") - //优先清除数据 - MP_PlayerManager.shared.loadPlayer = nil - //弹出播放器 - NotificationCenter.notificationKey.post(notificationName: .pup_player_vc) - MP_AnalyticsManager.shared.player_b_impAction() - //触发next请求,优先获取列表全部单曲基础数据(不完善) - MP_NetWorkManager.shared.requestNextList(item.browseItem.playListId ?? "", videoId: item.browseItem.videoId ?? "", clickTrackingParams: item.browseItem.clickTrackingParams){ [weak self] listSongs in - guard let self = self else {return} - //回掉的数据并不完善,生成一个playerloadViewModel - let lodaViewModel = MPPositive_PlayerLoadViewModel(listSongs, currentVideoId: item.browseItem.videoId ?? "") - lodaViewModel.improveData(item.browseItem.videoId ?? "") - //更改播放器播放类型 - MP_PlayerManager.shared.setPlayType(.normal) - MP_PlayerManager.shared.loadPlayer = lodaViewModel - MP_AnalyticsManager.shared.player_b_listAction() - } + //判断是列表还是艺术家 + if MPPositive_BrowseLoadViewModel.shared.browseModuleLists[row].items.first?.browseItem.pageType == "MUSIC_PAGE_TYPE_ARTIST" { + cell.showType = .Fourth + }else { + cell.showType = .Third } - case .list: - isFirstAppearance = false - //列表专辑 - let listVC = MPPositive_ListShowViewController(item.browseItem.browseId ?? "", params: "", title: item.title ?? "", subtitle: item.subtitle ?? "", clickTrackingParams: item.browseItem.clickTrackingParams ?? "") - navigationController?.pushViewController(listVC, animated: true) - case .artist: - isFirstAppearance = false - //前往艺术家页面 - let artistVC = MPPositive_ArtistShowViewController(item.browseItem.artistId ?? "", clickTrackingParams: item.browseItem.clickTrackingParams ?? "") - navigationController?.pushViewController(artistVC, animated: true) - default: - break } + cell.requestNextBlock = { + [weak self] (item) in + guard let self = self else {return} + MP_AnalyticsManager.shared.home_b_module_clickAction(item.browseItem.pageType ?? "") + switch item.browseItem.itemType { + case .single: + //单曲/视频跳转 + MPPositive_Debouncer.shared.call { + [weak self] in + guard let self = self else {return} + guard MP_NetWorkManager.shared.netWorkStatu == .reachable else { + MP_HUD.text("Weak connection.", delay: 2.0, completion: nil) + return + } + MP_AnalyticsManager.shared.song_clickAction("Home") + //优先清除数据 + MP_PlayerManager.shared.loadPlayer = nil + //弹出播放器 + NotificationCenter.notificationKey.post(notificationName: .pup_player_vc) + MP_AnalyticsManager.shared.player_b_impAction() + //触发next请求,优先获取列表全部单曲基础数据(不完善) + MP_NetWorkManager.shared.requestNextList(item.browseItem.playListId ?? "", videoId: item.browseItem.videoId ?? "", clickTrackingParams: item.browseItem.clickTrackingParams){ [weak self] listSongs in + guard let self = self else {return} + //回掉的数据并不完善,生成一个playerloadViewModel + let lodaViewModel = MPPositive_PlayerLoadViewModel(listSongs, currentVideoId: item.browseItem.videoId ?? "") + lodaViewModel.improveData(item.browseItem.videoId ?? "") + //更改播放器播放类型 + MP_PlayerManager.shared.setPlayType(.normal) + MP_PlayerManager.shared.loadPlayer = lodaViewModel + MP_AnalyticsManager.shared.player_b_listAction() + } + } + case .list: + isFirstAppearance = false + //列表专辑 + let listVC = MPPositive_ListShowViewController(item.browseItem.browseId ?? "", params: "", title: item.title ?? "", subtitle: item.subtitle ?? "", clickTrackingParams: item.browseItem.clickTrackingParams ?? "") + navigationController?.pushViewController(listVC, animated: true) + case .artist: + isFirstAppearance = false + //前往艺术家页面 + let artistVC = MPPositive_ArtistShowViewController(item.browseItem.artistId ?? "", clickTrackingParams: item.browseItem.clickTrackingParams ?? "") + navigationController?.pushViewController(artistVC, animated: true) + default: + break + } + } + cell.findMoreBlock = { + [weak self] in + guard let self = self else {return} + isFirstAppearance = false + let moreVC = MPPositive_MoreContentViewController(MPPositive_BrowseLoadViewModel.shared.browseModuleLists[row]) + navigationController?.pushViewController(moreVC, animated: true) + } + return cell } - cell.findMoreBlock = { - [weak self] in - guard let self = self else {return} - isFirstAppearance = false - let moreVC = MPPositive_MoreContentViewController(MPPositive_BrowseLoadViewModel.shared.browseModuleLists[indexPath.row]) - navigationController?.pushViewController(moreVC, animated: true) - } + }else { + let cell = tableView.dequeueReusableCell(withIdentifier: MPPositive_HomeLibraryListstableViewCellID, for: indexPath) as! MPPositive_HomeLibraryListstableViewCell + cell.libraryViewModels = MPPositive_BrowseLoadViewModel.shared.libraryList.libraryViewModels return cell } } diff --git a/relax.offline.mp3.music/MP/MPPositive/ViewControllers/Search(搜索页)/MPPositive_SearchResultShowViewController.swift b/relax.offline.mp3.music/MP/MPPositive/ViewControllers/Search(搜索页)/MPPositive_SearchResultShowViewController.swift index 890c050..4c76a72 100644 --- a/relax.offline.mp3.music/MP/MPPositive/ViewControllers/Search(搜索页)/MPPositive_SearchResultShowViewController.swift +++ b/relax.offline.mp3.music/MP/MPPositive/ViewControllers/Search(搜索页)/MPPositive_SearchResultShowViewController.swift @@ -212,6 +212,7 @@ class MPPositive_SearchResultShowViewController: MPPositive_BaseViewController, searchText = "" suggestionView.suggestions = nil resultsShowView.loadModel = nil + historyView.isHidden = false } //取消并返回上一页 @objc private func backPopClick(_ sender:UIButton) { @@ -235,6 +236,7 @@ extension MPPositive_SearchResultShowViewController:UITextFieldDelegate { if text.isEmpty { self.suggestionList = nil cancelDebounceTimer() + historyView.isHidden = false }else { //触发网络请求 loadSearchSuggestions(text) diff --git a/relax.offline.mp3.music/MP/MPPositive/ViewControllers/Search(搜索页)/MPPositive_SearchViewController.swift b/relax.offline.mp3.music/MP/MPPositive/ViewControllers/Search(搜索页)/MPPositive_SearchViewController.swift index dcf2d3e..339b28e 100644 --- a/relax.offline.mp3.music/MP/MPPositive/ViewControllers/Search(搜索页)/MPPositive_SearchViewController.swift +++ b/relax.offline.mp3.music/MP/MPPositive/ViewControllers/Search(搜索页)/MPPositive_SearchViewController.swift @@ -33,9 +33,6 @@ class MPPositive_SearchViewController: MPPositive_BaseViewController { super.viewDidLoad() setTitle("") configure() - //加载搜索原生广告 - MP_AdMobManager.shared.configureSreachNativeAd(rootController: self) - MP_AdMobManager.shared.loadSearchNativeAd() NotificationCenter.notificationKey.add(observer: self, selector: #selector(grideReloadAction(_ :)), notificationName: .search_gride_reload) } override func viewWillAppear(_ animated: Bool) { diff --git a/relax.offline.mp3.music/MP/MPPositive/Views/Base/MPPositive_BaseShowView.swift b/relax.offline.mp3.music/MP/MPPositive/Views/Base/MPPositive_BaseShowView.swift new file mode 100644 index 0000000..7af6882 --- /dev/null +++ b/relax.offline.mp3.music/MP/MPPositive/Views/Base/MPPositive_BaseShowView.swift @@ -0,0 +1,39 @@ +// +// MPPositive_BaseShowView.swift +// relax.offline.mp3.music +// +// Created by Mr.Zhou on 2024/8/9. +// + +import UIKit + +class MPPositive_BaseShowView: UIView { + + override init(frame: CGRect) { + super.init(frame: frame) + NotificationCenter.notificationKey.add(observer: self, selector: #selector(switchCurrentVideoAction(_ :)), notificationName: .positive_player_reload) + } + ///当用户切换了歌曲后 + @objc private func switchCurrentVideoAction(_ notification:Notification) { + DispatchQueue.main.async { + [weak self] in + guard let self = self else {return} + //检索当前View内部是否存在tableView + subviews.forEach { item in + if item is UITableView { + let tableView = item as? UITableView + tableView?.reloadData() + }else if item is UICollectionView { + let collectionView = item as? UICollectionView + collectionView?.reloadData() + } + } + } + } + required init?(coder: NSCoder) { + super.init(coder: coder) + } + deinit{ + NotificationCenter.default.removeObserver(self) + } +} diff --git a/relax.offline.mp3.music/MP/MPPositive/Views/Home/MPPositive_ArtistShowSongTableViewCell.swift b/relax.offline.mp3.music/MP/MPPositive/Views/Home/MPPositive_ArtistShowSongTableViewCell.swift index fcbf548..46ffa62 100644 --- a/relax.offline.mp3.music/MP/MPPositive/Views/Home/MPPositive_ArtistShowSongTableViewCell.swift +++ b/relax.offline.mp3.music/MP/MPPositive/Views/Home/MPPositive_ArtistShowSongTableViewCell.swift @@ -15,6 +15,7 @@ class MPPositive_ArtistShowSongTableViewCell: UITableViewCell, PKDownloadButtonD imageView.layer.masksToBounds = true return imageView }() + private lazy var maskImageView:MP_WaveAnimationMaskView = .init(frame: .init(x: 0, y: 0, width: 24*width, height: 24*width), cornerRadius: 10*width) private lazy var titleLabel:UILabel = createLabel(font: .systemFont(ofSize: 14*width, weight: .regular), textColor: .white, textAlignment: .left) private lazy var subtitleLabel:UILabel = createLabel(font: .systemFont(ofSize: 12*width, weight: .regular), textColor: .init(hex: "#FFFFFF", alpha: 0.6), textAlignment: .left) ///更多按钮 @@ -54,6 +55,15 @@ class MPPositive_ArtistShowSongTableViewCell: UITableViewCell, PKDownloadButtonD titleLabel.text = itemView.title subtitleLabel.text = itemView.subtitle setProgress(itemView.browseItem.videoId ?? "") + if (itemView?.browseItem.videoId == MP_PlayerManager.shared.loadPlayer?.currentVideo?.song?.videoId) { + titleLabel.textColor = greenTextColor + maskImageView.isHidden = false + maskImageView.startAnimation() + }else { + titleLabel.textColor = .white + maskImageView.isHidden = true + maskImageView.stopAnimation() + } } } @@ -102,6 +112,14 @@ class MPPositive_ArtistShowSongTableViewCell: UITableViewCell, PKDownloadButtonD make.bottom.equalToSuperview().offset(-8*width) make.left.equalToSuperview().offset(18*width) } + contentView.addSubview(maskImageView) + maskImageView.snp.makeConstraints { make in + make.width.height.equalTo(iconImageView) + make.center.equalTo(iconImageView) + } + maskImageView.configure() + maskImageView.isHidden = true + maskImageView.stopAnimation() contentView.addSubview(moreBtn) moreBtn.snp.makeConstraints { make in make.width.height.equalTo(24*width) diff --git a/relax.offline.mp3.music/MP/MPPositive/Views/Home/MPPositive_HomeSingleCollectionViewCell.swift b/relax.offline.mp3.music/MP/MPPositive/Views/Home/MPPositive_HomeSingleCollectionViewCell.swift index 4b22e24..c3898cf 100644 --- a/relax.offline.mp3.music/MP/MPPositive/Views/Home/MPPositive_HomeSingleCollectionViewCell.swift +++ b/relax.offline.mp3.music/MP/MPPositive/Views/Home/MPPositive_HomeSingleCollectionViewCell.swift @@ -6,8 +6,8 @@ // import UIKit - -class MPPositive_HomeSingleCollectionViewCell: UICollectionViewCell { +import DownloadButton +class MPPositive_HomeSingleCollectionViewCell: UICollectionViewCell, PKDownloadButtonDelegate { ///封面图片 private lazy var coverImageView:UIImageView = { let imageView:UIImageView = .init() @@ -16,6 +16,7 @@ class MPPositive_HomeSingleCollectionViewCell: UICollectionViewCell { imageView.layer.cornerRadius = 10*width return imageView }() + private lazy var maskImageView:MP_WaveAnimationMaskView = .init(frame: .init(x: 0, y: 0, width: 24*width, height: 24*width), cornerRadius: 10*width) ///标题 private lazy var titleLabel:UILabel = createLabel(font: .systemFont(ofSize: 14*width, weight: .regular), textColor: .white, textAlignment: .left) ///副标题 @@ -27,19 +28,62 @@ class MPPositive_HomeSingleCollectionViewCell: UICollectionViewCell { btn.addTarget(self, action: #selector(moreActionClick(_ :)), for: .touchUpInside) return btn }() + ///下载按钮 + private lazy var dowloadBtn:PKDownloadButton = { + let btn:PKDownloadButton = .init() + //开始下载状态 + btn.startDownloadButton.cleanDefaultAppearance() + btn.startDownloadButton.setBackgroundImage(UIImage(named: "Song_Unload'logo"), for: .normal) + //下载结束状态 + btn.downloadedButton.setBackgroundImage(UIImage(named: "Song_Loaded'logo"), for: .normal) + btn.downloadedButton.setAttributedTitle(nil, for: .normal) + //停止下载状态 + btn.stopDownloadButton.stopButton.setImage(UIImage(named: "download"), for: .normal) + btn.stopDownloadButton.tintColor = UIColor(hex: "#80F988") + btn.stopDownloadButton.stopButtonWidth = 2 + btn.stopDownloadButton.filledLineWidth = 3*width + btn.stopDownloadButton.filledLineStyleOuter = true + + //加载状态设置 + btn.pendingView.tintColor = UIColor(hex: "#80F988") + btn.pendingView.radius = 12*width + btn.pendingView.emptyLineRadians = 2*width + btn.pendingView.spinTime = 3 + btn.delegate = self + return btn + }() var moreBlock:(() -> Void)? + //删除 + var deleteBlock:(() -> Void)? + //取消 + var cancelBlock:(() -> Void)? var itemViewModel:MPPositive_BrowseItemViewModel!{ didSet{ - itemViewModel.setUrltoImage(coverImageView) - titleLabel.text = itemViewModel.title - subtitleLabel.text = itemViewModel.subtitle + itemViewModel?.setUrltoImage(coverImageView) + titleLabel.text = itemViewModel?.title + subtitleLabel.text = itemViewModel?.subtitle + setProgress(itemViewModel?.browseItem.videoId ?? "") + if (itemViewModel?.browseItem.videoId == MP_PlayerManager.shared.loadPlayer?.currentVideo?.song?.videoId) { + titleLabel.textColor = greenTextColor + maskImageView.isHidden = false + maskImageView.startAnimation() + }else { + titleLabel.textColor = .white + maskImageView.isHidden = true + maskImageView.stopAnimation() + } } } override init(frame: CGRect) { super.init(frame: frame) + //注册通知 + NotificationCenter.notificationKey.add(observer: self, selector: #selector(downloadProgressAction(_ :)), notificationName: .download_progress_source) + NotificationCenter.notificationKey.add(observer: self, selector: #selector(downloadEndAction(_ :)), notificationName: .dowload_end_source) confirgue() } - + deinit { + NotificationCenter.default.removeObserver(self) + } required init?(coder: NSCoder) { super.init(coder: coder) } @@ -53,17 +97,31 @@ class MPPositive_HomeSingleCollectionViewCell: UICollectionViewCell { make.left.equalToSuperview().offset(18*width) make.centerY.equalToSuperview() } + addSubview(maskImageView) + maskImageView.snp.makeConstraints { make in + make.width.height.equalTo(coverImageView) + make.center.equalTo(coverImageView) + } + maskImageView.configure() + maskImageView.isHidden = true + maskImageView.stopAnimation() addSubview(moreBtn) moreBtn.snp.makeConstraints { make in make.width.height.equalTo(24*width) make.centerY.equalTo(coverImageView.snp.centerY) make.right.equalToSuperview().offset(-5*width) } + addSubview(dowloadBtn) + dowloadBtn.snp.makeConstraints { make in + make.width.height.equalTo(24*width) + make.centerY.equalTo(moreBtn.snp.centerY) + make.right.equalTo(moreBtn.snp.left).offset(-8*width) + } addSubview(titleLabel) titleLabel.snp.makeConstraints { make in make.top.equalTo(coverImageView.snp.top).offset(10*width) make.left.equalTo(coverImageView.snp.right).offset(12*width) - make.right.equalTo(moreBtn.snp.left).offset(-12*width) + make.right.equalTo(dowloadBtn.snp.left).offset(-12*width) } addSubview(subtitleLabel) subtitleLabel.snp.makeConstraints { make in @@ -71,6 +129,19 @@ class MPPositive_HomeSingleCollectionViewCell: UICollectionViewCell { make.left.right.equalTo(titleLabel) } } + //收到progress加载 + @objc private func downloadProgressAction(_ sender:Notification) { + if let dict = sender.object as? [String:String], let videoId = dict["videoId"], let currentVideoId = itemViewModel?.browseItem.videoId, videoId == currentVideoId { + //比较当前videoId + setProgress(videoId) + } + } + //收到下载结束 + @objc private func downloadEndAction(_ sender:Notification) { + if let dict = sender.object as? [String:String], let videoId = dict["videoId"], let currentVideoId = itemViewModel?.browseItem.videoId, videoId == currentVideoId { + setProgress(videoId) + } + } //点击更多 @objc private func moreActionClick(_ sender:UIButton) { guard MP_NetWorkManager.shared.netWorkStatu == .reachable else { @@ -82,4 +153,122 @@ class MPPositive_HomeSingleCollectionViewCell: UICollectionViewCell { } moreBlock!() } + //根据输入videoId检索是否下载 + func setProgress(_ videoId:String) { + guard videoId.isEmpty == false, videoId == itemViewModel?.browseItem.videoId else { + DispatchQueue.main.async { + //未加入下载队列 + self.dowloadBtn.state = .startDownload + } + return + } + MP_DownloadManager.shared.loadQueue.async { + [weak self] in + guard let self = self else {return} + //判断是否下载完成 + MP_DownloadManager.shared.isDownloadedFileDocuments(videoId) { statu in + if statu == false { + //未下载,判断是否加入了下载队列 + if MP_DownloadManager.shared.isTasksQueue(for: videoId) { + //加入下载队列,确定是否活跃下中 + if MP_DownloadManager.shared.isActiveTask(for: videoId) { + DispatchQueue.main.async { + self.dowloadBtn.state = .downloading + } + //活跃中,获取下载值 + if let progress = MP_DownloadManager.shared.getProgress(for: videoId) { + //下载中 + DispatchQueue.main.async { + self.dowloadBtn.stopDownloadButton.progress = progress + } + } + }else { + //处于队列中,还未开始下载 + DispatchQueue.main.async { + //未加入下载队列 + self.dowloadBtn.state = .pending + } + } + }else { + //未加入下载队列 + DispatchQueue.main.async { + //未加入下载队列 + self.dowloadBtn.state = .startDownload + } + } + }else { + DispatchQueue.main.async { + //已经完成下载 + self.dowloadBtn.state = .downloaded + } + } + } + } + } + //下载按钮代理 + func downloadButtonTapped(_ downloadButton: PKDownloadButton!, currentState state: PKDownloadButtonState) { + var video:MPPositive_SongItemModel! + //根据当前按钮状态确定进度 + switch state { + case .startDownload://开始状态,点击后进入下载状态 + //检索当前网络状态 + guard MP_NetWorkManager.shared.netWorkStatu == .reachable else { + MP_HUD.text("Weak connection.", delay: 2.0, completion: nil) + return + } + //检索当前歌曲是否下载过 + guard let videoId = itemViewModel.browseItem.videoId else { + return + } + //切换为准备状态 + downloadButton.state = .pending + //通过网络请求获取当前预览项资源(转为Song) + MP_NetWorkManager.shared.requestNextList("", videoId: videoId, clickTrackingParams: nil){ + [weak self] listSongs in + guard let self = self, let first = listSongs.first else { + //获取资源失败 + self?.setProgress(videoId) + return + } + let group = DispatchGroup() + group.enter() + improveDataforLycirsAndRelated(first) {(result) in + first.lyricsID = result.0 + first.relatedID = result.1 + group.leave() + } + group.enter() + //补全资源路径组和封面路径组 + improveDataforResouceAndCover(first) {(resourceUrls, coverUrls) in + if let resourceUrls = resourceUrls { + first.resourceUrls = resourceUrls.0 + first.itags = resourceUrls.1 + first.mimeTypes = resourceUrls.2 + } + first.coverUrls = coverUrls + group.leave() + } + group.notify(queue: .main, execute: { + [weak self] in + guard let self = self else { + self?.setProgress(videoId) + return + } + video = first + //事件打点 + MP_AnalyticsManager.shared.player_b_download_clickAction(video.videoId, videoname: video.title ?? "", artistname: video.shortBylineText ?? "") + //补全了数据,执行下载 + MP_DownloadManager.shared.prepareVideoDownloadTask(from: video) + }) + } + case .downloaded://已下载 + if let block = deleteBlock { + block() + } + default: + if let block = cancelBlock { + block() + } + } + } } diff --git a/relax.offline.mp3.music/MP/MPPositive/Views/Home/MPPositive_HomeSinglesTableViewCell.swift b/relax.offline.mp3.music/MP/MPPositive/Views/Home/MPPositive_HomeSinglesTableViewCell.swift index 2466855..22a6728 100644 --- a/relax.offline.mp3.music/MP/MPPositive/Views/Home/MPPositive_HomeSinglesTableViewCell.swift +++ b/relax.offline.mp3.music/MP/MPPositive/Views/Home/MPPositive_HomeSinglesTableViewCell.swift @@ -74,7 +74,7 @@ class MPPositive_HomeSinglesTableViewCell: UITableViewCell, UIViewControllerTran collectionView.snp.makeConstraints { make in make.top.equalTo(titleLabel.snp.bottom) make.left.right.equalToSuperview() - make.bottom.equalToSuperview().offset(-32*width).priority(999) + make.bottom.equalToSuperview().offset(-20*width).priority(999) } } //经过计算设置tableViewCell真实高度 @@ -98,8 +98,7 @@ extension MPPositive_HomeSinglesTableViewCell:UICollectionViewDataSource, UIColl cell.itemViewModel = browseViewModel.items[indexPath.row] cell.moreBlock = { [weak self] in - guard let self = self else {return} - let itemView = self.browseViewModel.items[indexPath.row] + guard let self = self, let itemView = self.browseViewModel?.items[indexPath.row] else {return} MPPositive_Debouncer.shared.call { MPPositive_ModalType = .MoreOperations let moreVC = MPPositive_MoreSongOperationsViewController(itemView) @@ -113,6 +112,44 @@ extension MPPositive_HomeSinglesTableViewCell:UICollectionViewDataSource, UIColl self.parentController()?.present(moreVC, animated: true) } } + cell.deleteBlock = { + [weak self] in + guard let self = self else {return} + //点击删除下载 + let alertController = UIAlertController(title: "Delete This Song", message: "Are you sure you want to delete the offline resources of this song?", preferredStyle: .alert) + let cancel = UIAlertAction(title: "Cancel", style: .cancel) + alertController.addAction(cancel) + let sure = UIAlertAction(title: "Sure", style: .destructive) {(action) in + guard let videoId = self.browseViewModel?.items[indexPath.row].browseItem.videoId else {return} + //确定删除 + MP_DownloadManager.shared.deleteFileDocuments(videoId) { videoId in + MP_HUD.progress("Loading...", delay: 0.5) { + MP_HUD.text("Removed", delay: 1.0, completion: nil) + collectionView.reloadData() + } + } + } + alertController.addAction(sure) + self.parentController()?.present(alertController, animated: true) + } + cell.cancelBlock = { + [weak self] in + guard let self = self else {return} + //点击取消下载 + let alertController = UIAlertController(title: "Cancel Song Download Task", message: "Are you sure you want to cancel the download task of this song?", preferredStyle: .alert) + let cancel = UIAlertAction(title: "Cancel", style: .cancel) + alertController.addAction(cancel) + let sure = UIAlertAction(title: "Sure", style: .destructive) {(action) in + guard let videoId = self.browseViewModel?.items[indexPath.row].browseItem.videoId else {return} + //确定取消 + MP_DownloadManager.shared.cancelDownloadTask(videoId) { videoId in + MP_HUD.text("Canceled", delay: 1.0, completion: nil) + collectionView.reloadData() + } + } + alertController.addAction(sure) + self.parentController()?.present(alertController, animated: true) + } return cell } func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { diff --git a/relax.offline.mp3.music/MP/MPPositive/Views/Home/MPPositive_MusicItemShowTableViewCell.swift b/relax.offline.mp3.music/MP/MPPositive/Views/Home/MPPositive_MusicItemShowTableViewCell.swift index 1e35533..d8bde46 100644 --- a/relax.offline.mp3.music/MP/MPPositive/Views/Home/MPPositive_MusicItemShowTableViewCell.swift +++ b/relax.offline.mp3.music/MP/MPPositive/Views/Home/MPPositive_MusicItemShowTableViewCell.swift @@ -17,6 +17,7 @@ class MPPositive_MusicItemShowTableViewCell: UITableViewCell, PKDownloadButtonDe imageView.layer.cornerRadius = 10*width return imageView }() + private lazy var maskImageView:MP_WaveAnimationMaskView = .init(frame: .init(x: 0, y: 0, width: 24*width, height: 24*width), cornerRadius: 10*width) ///标题 private lazy var titleLabel:UILabel = createLabel(font: .systemFont(ofSize: 14*width, weight: .regular), textColor: .white, textAlignment: .left) ///副标题 @@ -63,6 +64,15 @@ class MPPositive_MusicItemShowTableViewCell: UITableViewCell, PKDownloadButtonDe subtitleLabel.text = itemView.subtitle rankLabel.isHidden = (itemView.coverUrl != nil) setProgress(itemView.browseItem.videoId ?? "") + if (itemView?.browseItem.videoId == MP_PlayerManager.shared.loadPlayer?.currentVideo?.song?.videoId) { + titleLabel.textColor = greenTextColor + maskImageView.isHidden = false + maskImageView.startAnimation() + }else { + titleLabel.textColor = .white + maskImageView.isHidden = true + maskImageView.stopAnimation() + } } } var rank:Int = 0 { @@ -180,6 +190,14 @@ class MPPositive_MusicItemShowTableViewCell: UITableViewCell, PKDownloadButtonDe make.top.equalToSuperview().offset(8*width).priority(999) make.bottom.equalToSuperview().offset(-8*width).priority(999) } + contentView.addSubview(maskImageView) + maskImageView.snp.makeConstraints { make in + make.width.height.equalTo(coverImageView) + make.center.equalTo(coverImageView) + } + maskImageView.configure() + maskImageView.isHidden = true + maskImageView.stopAnimation() contentView.addSubview(rankLabel) rankLabel.snp.makeConstraints { make in make.center.equalTo(coverImageView) @@ -235,8 +253,6 @@ class MPPositive_MusicItemShowTableViewCell: UITableViewCell, PKDownloadButtonDe guard let videoId = itemView.browseItem.videoId else { return } - //未下载 -// MP_AdMobManager.shared.showLoadInterstitialAdIfAvailable(completion: nil) //切换为准备状态 downloadButton.state = .pending //通过网络请求获取当前预览项资源(转为Song) diff --git a/relax.offline.mp3.music/MP/MPPositive/Views/Player/MPPositive_RecommendShowTypeView.swift b/relax.offline.mp3.music/MP/MPPositive/Views/Player/MPPositive_RecommendShowTypeView.swift index 674ec5a..aa31d39 100644 --- a/relax.offline.mp3.music/MP/MPPositive/Views/Player/MPPositive_RecommendShowTypeView.swift +++ b/relax.offline.mp3.music/MP/MPPositive/Views/Player/MPPositive_RecommendShowTypeView.swift @@ -7,7 +7,7 @@ import UIKit import MJRefresh -class MPPositive_RecommendShowTypeView: UIView, JXSegmentedListContainerViewListDelegate { +class MPPositive_RecommendShowTypeView: MPPositive_BaseShowView, JXSegmentedListContainerViewListDelegate { //tableView private lazy var tableView:UITableView = { let tableView = UITableView() diff --git a/relax.offline.mp3.music/MP/MPPositive/Views/Search/MPPositive_SearchHistoryView.swift b/relax.offline.mp3.music/MP/MPPositive/Views/Search/MPPositive_SearchHistoryView.swift index dba098d..733a6b7 100644 --- a/relax.offline.mp3.music/MP/MPPositive/Views/Search/MPPositive_SearchHistoryView.swift +++ b/relax.offline.mp3.music/MP/MPPositive/Views/Search/MPPositive_SearchHistoryView.swift @@ -108,8 +108,12 @@ extension MPPositive_SearchHistoryView: UICollectionViewDataSource, UICollection return cell } func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { - if let text = historys[indexPath.row].text, let block = selectedTagBlock { - block(text) + MPPositive_Debouncer.shared.call { + [weak self] in + guard let self = self else {return} + if let text = historys[indexPath.row].text, let block = selectedTagBlock { + block(text) + } } } } diff --git a/relax.offline.mp3.music/MP/MPPositive/Views/Search/MPPositive_SearchResultPreviewShowView.swift b/relax.offline.mp3.music/MP/MPPositive/Views/Search/MPPositive_SearchResultPreviewShowView.swift index 8869699..5bad970 100644 --- a/relax.offline.mp3.music/MP/MPPositive/Views/Search/MPPositive_SearchResultPreviewShowView.swift +++ b/relax.offline.mp3.music/MP/MPPositive/Views/Search/MPPositive_SearchResultPreviewShowView.swift @@ -7,7 +7,7 @@ import UIKit ///对搜索预览结果展示 -class MPPositive_SearchResultPreviewShowView: UIView, JXSegmentedListContainerViewListDelegate { +class MPPositive_SearchResultPreviewShowView: MPPositive_BaseShowView, JXSegmentedListContainerViewListDelegate { //tableView private lazy var tableView:UITableView = { let tableView = UITableView() diff --git a/relax.offline.mp3.music/MP/MPPositive/Views/Search/MPPositive_SearchResultShowTableViewCell.swift b/relax.offline.mp3.music/MP/MPPositive/Views/Search/MPPositive_SearchResultShowTableViewCell.swift index 51166e8..e20cf46 100644 --- a/relax.offline.mp3.music/MP/MPPositive/Views/Search/MPPositive_SearchResultShowTableViewCell.swift +++ b/relax.offline.mp3.music/MP/MPPositive/Views/Search/MPPositive_SearchResultShowTableViewCell.swift @@ -17,6 +17,7 @@ class MPPositive_SearchResultShowTableViewCell: UITableViewCell, PKDownloadButto imageView.layer.cornerRadius = 10*width return imageView }() + private lazy var maskImageView:MP_WaveAnimationMaskView = .init(frame: .init(x: 0, y: 0, width: 24*width, height: 24*width), cornerRadius: 10*width) private lazy var titleLabel:UILabel = createLabel(font: .systemFont(ofSize: 14*width, weight: .regular), textColor: .white, textAlignment: .left) private lazy var subtitleLabel:UILabel = createLabel(font: .systemFont(ofSize: 12*width, weight: .regular), textColor: .init(hex: "#FFFFFF", alpha: 0.6), textAlignment: .left) ///更多按钮 @@ -72,6 +73,15 @@ class MPPositive_SearchResultShowTableViewCell: UITableViewCell, PKDownloadButto titleLabel.text = songViewModel.title subtitleLabel.text = songViewModel.subtitle setProgress(songViewModel.collectionSong.videoId ?? "") + if (songViewModel?.collectionSong.videoId == MP_PlayerManager.shared.loadPlayer?.currentVideo?.song?.videoId) { + titleLabel.textColor = greenTextColor + maskImageView.isHidden = false + maskImageView.startAnimation() + }else { + titleLabel.textColor = .white + maskImageView.isHidden = true + maskImageView.stopAnimation() + } } } var loadViewModel:MPPositive_DownloadViewModel!{ @@ -80,6 +90,15 @@ class MPPositive_SearchResultShowTableViewCell: UITableViewCell, PKDownloadButto titleLabel.text = loadViewModel.title subtitleLabel.text = loadViewModel.subtitle setProgress(loadViewModel.loadItem.videoId ?? "") + if (loadViewModel?.loadItem.videoId == MP_PlayerManager.shared.loadPlayer?.currentVideo?.song?.videoId) { + titleLabel.textColor = greenTextColor + maskImageView.isHidden = false + maskImageView.startAnimation() + }else { + titleLabel.textColor = .white + maskImageView.isHidden = true + maskImageView.stopAnimation() + } } } var videoModel:MPPositive_CustomVideoModel!{ @@ -88,6 +107,15 @@ class MPPositive_SearchResultShowTableViewCell: UITableViewCell, PKDownloadButto titleLabel.text = videoModel.title subtitleLabel.text = videoModel.subtitle setProgress(videoModel.videoId ?? "") + if (videoModel?.videoId == MP_PlayerManager.shared.loadPlayer?.currentVideo?.song?.videoId) { + titleLabel.textColor = greenTextColor + maskImageView.isHidden = false + maskImageView.startAnimation() + }else { + titleLabel.textColor = .white + maskImageView.isHidden = true + maskImageView.stopAnimation() + } } } @@ -193,6 +221,14 @@ class MPPositive_SearchResultShowTableViewCell: UITableViewCell, PKDownloadButto make.bottom.equalToSuperview().offset(-8*width) make.left.equalToSuperview().offset(18*width) } + contentView.addSubview(maskImageView) + maskImageView.snp.makeConstraints { make in + make.width.height.equalTo(iconImageView) + make.center.equalTo(iconImageView) + } + maskImageView.configure() + maskImageView.isHidden = true + maskImageView.stopAnimation() contentView.addSubview(moreBtn) moreBtn.snp.makeConstraints { make in make.width.height.equalTo(24*width) diff --git a/relax.offline.mp3.music/MP/MPPositive/Views/Search/MPPositive_SearchResultTypeShowView.swift b/relax.offline.mp3.music/MP/MPPositive/Views/Search/MPPositive_SearchResultTypeShowView.swift index a46abf1..d60bc11 100644 --- a/relax.offline.mp3.music/MP/MPPositive/Views/Search/MPPositive_SearchResultTypeShowView.swift +++ b/relax.offline.mp3.music/MP/MPPositive/Views/Search/MPPositive_SearchResultTypeShowView.swift @@ -8,7 +8,7 @@ import UIKit import MJRefresh ///对搜索结果进行分类详情展示 -class MPPositive_SearchResultTypeShowView: UIView, JXSegmentedListContainerViewListDelegate, UIViewControllerTransitioningDelegate { +class MPPositive_SearchResultTypeShowView: MPPositive_BaseShowView, JXSegmentedListContainerViewListDelegate, UIViewControllerTransitioningDelegate { //tableView private lazy var tableView:UITableView = { let tableView = UITableView() diff --git a/relax.offline.mp3.music/MP/MPSideA/ViewControllers/Base(基类-导航栏-标签栏-计时器-播放器)/MPSideA_TabBarController.swift b/relax.offline.mp3.music/MP/MPSideA/ViewControllers/Base(基类-导航栏-标签栏-计时器-播放器)/MPSideA_TabBarController.swift index 1ae63bf..f5b02ff 100644 --- a/relax.offline.mp3.music/MP/MPSideA/ViewControllers/Base(基类-导航栏-标签栏-计时器-播放器)/MPSideA_TabBarController.swift +++ b/relax.offline.mp3.music/MP/MPSideA/ViewControllers/Base(基类-导航栏-标签栏-计时器-播放器)/MPSideA_TabBarController.swift @@ -12,6 +12,7 @@ class MPSideA_TabBarController: UITabBarController, GADFullScreenContentDelegate private lazy var customTabBar:MPSideA_CustomTabBar = .init(frame: .init(x: 0, y: 0, width: screen_Width, height: 72*width)) //底部音乐展示View(默认隐藏) private lazy var bottomView:MPSideA_BottomShowView = .instanceFromNib() + var pushPlayerBlock:(() -> Void)? //底部bottomShowView的展示状态 private var isbottomShow:Bool = false{ willSet{ @@ -154,19 +155,28 @@ extension MPSideA_TabBarController: UIViewControllerTransitioningDelegate { print("Go to player") MP_AdMobManager.shared.showPlayInterstitialAdIfAvailable { [weak self] ad in guard let self = self else {return} - //判断音乐播放器是否已经播放 - MP_AdMobManager.shared.isShowingPlayInterstitialAd = true - //播放器还未播放,可以弹出广告 - MP_AdMobManager.shared.setInterstitialSwitch(true) - ad.fullScreenContentDelegate = self - ad.present(fromRootViewController: self) + if let ad = ad { + //判断音乐播放器是否已经播放 + MP_AdMobManager.shared.isShowingPlayInterstitialAd = true + //播放器还未播放,可以弹出广告 + MP_AdMobManager.shared.setInterstitialSwitch(true) + ad.fullScreenContentDelegate = self + ad.present(fromRootViewController: self) + }else { + if let block = self.pushPlayerBlock { + block() + } + } } - //执行加载播放器页面 - DispatchQueue.main.async { + self.pushPlayerBlock = { [weak self] in - //模态弹出 - let playerVC = MPSideA_PlayerViewController() - self?.present(playerVC, animated: true) + //执行加载播放器页面 + DispatchQueue.main.async { + [weak self] in + //模态弹出 + let playerVC = MPSideA_PlayerViewController() + self?.present(playerVC, animated: true) + } } } func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? { @@ -261,9 +271,15 @@ extension MPSideA_TabBarController { func adWillPresentFullScreenContent(_ ad: GADFullScreenPresentingAd) { if ad === MP_AdMobManager.shared.playInterstitialAd {//播放插页广告 print("当前展示的广告是播放插页广告,广告ID--\(MP_AdMobManager.shared.playInterstitialAd?.adUnitID ?? "")") - MP_AdMobManager.shared.playInterstitialAd?.paidEventHandler = { adValue in + if MP_AnalyticsManager.shared.infoFromAdMobSource(MP_AdMobManager.shared.playInterstitialAd?.responseInfo) { + MP_AdMobManager.shared.playInterstitialAd?.paidEventHandler = { adValue in + if let response = MP_AdMobManager.shared.playInterstitialAd?.responseInfo { + MP_AnalyticsManager.shared.play_ads_showSuccessAction(response, adValue: adValue) + } + } + }else { if let response = MP_AdMobManager.shared.playInterstitialAd?.responseInfo { - MP_AnalyticsManager.shared.play_ads_showSuccessAction(response, adValue: adValue) + MP_AnalyticsManager.shared.play_ads_showSuccessAction(response, adValue: .init()) } } } @@ -279,11 +295,8 @@ extension MPSideA_TabBarController { MP_AdMobManager.shared.completePlayInterstitialAdBlock!() } //执行加载播放器页面 - DispatchQueue.main.async { - [weak self] in - //模态弹出 - let playerVC = MPSideA_PlayerViewController() - self?.present(playerVC, animated: true) + if let block = self.pushPlayerBlock { + block() } } diff --git a/relax.offline.mp3.music/MP/MPSideA/Views/Center(个人资源)/MPSideA_CenterTableViewCell.swift b/relax.offline.mp3.music/MP/MPSideA/Views/Center(个人资源)/MPSideA_CenterTableViewCell.swift index 9895a0d..b5719a4 100644 --- a/relax.offline.mp3.music/MP/MPSideA/Views/Center(个人资源)/MPSideA_CenterTableViewCell.swift +++ b/relax.offline.mp3.music/MP/MPSideA/Views/Center(个人资源)/MPSideA_CenterTableViewCell.swift @@ -11,6 +11,11 @@ class MPSideA_CenterTableViewCell: UITableViewCell { @IBOutlet weak var coverImageView: UIImageView! @IBOutlet weak var titleLabel: UILabel! @IBOutlet weak var durationLabel: UILabel! + @IBOutlet weak var maskAnimationView: MP_WaveAnimationMaskView!{ + didSet{ + maskAnimationView.configure() + } + } var musicView:MPSideA_MusicViewModel!{ didSet{ coverImageView.image = musicView.cover @@ -21,11 +26,15 @@ class MPSideA_CenterTableViewCell: UITableViewCell { //展示未播放状态 titleLabel.textColor = .init(hex: "#FFFFFF") durationLabel.textColor = .init(hex: "#FFFFFF") + maskAnimationView.isHidden = true + maskAnimationView.stopAnimation() return } //展示播放状态 titleLabel.textColor = .init(hex: "#80F988") durationLabel.textColor = .init(hex: "#80F988") + maskAnimationView.isHidden = false + maskAnimationView.startAnimation() } } var moreBlock:((UIButton) -> Void)? diff --git a/relax.offline.mp3.music/MP/MPSideA/Views/Center(个人资源)/MPSideA_CenterTableViewCell.xib b/relax.offline.mp3.music/MP/MPSideA/Views/Center(个人资源)/MPSideA_CenterTableViewCell.xib index b6c29d7..0dd72a2 100644 --- a/relax.offline.mp3.music/MP/MPSideA/Views/Center(个人资源)/MPSideA_CenterTableViewCell.xib +++ b/relax.offline.mp3.music/MP/MPSideA/Views/Center(个人资源)/MPSideA_CenterTableViewCell.xib @@ -10,7 +10,7 @@ - + @@ -81,8 +81,18 @@ + + @@ -106,6 +116,9 @@ + + + @@ -124,6 +137,7 @@ + diff --git a/relax.offline.mp3.music/MP/MPSideA/Views/Home(音乐资源列表-播放器)/MPSideA_Home_FirstListCollectionViewCell.swift b/relax.offline.mp3.music/MP/MPSideA/Views/Home(音乐资源列表-播放器)/MPSideA_Home_FirstListCollectionViewCell.swift index 10a7194..abe2159 100644 --- a/relax.offline.mp3.music/MP/MPSideA/Views/Home(音乐资源列表-播放器)/MPSideA_Home_FirstListCollectionViewCell.swift +++ b/relax.offline.mp3.music/MP/MPSideA/Views/Home(音乐资源列表-播放器)/MPSideA_Home_FirstListCollectionViewCell.swift @@ -12,6 +12,11 @@ class MPSideA_Home_FirstListCollectionViewCell: UICollectionViewCell { @IBOutlet weak var stateBtn: UIButton! @IBOutlet weak var titleLabel: UILabel! @IBOutlet weak var subtitleLabel: UILabel! + @IBOutlet weak var maskAnimationView: MP_WaveAnimationMaskView!{ + didSet{ + maskAnimationView.configure() + } + } var musicView:MPSideA_MusicViewModel!{ didSet{ coverImageView.image = musicView.cover @@ -23,12 +28,16 @@ class MPSideA_Home_FirstListCollectionViewCell: UICollectionViewCell { titleLabel.textColor = .init(hex: "#FFFFFF") subtitleLabel.textColor = .init(hex: "#FFFFFF") stateBtn.isSelected = false + maskAnimationView.isHidden = true + maskAnimationView.stopAnimation() return } //展示播放状态 titleLabel.textColor = .init(hex: "#80F988") subtitleLabel.textColor = .init(hex: "#80F988") stateBtn.isSelected = true + maskAnimationView.isHidden = false + maskAnimationView.startAnimation() } } override func awakeFromNib() { diff --git a/relax.offline.mp3.music/MP/MPSideA/Views/Home(音乐资源列表-播放器)/MPSideA_Home_FirstListCollectionViewCell.xib b/relax.offline.mp3.music/MP/MPSideA/Views/Home(音乐资源列表-播放器)/MPSideA_Home_FirstListCollectionViewCell.xib index 28a838f..a79e6ce 100644 --- a/relax.offline.mp3.music/MP/MPSideA/Views/Home(音乐资源列表-播放器)/MPSideA_Home_FirstListCollectionViewCell.xib +++ b/relax.offline.mp3.music/MP/MPSideA/Views/Home(音乐资源列表-播放器)/MPSideA_Home_FirstListCollectionViewCell.xib @@ -10,7 +10,7 @@ - + @@ -20,6 +20,10 @@ + @@ -86,10 +90,14 @@ + + + + @@ -102,6 +110,7 @@ + diff --git a/relax.offline.mp3.music/MP/MPSideA/Views/Home(音乐资源列表-播放器)/MPSideA_Home_FourthListCollectionViewCell.swift b/relax.offline.mp3.music/MP/MPSideA/Views/Home(音乐资源列表-播放器)/MPSideA_Home_FourthListCollectionViewCell.swift index 81ffd48..7314edd 100644 --- a/relax.offline.mp3.music/MP/MPSideA/Views/Home(音乐资源列表-播放器)/MPSideA_Home_FourthListCollectionViewCell.swift +++ b/relax.offline.mp3.music/MP/MPSideA/Views/Home(音乐资源列表-播放器)/MPSideA_Home_FourthListCollectionViewCell.swift @@ -11,7 +11,11 @@ class MPSideA_Home_FourthListCollectionViewCell: UICollectionViewCell { @IBOutlet weak var coverImageView: UIImageView! @IBOutlet weak var titleLabel: UILabel! @IBOutlet weak var subtitleLabel: UILabel! - @IBOutlet weak var shieldView: UIView! + @IBOutlet weak var maskAnimationView: MP_WaveAnimationMaskView!{ + didSet{ + maskAnimationView.configure() + } + } @IBOutlet weak var stateBtn: UIButton! var musicView:MPSideA_MusicViewModel!{ didSet{ @@ -24,14 +28,16 @@ class MPSideA_Home_FourthListCollectionViewCell: UICollectionViewCell { titleLabel.textColor = .init(hex: "#FFFFFF") subtitleLabel.textColor = .init(hex: "#FFFFFF") stateBtn.isSelected = false - shieldView.isHidden = true + maskAnimationView.isHidden = true + maskAnimationView.stopAnimation() return } //展示播放状态 titleLabel.textColor = .init(hex: "#80F988") subtitleLabel.textColor = .init(hex: "#80F988") stateBtn.isSelected = true - shieldView.isHidden = false + maskAnimationView.isHidden = false + maskAnimationView.startAnimation() } } override func awakeFromNib() { diff --git a/relax.offline.mp3.music/MP/MPSideA/Views/Home(音乐资源列表-播放器)/MPSideA_Home_FourthListCollectionViewCell.xib b/relax.offline.mp3.music/MP/MPSideA/Views/Home(音乐资源列表-播放器)/MPSideA_Home_FourthListCollectionViewCell.xib index 05223cb..8796443 100644 --- a/relax.offline.mp3.music/MP/MPSideA/Views/Home(音乐资源列表-播放器)/MPSideA_Home_FourthListCollectionViewCell.xib +++ b/relax.offline.mp3.music/MP/MPSideA/Views/Home(音乐资源列表-播放器)/MPSideA_Home_FourthListCollectionViewCell.xib @@ -10,7 +10,7 @@ - + @@ -37,30 +37,9 @@ - - diff --git a/relax.offline.mp3.music/MP/MPSideA/Views/Home(音乐资源列表-播放器)/MPSideA_Home_SecondListCollectionViewCell.swift b/relax.offline.mp3.music/MP/MPSideA/Views/Home(音乐资源列表-播放器)/MPSideA_Home_SecondListCollectionViewCell.swift index 10aa0a2..eed1c57 100644 --- a/relax.offline.mp3.music/MP/MPSideA/Views/Home(音乐资源列表-播放器)/MPSideA_Home_SecondListCollectionViewCell.swift +++ b/relax.offline.mp3.music/MP/MPSideA/Views/Home(音乐资源列表-播放器)/MPSideA_Home_SecondListCollectionViewCell.swift @@ -11,7 +11,11 @@ class MPSideA_Home_SecondListCollectionViewCell: UICollectionViewCell { @IBOutlet weak var coverImageView: UIImageView! @IBOutlet weak var titleLabel: UILabel! @IBOutlet weak var subtitleLabel: UILabel! - @IBOutlet weak var shieldView: UIView! + @IBOutlet weak var maskAnimationView: MP_WaveAnimationMaskView!{ + didSet{ + maskAnimationView.configure() + } + } var musicView:MPSideA_MusicViewModel!{ didSet{ coverImageView.image = musicView.cover @@ -22,13 +26,15 @@ class MPSideA_Home_SecondListCollectionViewCell: UICollectionViewCell { //展示未播放状态 titleLabel.textColor = .init(hex: "#FFFFFF") subtitleLabel.textColor = .init(hex: "#FFFFFF") - shieldView.isHidden = true + maskAnimationView.isHidden = true + maskAnimationView.stopAnimation() return } //展示播放状态 titleLabel.textColor = .init(hex: "#80F988") subtitleLabel.textColor = .init(hex: "#80F988") - shieldView.isHidden = false + maskAnimationView.isHidden = false + maskAnimationView.startAnimation() } } override func awakeFromNib() { diff --git a/relax.offline.mp3.music/MP/MPSideA/Views/Home(音乐资源列表-播放器)/MPSideA_Home_SecondListCollectionViewCell.xib b/relax.offline.mp3.music/MP/MPSideA/Views/Home(音乐资源列表-播放器)/MPSideA_Home_SecondListCollectionViewCell.xib index 17aaf80..36da860 100644 --- a/relax.offline.mp3.music/MP/MPSideA/Views/Home(音乐资源列表-播放器)/MPSideA_Home_SecondListCollectionViewCell.xib +++ b/relax.offline.mp3.music/MP/MPSideA/Views/Home(音乐资源列表-播放器)/MPSideA_Home_SecondListCollectionViewCell.xib @@ -10,7 +10,7 @@ - + @@ -25,30 +25,9 @@ - - + @@ -114,6 +93,5 @@ -