From 716180557b158129e2807debad80470c1c93938c Mon Sep 17 00:00:00 2001 From: "Mr.zhou" <1422157428@qq.com> Date: Thu, 6 Jun 2024 18:43:34 +0800 Subject: [PATCH] =?UTF-8?q?b=E9=9D=A21.0.4=E4=B8=8A=E6=9E=B6=E7=89=88?= =?UTF-8?q?=E6=9C=AC=EF=BC=88bug=E4=BF=AE=E5=A4=8D=EF=BC=8C=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E5=8A=9F=E8=83=BD=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../project.pbxproj | 10 +- relax.offline.mp3.music/AppDelegate.swift | 12 +- .../NoNetReache'log.imageset/Contents.json | 22 +++ ...i_4e2abf4f-00e4-4e5f-9ed0-066d53fd191g.png | Bin 0 -> 3515 bytes ...i_7d70335a-d60e-4199-bafe-d683a83952fg.png | Bin 0 -> 5317 bytes .../Controllers/MP_BaseViewController.swift | 68 ++++++- .../Controllers/MP_LunchViewController.swift | 125 +++++++------ .../Common/Macro(宏定义与全局量)/Macro.swift | 28 ++- .../Tool(工具封装)/MPPositive_Debouncer.swift | 2 +- .../MP_CircularProgressView.swift | 84 --------- .../MP/Common/Tool(工具封装)/MP_HUD.swift | 9 +- .../Tool(工具封装)/MP_NetWorkManager.swift | 167 ++++++++++++------ .../Tool(工具封装)/MP_PlayerManager.swift | 117 ++++++++---- .../MPPositive_BrowseLoadViewModel.swift | 9 +- .../MPPositive_PlayerLoadViewModel.swift | 26 +-- .../MPPositive_BaseViewController.swift | 4 +- .../MPPositive_MoreSongOperationsViewController.swift | 4 +- .../MPPositive_TabBarController.swift | 12 +- .../MPPositive_LoveSongsViewController.swift | 9 +- .../MPPositive_OfflineSongsViewController.swift | 4 +- .../MPPositive_ArtistShowViewController.swift | 8 +- .../MPPositive_HomeViewController.swift | 9 +- .../MPPositive_ListShowViewController.swift | 20 ++- .../MPPositive_MoreContentViewController.swift | 11 +- .../MPPositive_PlayerViewController.swift | 48 ++++- .../MPPositive_RecommendViewController.swift | 3 + ...MPPositive_SearchResultShowViewController.swift | 8 +- .../MPPositive_ArtistShowHeaderView.swift | 1 + ...Positive_ArtistShowSongTableViewCell.swift | 4 + ...PPositive_MusicItemShowTableViewCell.swift | 4 + .../Player/MPPositive_PlayerCoverView.swift | 26 ++- ...Positive_PlayerListShowTableViewCell.swift | 2 +- .../Player/MPPositive_PlayerSilder.swift | 2 +- ...sitive_SearchResultShowTableViewCell.swift | 4 + 34 files changed, 518 insertions(+), 344 deletions(-) create mode 100644 relax.offline.mp3.music/Assets.xcassets/Positive/Player/NoNetReache'log.imageset/Contents.json create mode 100644 relax.offline.mp3.music/Assets.xcassets/Positive/Player/NoNetReache'log.imageset/img_v3_02bi_4e2abf4f-00e4-4e5f-9ed0-066d53fd191g.png create mode 100644 relax.offline.mp3.music/Assets.xcassets/Positive/Player/NoNetReache'log.imageset/img_v3_02bi_7d70335a-d60e-4199-bafe-d683a83952fg.png delete mode 100644 relax.offline.mp3.music/MP/Common/Tool(工具封装)/MP_CircularProgressView.swift diff --git a/relax.offline.mp3.music.xcodeproj/project.pbxproj b/relax.offline.mp3.music.xcodeproj/project.pbxproj index 25a9297..c9ae9ce 100644 --- a/relax.offline.mp3.music.xcodeproj/project.pbxproj +++ b/relax.offline.mp3.music.xcodeproj/project.pbxproj @@ -45,7 +45,6 @@ CBAFCB082C0A10500054500E /* MP_AnalyticsManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBAFCA1F2C0A10500054500E /* MP_AnalyticsManager.swift */; }; CBAFCB092C0A10500054500E /* MP_AVURLAsset.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBAFCA202C0A10500054500E /* MP_AVURLAsset.swift */; }; CBAFCB0A2C0A10500054500E /* MP_CacheManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBAFCA212C0A10500054500E /* MP_CacheManager.swift */; }; - CBAFCB0B2C0A10500054500E /* MP_CircularProgressView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBAFCA222C0A10500054500E /* MP_CircularProgressView.swift */; }; CBAFCB0C2C0A10500054500E /* MP_CoreDataHandlerManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBAFCA232C0A10500054500E /* MP_CoreDataHandlerManager.swift */; }; CBAFCB0D2C0A10500054500E /* MP_DownloadManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBAFCA242C0A10500054500E /* MP_DownloadManager.swift */; }; CBAFCB0E2C0A10500054500E /* MP_HUD.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBAFCA252C0A10500054500E /* MP_HUD.swift */; }; @@ -254,7 +253,6 @@ CBAFCA1F2C0A10500054500E /* MP_AnalyticsManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MP_AnalyticsManager.swift; sourceTree = ""; }; CBAFCA202C0A10500054500E /* MP_AVURLAsset.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MP_AVURLAsset.swift; sourceTree = ""; }; CBAFCA212C0A10500054500E /* MP_CacheManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MP_CacheManager.swift; sourceTree = ""; }; - CBAFCA222C0A10500054500E /* MP_CircularProgressView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MP_CircularProgressView.swift; sourceTree = ""; }; CBAFCA232C0A10500054500E /* MP_CoreDataHandlerManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MP_CoreDataHandlerManager.swift; sourceTree = ""; }; CBAFCA242C0A10500054500E /* MP_DownloadManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MP_DownloadManager.swift; sourceTree = ""; }; CBAFCA252C0A10500054500E /* MP_HUD.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MP_HUD.swift; sourceTree = ""; }; @@ -581,7 +579,6 @@ CBAFCA1F2C0A10500054500E /* MP_AnalyticsManager.swift */, CBAFCA202C0A10500054500E /* MP_AVURLAsset.swift */, CBAFCA212C0A10500054500E /* MP_CacheManager.swift */, - CBAFCA222C0A10500054500E /* MP_CircularProgressView.swift */, CBAFCA232C0A10500054500E /* MP_CoreDataHandlerManager.swift */, CBAFCA242C0A10500054500E /* MP_DownloadManager.swift */, CBAFCA252C0A10500054500E /* MP_HUD.swift */, @@ -1347,7 +1344,6 @@ CBAFCB912C0A10500054500E /* MPSideA_HomeViewController.swift in Sources */, CBAFCAEA2C0A10500054500E /* MP_Lunch_ProgressView.swift in Sources */, CBAFCB732C0A10500054500E /* MPPositive_SearchSuggestionItemTableViewCell.swift in Sources */, - CBAFCB0B2C0A10500054500E /* MP_CircularProgressView.swift in Sources */, CBAFCB432C0A10500054500E /* MPPositive_NavigationController.swift in Sources */, CBAFCB302C0A10500054500E /* MPPositive_BrowseModuleListViewModel.swift in Sources */, CBAFCBA62C0A10500054500E /* MPSideA_Home_SecondListCollectionViewCell.swift in Sources */, @@ -1470,7 +1466,7 @@ CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; ENABLE_USER_SCRIPT_SANDBOXING = NO; @@ -1565,7 +1561,7 @@ CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1.0.4.1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = 8DQD6BV6H9; + DEVELOPMENT_TEAM = T93S37G27F; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = relax.offline.mp3.music/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = Musiclax; @@ -1606,7 +1602,7 @@ CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1.0.4.1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = 8DQD6BV6H9; + DEVELOPMENT_TEAM = T93S37G27F; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = relax.offline.mp3.music/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = Musiclax; diff --git a/relax.offline.mp3.music/AppDelegate.swift b/relax.offline.mp3.music/AppDelegate.swift index 629cba1..9b035bd 100644 --- a/relax.offline.mp3.music/AppDelegate.swift +++ b/relax.offline.mp3.music/AppDelegate.swift @@ -18,14 +18,6 @@ class AppDelegate: UIResponder, UIApplicationDelegate { // 用来保存由系统提供的完成处理器 var backgroundSessionCompletionHandler: (() -> Void)? func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { - //请求通知权限 - UNUserNotificationCenter.current() - .requestAuthorization(options: [.alert, .sound, .badge]) { - (accepted, error) in - if !accepted { - print("Users are not allowed to be notified of messages.") - } - } //生成一个FireBase实例 FirebaseApp.configure() //启动前销毁所有的下载任务 @@ -39,8 +31,6 @@ class AppDelegate: UIResponder, UIApplicationDelegate { switch_lunch() //执行用户启动事件日志 MP_AnalyticsManager.shared.user_launchAction() -// let numbers = [0] -// let _ = numbers[1] return true } func application(_ application: UIApplication, handleEventsForBackgroundURLSession identifier: String, completionHandler: @escaping () -> Void) { @@ -56,7 +46,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { let session = AVAudioSession.sharedInstance() do { //允许后台活跃,播放以及记录 - try session.setCategory(.playAndRecord, mode: .default) + try session.setCategory(.playAndRecord, mode: .default, options: [.allowAirPlay, .defaultToSpeaker]) //激活会话 try session.setActive(true) try session.overrideOutputAudioPort(.speaker) diff --git a/relax.offline.mp3.music/Assets.xcassets/Positive/Player/NoNetReache'log.imageset/Contents.json b/relax.offline.mp3.music/Assets.xcassets/Positive/Player/NoNetReache'log.imageset/Contents.json new file mode 100644 index 0000000..a05c967 --- /dev/null +++ b/relax.offline.mp3.music/Assets.xcassets/Positive/Player/NoNetReache'log.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "img_v3_02bi_4e2abf4f-00e4-4e5f-9ed0-066d53fd191g.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "img_v3_02bi_7d70335a-d60e-4199-bafe-d683a83952fg.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/relax.offline.mp3.music/Assets.xcassets/Positive/Player/NoNetReache'log.imageset/img_v3_02bi_4e2abf4f-00e4-4e5f-9ed0-066d53fd191g.png b/relax.offline.mp3.music/Assets.xcassets/Positive/Player/NoNetReache'log.imageset/img_v3_02bi_4e2abf4f-00e4-4e5f-9ed0-066d53fd191g.png new file mode 100644 index 0000000000000000000000000000000000000000..19aab13a3d1b67d53c863f2ac46719f9e8ff08c6 GIT binary patch literal 3515 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 literal 0 HcmV?d00001 diff --git a/relax.offline.mp3.music/Assets.xcassets/Positive/Player/NoNetReache'log.imageset/img_v3_02bi_7d70335a-d60e-4199-bafe-d683a83952fg.png b/relax.offline.mp3.music/Assets.xcassets/Positive/Player/NoNetReache'log.imageset/img_v3_02bi_7d70335a-d60e-4199-bafe-d683a83952fg.png new file mode 100644 index 0000000000000000000000000000000000000000..cc2085eb1f679ceeac2195da4733e537befbdae2 GIT binary patch literal 5317 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 Xbnre(z;Reh00000NkvXXu0mjfIjrh7 literal 0 HcmV?d00001 diff --git a/relax.offline.mp3.music/MP/Common/Base(公用基类)/Controllers/MP_BaseViewController.swift b/relax.offline.mp3.music/MP/Common/Base(公用基类)/Controllers/MP_BaseViewController.swift index 9f6c5ee..04e2065 100644 --- a/relax.offline.mp3.music/MP/Common/Base(公用基类)/Controllers/MP_BaseViewController.swift +++ b/relax.offline.mp3.music/MP/Common/Base(公用基类)/Controllers/MP_BaseViewController.swift @@ -6,7 +6,6 @@ // import UIKit - class MP_BaseViewController: UIViewController { override func viewDidLoad() { @@ -17,6 +16,73 @@ class MP_BaseViewController: UIViewController { tabBarController?.tabBar.isTranslucent = true //隐藏导航栏 navigationController?.setNavigationBarHidden(true, animated: false) +// MP_NetWorkManager.shared.requestStatusToYouTube() + // 注册应用从后台唤醒到前台的通知 +// NotificationCenter.default.addObserver(self, selector: #selector(appWillEnterForegroundAction), name:UIApplication.willEnterForegroundNotification, object: nil) + } + //前台通知 + @objc private func appWillEnterForegroundAction() { + //检测当前状态是否拥有网络权限 + guard MP_NetWorkManager.shared.netWorkStatu != .reachable else { + //当前网络正常状态 + return + } + //当前网络不可用,检查是否手动触发过 + guard UserDefaults.standard.bool(forKey: "isNetWorkUsage") != true else { + return + } + //保存手动触发状态 + UserDefaults.standard.set(true, forKey: "isNetWorkUsage") + + } + +// private func triggerLocalNetworkPrivacyAlert() { +// let sock4 = socket(AF_INET, SOCK_DGRAM, 0) +// guard sock4 >= 0 else { return } +// defer { close(sock4) } +// let sock6 = socket(AF_INET6, SOCK_DGRAM, 0) +// guard sock6 >= 0 else { return } +// defer { close(sock6) } +// +// let addresses = addressesOfDiscardServiceOnBroadcastCapableInterfaces() +// var message = [UInt8]("!".utf8) +// for address in addresses { +// address.withUnsafeBytes { buf in +// let sa = buf.baseAddress!.assumingMemoryBound(to: sockaddr.self) +// let saLen = socklen_t(buf.count) +// let sock = sa.pointee.sa_family == AF_INET ? sock4 : sock6 +// _ = sendto(sock, &message, message.count, MSG_DONTWAIT, sa, saLen) +// } +// } +// } +// private func addressesOfDiscardServiceOnBroadcastCapableInterfaces() -> [Data] { +// var addrList: UnsafeMutablePointer? = nil +// let err = getifaddrs(&addrList) +// guard err == 0, let start = addrList else { return [] } +// defer { freeifaddrs(start) } +// return sequence(first: start, next: { $0.pointee.ifa_next }) +// .compactMap { i -> Data? in +// guard(i.pointee.ifa_flags & UInt32(bitPattern: IFF_BROADCAST)) != 0, +// let sa = i.pointee.ifa_addr +// else { return nil } +// var result = Data(UnsafeRawBufferPointer(start: sa, count: Int(sa.pointee.sa_len))) +// switch CInt(sa.pointee.sa_family) { +// case AF_INET: +// result.withUnsafeMutableBytes { buf in +// let sin = buf.baseAddress!.assumingMemoryBound(to: sockaddr_in.self) +// sin.pointee.sin_port = UInt16(9).bigEndian +// } +// case AF_INET6: +// result.withUnsafeMutableBytes { buf in +// let sin6 = buf.baseAddress!.assumingMemoryBound(to: sockaddr_in6.self) +// sin6.pointee.sin6_port = UInt16(9).bigEndian +// } +// default: +// return nil +// } +// return result +// } +// } } 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 f2f620c..eeb8e02 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 @@ -26,68 +26,9 @@ class MP_LunchViewController: UIViewController { view.backgroundColor = .init(hex: "#000000") timer = CADisplayLink(target: self, selector: #selector(timerActionClick(_ :))) //一秒执行多少次 - timer.preferredFramesPerSecond = 20 + timer.preferredFramesPerSecond = 40 //开辟线程 timer.add(to: RunLoop.current, forMode: .common) - DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { - [weak self] in - guard let self = self else {return} - requestTrackingAuthorization { idfa in - if let idfa = idfa { - print("用户同意授权-idfa:\(idfa)") - } - } - } - MP_AnalyticsManager.shared.getOpenStatus { [weak self] open in - guard let self = self else {return} - if open { - //根据ip值确定进入那个页面 - MP_NetWorkManager.shared.requestIPInfo { statu in - if statu == true { - //允许进入b面 - print("BLog") - self.completionBlock = { - DispatchQueue.main.async { - [weak self] in - guard let self = self else {return} - //停止计时器 - timer.isPaused = true - //加载完毕,判断并跳转 - accessAppdelegate.switch_positive() - //获取首页 - MPPositive_BrowseLoadViewModel.shared.reloadBrowseLists() - } - } - }else { - print("ALog") - //打开A面 - self.completionBlock = { - DispatchQueue.main.async { - [weak self] in - guard let self = self else {return} - //停止计时器 - timer.isPaused = true - //加载完毕,判断并跳转 - accessAppdelegate.switch_aSide() - } - } - } - } - }else { - print("ALog") - //打开A面 - completionBlock = { - DispatchQueue.main.async { - [weak self] in - guard let self = self else {return} - //停止计时器 - timer.isPaused = true - //加载完毕,判断并跳转 - accessAppdelegate.switch_aSide() - } - } - } - } //启动计时器 timer.isPaused = false // self.completionBlock = { @@ -109,6 +50,21 @@ class MP_LunchViewController: UIViewController { timer = nil NotificationCenter.default.removeObserver(self) } + override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + DispatchQueue.main.asyncAfter(deadline: .now() + 2) { + // 请求跟踪授权 + requestTrackingAuthorization { idfa in +// if let idfa = idfa { +// print("IDFA: \(idfa)") +// StartManager.shared.idfaid = idfa +// print("Stored IDFA: \(StartManager.shared.idfaid ?? "N/A")") +// } else { +// print("IDFA is not available or tracking authorization denied.") +// } + } + } + } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) MP_AnalyticsManager.shared.launch_pvAction() @@ -118,7 +74,7 @@ class MP_LunchViewController: UIViewController { @objc fileprivate func timerActionClick(_ link:CADisplayLink) { if maxTimes > currentTimes { //未加载完 - currentTimes += 0.05 + currentTimes += 0.025 let value = currentTimes/maxTimes DispatchQueue.main.async { [weak self] in @@ -127,8 +83,51 @@ class MP_LunchViewController: UIViewController { progressView.setProgress(value) } }else { - if completionBlock != nil { - completionBlock!() + //停止计时器 + timer.isPaused = true + MP_AnalyticsManager.shared.getOpenStatus { [weak self] open in + guard let self = self else {return} + if open { + //根据ip值确定进入那个页面 + MP_NetWorkManager.shared.requestIPInfo { statu in + if statu == true { + //允许进入b面 + print("BLog") + DispatchQueue.main.async { + [weak self] in + guard let self = self else {return} + //停止计时器 + timer.isPaused = true + //加载完毕,判断并跳转 + accessAppdelegate.switch_positive() + //获取首页 + MPPositive_BrowseLoadViewModel.shared.reloadBrowseLists() + } + }else { + print("ALog") + //打开A面 + DispatchQueue.main.async { + [weak self] in + guard let self = self else {return} + //停止计时器 + timer.isPaused = true + //加载完毕,判断并跳转 + accessAppdelegate.switch_aSide() + } + } + } + }else { + print("ALog") + //打开A面 + DispatchQueue.main.async { + [weak self] in + guard let self = self else {return} + //停止计时器 + timer.isPaused = true + //加载完毕,判断并跳转 + accessAppdelegate.switch_aSide() + } + } } } } diff --git a/relax.offline.mp3.music/MP/Common/Macro(宏定义与全局量)/Macro.swift b/relax.offline.mp3.music/MP/Common/Macro(宏定义与全局量)/Macro.swift index 99b4de3..45cdf60 100644 --- a/relax.offline.mp3.music/MP/Common/Macro(宏定义与全局量)/Macro.swift +++ b/relax.offline.mp3.music/MP/Common/Macro(宏定义与全局量)/Macro.swift @@ -107,14 +107,14 @@ func improveDataforResouceAndCover(_ song:MPPositive_SongItemModel, completion:@ ///转时分值 func setTimesToMinSeconds(_ time:TimeInterval) -> String { //设置分钟 - let min = Int(time / 60) - let second = Int(time.truncatingRemainder(dividingBy: 60)) + let min = Int((time.isNaN ? 0:time) / 60) + let second = Int((time.isNaN ? 0:time).truncatingRemainder(dividingBy: 60)) return "\(min < 10 ? "0\(min)":"\(min)"):\(second < 10 ? "0\(second)":"\(second)")" } ///转分值 func setTimesToMins(_ time:TimeInterval) -> String { //设置分钟 - let min = Int(time / 60) + let min = Int((time.isNaN ? 0:time) / 60) return "\(min < 10 ? "0\(min)":"\(min)")" } ///获取麦克风权限 @@ -219,3 +219,25 @@ func requestTrackingAuthorization(completion: @escaping (String?) -> Void) { } } } +///截取\n\n后续的文本 +func truncateTextAfterTwoNewlines(from text: String) -> String { + // 定义正则表达式,匹配两个连续的换行符及其之后的内容 + let pattern = "\n{2,}.*" + let regex = try! NSRegularExpression(pattern: pattern, options: [.dotMatchesLineSeparators]) + + // 使用正则表达式进行替换,删除匹配到的部分 + let truncatedText = regex.stringByReplacingMatches(in: text, options: [], range: NSRange(location: 0, length: text.utf16.count), withTemplate: "") + + return truncatedText +} +///获取通知请求权限 +func getUserNotificationCenter() { + //请求通知权限 + UNUserNotificationCenter.current() + .requestAuthorization(options: [.alert, .sound, .badge]) { + (accepted, error) in + if !accepted { + print("Users are not allowed to be notified of messages.") + } + } +} diff --git a/relax.offline.mp3.music/MP/Common/Tool(工具封装)/MPPositive_Debouncer.swift b/relax.offline.mp3.music/MP/Common/Tool(工具封装)/MPPositive_Debouncer.swift index ebb7996..f5ce49e 100644 --- a/relax.offline.mp3.music/MP/Common/Tool(工具封装)/MPPositive_Debouncer.swift +++ b/relax.offline.mp3.music/MP/Common/Tool(工具封装)/MPPositive_Debouncer.swift @@ -15,7 +15,7 @@ class MPPositive_Debouncer: NSObject { private var delay: TimeInterval private override init() { - delay = 0.2 + delay = 0.1 super.init() } deinit { diff --git a/relax.offline.mp3.music/MP/Common/Tool(工具封装)/MP_CircularProgressView.swift b/relax.offline.mp3.music/MP/Common/Tool(工具封装)/MP_CircularProgressView.swift deleted file mode 100644 index 0c58bde..0000000 --- a/relax.offline.mp3.music/MP/Common/Tool(工具封装)/MP_CircularProgressView.swift +++ /dev/null @@ -1,84 +0,0 @@ -// -// MP_CircularProgressView.swift -// MusicPlayer -// -// Created by 忆海16 on 2024/5/14. -// - -import Foundation -import UIKit - -class CircularProgressView: UIView { - - private var progressLayer = CAShapeLayer() - private var trackLayer = CAShapeLayer() - public var progress: CGFloat = 0 { - didSet { - progressLayer.strokeEnd = progress - } - } - - override init(frame: CGRect) { - super.init(frame: frame) - setupView() - } - - required init?(coder: NSCoder) { - super.init(coder: coder) - setupView() - } - -// private func setupLayers() { -// // Track layer (background circle) -// let center = CGPoint(x: bounds.width / 2, y: bounds.height / 2) -// let circularPath = UIBezierPath(arcCenter: center, radius: bounds.width / 2, startAngle: -CGFloat.pi / 2, endAngle: 3 * CGFloat.pi / 2, clockwise: true) -// -// trackLayer.path = circularPath.cgPath -// trackLayer.strokeColor = UIColor.lightGray.cgColor -// trackLayer.lineWidth = 3 -// trackLayer.fillColor = UIColor.clear.cgColor -// layer.addSublayer(trackLayer) -// -// // Progress layer (foreground circle) -// progressLayer.path = circularPath.cgPath -// progressLayer.strokeColor = UIColor.green.cgColor -// progressLayer.lineWidth = 3 -// progressLayer.fillColor = UIColor.clear.cgColor -// progressLayer.lineCap = .round -// progressLayer.strokeEnd = 0 -// layer.addSublayer(progressLayer) -// } -// -// func setProgress(to progress: CGFloat) { -// self.progress = progress -// } - private func setupView() { - // 设置轨道图层 - trackLayer.path = createCircularPath().cgPath - trackLayer.fillColor = UIColor.clear.cgColor - trackLayer.strokeColor = UIColor.lightGray.cgColor - trackLayer.lineWidth = 3 - trackLayer.strokeEnd = 1.0 - layer.addSublayer(trackLayer) - - // 设置进度图层 - progressLayer.path = createCircularPath().cgPath - progressLayer.fillColor = UIColor.clear.cgColor - progressLayer.strokeColor = UIColor.green.cgColor - progressLayer.lineWidth = 3 - progressLayer.strokeEnd = 0.0 - layer.addSublayer(progressLayer) - } - - private func createCircularPath() -> UIBezierPath { - return UIBezierPath(arcCenter: center, radius: bounds.size.width / 2, startAngle: -.pi / 2, endAngle: .pi * 3 / 2, clockwise: true) - } - - func setProgress(to progress: CGFloat) { - self.progress = progress - print("Updating progress to: \(progress)") - DispatchQueue.main.async { - self.progressLayer.strokeEnd = progress - } - } -} diff --git a/relax.offline.mp3.music/MP/Common/Tool(工具封装)/MP_HUD.swift b/relax.offline.mp3.music/MP/Common/Tool(工具封装)/MP_HUD.swift index 755ac6f..8db851e 100644 --- a/relax.offline.mp3.music/MP/Common/Tool(工具封装)/MP_HUD.swift +++ b/relax.offline.mp3.music/MP/Common/Tool(工具封装)/MP_HUD.swift @@ -65,19 +65,20 @@ class MP_HUD: NSObject { static func showWithStatus(hudStatus status: status, text: String?, delay: TimeInterval ,completion:(() -> Void)?) { SVProgressHUD.setDefaultStyle(.light) SVProgressHUD.setDefaultMaskType(.clear) - SVProgressHUD.setBackgroundColor(.init(hex: "#80F988", alpha: 0.1)) - SVProgressHUD.setForegroundColor(.init(hex: "#80F988")) + SVProgressHUD.setBackgroundColor(.init(hex: "#151718", alpha: 0.4)) + SVProgressHUD.setForegroundColor(.white) SVProgressHUD.setOffsetFromCenter(.init(horizontal: 0, vertical: 0)) switch status { case .success: SVProgressHUD.showSuccess(withStatus: text) SVProgressHUD.setMinimumSize(CGSize(width: 100 * width, height: 80 * width)) + SVProgressHUD.show(UIImage(), status: text) case .error: SVProgressHUD.showError(withStatus: text) case .onlyText: - SVProgressHUD.setOffsetFromCenter(.init(horizontal: 0, vertical: (screen_Height / 2) - 85 * width)) +// SVProgressHUD.setOffsetFromCenter(.init(horizontal: 0, vertical: (screen_Height / 2) - 85 * width)) SVProgressHUD.setMinimumSize(CGSize(width: 100 * width, height: 40 * width)) - SVProgressHUD.show(UIImage(), status: text) + SVProgressHUD.show(UIImage(named: "NoNetReache'log")!, status: text) case .loading: SVProgressHUD.setBackgroundColor(.white) SVProgressHUD.show() 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 7afc2fe..4b2b117 100644 --- a/relax.offline.mp3.music/MP/Common/Tool(工具封装)/MP_NetWorkManager.swift +++ b/relax.offline.mp3.music/MP/Common/Tool(工具封装)/MP_NetWorkManager.swift @@ -63,16 +63,16 @@ class MP_NetWorkManager: NSObject { private let youTubeKeys:[String] = ["MUSIC_VIDEO_TYPE_ATV","MUSIC_VIDEO_TYPE_OMV","MUSIC_PAGE_TYPE_ALBUM","MUSIC_PAGE_TYPE_ARTIST","MUSIC_PAGE_TYPE_PLAYLIST","MUSIC_PAGE_TYPE_TRACK_LYRICS","MUSIC_PAGE_TYPE_TRACK_RELATED"] ///禁止接入IP信息组 private let banIPs:[String] = [ -// "CN", -// "HK", -// "TW", -// "JP", -// "KR", -// "GB", -// "CH", -// "BE", -// "MO", -// "SG" + "CN", + "HK", + "TW", + "JP", + "KR", + "GB", + "CH", + "BE", + "MO", + "SG" ] //网络状态 enum NetWorkStatus: String { @@ -82,22 +82,33 @@ class MP_NetWorkManager: NSObject { } ///网络监听器 private let reachabilityManager:NetworkReachabilityManager = NetworkReachabilityManager(host: "https://music.youtube.com/")! + ///网络监听器 + private var monitor:NWPathMonitor + ///对监听器的判断 + private var isReach:Bool = false ///当前网络状态 var netWorkStatu:NetWorkStatus!{ willSet{ - //旧值为网络可用,新值为网络不可用,为断网第一时间,发出通知告知播放器 - if netWorkStatu == .reachable, newValue == .notReachable { - print("网络不可用") - NotificationCenter.notificationKey.post(notificationName: .net_switch_notReachable) + guard newValue != netWorkStatu else { + //重复情况 + return } - //旧值为网络不可用,新值为网络可用,为网络回复第一时间,发出通知告知播放器 - if (netWorkStatu == .notReachable), newValue == .reachable { + switch newValue { + case .reachable://网络可用 print("网络可用") NotificationCenter.notificationKey.post(notificationName: .net_switch_reachable) + case .notReachable://不可用 + print("网络不可用") + NotificationCenter.notificationKey.post(notificationName: .net_switch_notReachable) + case .unknown://位置情况 + print("网络状况未知") + case .none: + break } } } - + //避免连续切换网络状态计时器 + private var debounceTimer: Timer? //MARK: - 固定参数 //访问数据(首次首页预览时获得) private var visitorData:String? @@ -154,63 +165,97 @@ class MP_NetWorkManager: NSObject { var browseRequestStateBlock:BrowseRequestStateBlock? //私有初始化 private override init() { + self.monitor = NWPathMonitor() super.init() + } //MARK: - 网络情况 ///检查网络状况 func requestNetworkPermission(oberve:UIViewController, completeHanlder:ActionBlock?) { let monitor = NWPathMonitor() - monitor.pathUpdateHandler = { path in - switch path.status { - case .satisfied: - DispatchQueue.main.async { - guard completeHanlder != nil else { - return - } - completeHanlder!() + switch netWorkStatu { + case .reachable: + DispatchQueue.main.async { + guard completeHanlder != nil else { + return } - default://网络权限出现问题 - DispatchQueue.main.async { - //次要处理 - let alertController = UIAlertController(title: "Access network request", message: "”Musiclax“ needs to be loaded via a network request. Please click “Settings” to allow this application to gain access to the network.", preferredStyle: .alert) - let CancelAction = UIAlertAction(title:"Cancel", style: .cancel) { (Cancel) in + completeHanlder!() + } + default: + DispatchQueue.main.async { + //次要处理 + let alertController = UIAlertController(title: "Access network request", message: "”Musiclax“ needs to be loaded via a network request. Please click “Settings” to allow this application to gain access to the network.", preferredStyle: .alert) + let CancelAction = UIAlertAction(title:"Cancel", style: .cancel) { (Cancel) in - } - let OKAction = UIAlertAction(title: "Settings", style: .default) { (action) in - let url = URL(string: UIApplication.openSettingsURLString) - if let url = url,UIApplication.shared.canOpenURL(url){ - if #available(iOS 10, *) { - UIApplication.shared.open(url, options: [:]) { (success) in - } - }else{ - UIApplication.shared.canOpenURL(url) + } + let OKAction = UIAlertAction(title: "Settings", style: .default) { (action) in + let url = URL(string: UIApplication.openSettingsURLString) + if let url = url,UIApplication.shared.canOpenURL(url){ + if #available(iOS 10, *) { + UIApplication.shared.open(url, options: [:]) { (success) in } + }else{ + UIApplication.shared.canOpenURL(url) } } - alertController.addAction(CancelAction) - alertController.addAction(OKAction) - oberve.present(alertController, animated: true, completion: nil) } + alertController.addAction(CancelAction) + alertController.addAction(OKAction) + oberve.present(alertController, animated: true, completion: nil) } } - let queue = DispatchQueue(label: "MPNetWorkManager") - monitor.start(queue: queue) } ///网络请求检测 func requestStatusToYouTube() { - //通过ping节点确认是否能执行网络请求 - reachabilityManager.startListening(onQueue: .main, onUpdatePerforming: { [weak self] status in - guard let self = self else {return} - switch status { - case .unknown://未知状况 - netWorkStatu = .unknown - case .notReachable://网络不可用 - netWorkStatu = .notReachable - case .reachable(.ethernetOrWiFi), .reachable(.cellular)://网络可用,且做出了分类 - netWorkStatu = .reachable + guard isReach == false else { + return + } + isReach = true +// //通过ping节点确认是否能执行网络请求 +// reachabilityManager.startListening(onQueue: .main, onUpdatePerforming: { [weak self] status in +// guard let self = self else {return} +// var newStatu:NetWorkStatus = .unknown +// switch status { +// case .unknown://未知状况 +// newStatu = .unknown +// case .notReachable://网络不可用 +// newStatu = .notReachable +// case .reachable(.ethernetOrWiFi), .reachable(.cellular)://网络可用,且做出了分类 +// newStatu = .reachable +// } +// // 去抖处理,确保状态变化稳定后再更新 +// self.handleDebouncedNetworkStatusChange(newStatu) +// }) + let queue = DispatchQueue(label: "MPNetWorkManager") + monitor.start(queue: queue) + monitor.pathUpdateHandler = { [weak self] path in + self?.updateNetworkStatus(path) + } + } + private func updateNetworkStatus(_ path: NWPath) { + if path.status == .satisfied { + netWorkStatu = .reachable + } else { + netWorkStatu = .notReachable + } + } + + func stopListening() { + reachabilityManager.stopListening() + isReach = false + } + private func handleDebouncedNetworkStatusChange(_ newStatus: NetWorkStatus) { + // 取消之前的去抖操作 + debounceTimer?.invalidate() + // 设置新的去抖操作 + debounceTimer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: false) { [weak self] _ in + guard let self = self else { return } + // 更新状态时只在去抖时间窗口后处理变化 + if newStatus != self.netWorkStatu { + self.netWorkStatu = newStatus } - }) + } } } //MARK: - API请求 @@ -1238,7 +1283,8 @@ extension MP_NetWorkManager { model.subscriptions = header.musicImmersiveHeaderRenderer?.subscriptionButton?.subscribeButtonRenderer?.subscriberCountText?.runs?.reduce("", { $0 + ($1.text ?? "")}) model.subscriptionedText = header.musicImmersiveHeaderRenderer?.subscriptionButton?.subscribeButtonRenderer?.subscribedButtonText?.runs?.reduce("", { $0 + ($1.text ?? "")}) model.fordescription = header.musicImmersiveHeaderRenderer?.description?.runs?.reduce("", { $0 + ($1.text ?? "")}) - model.thumbnails = header.musicImmersiveHeaderRenderer?.thumbnail?.musicThumbnailRenderer?.thumbnail?.thumbnails?.compactMap({$0.url}) + model.fordescription = truncateTextAfterTwoNewlines(from: model.fordescription ?? "") + model.thumbnails = header.musicImmersiveHeaderRenderer?.thumbnail?.musicThumbnailRenderer?.thumbnail?.thumbnails?.compactMap({$0.url}) return model } ///解析艺术家_Contents @@ -1413,7 +1459,14 @@ extension MP_NetWorkManager { var videos:[String] = [] var itags:[Int] = [] var mimeType:[String] = [] - let allFormats = (streamingData.formats ?? []) + (streamingData.adaptiveFormats ?? []) + var allFormats = (streamingData.formats ?? []) + (streamingData.adaptiveFormats ?? []) +// //以itag进行排序(从大到小) +// allFormats = allFormats.sorted(by: {($0.itag ?? 0) > ($1.itag ?? 0)}) + //取第一个mimeType包含(video/mp4)的资源 +// if let index = allFormats.firstIndex(where: {$0.itag == 22}) { +// let element = allFormats.remove(at: index) +// allFormats.insert(element, at: 0) +// } for format in allFormats { videos.append(format.url ?? "") itags.append(format.itag ?? 0) 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 bb4a882..3983f5c 100644 --- a/relax.offline.mp3.music/MP/Common/Tool(工具封装)/MP_PlayerManager.swift +++ b/relax.offline.mp3.music/MP/Common/Tool(工具封装)/MP_PlayerManager.swift @@ -92,6 +92,7 @@ class MP_PlayerManager:NSObject{ center?.pauseCommand.removeTarget(self) center?.nextTrackCommand.removeTarget(self) center?.previousTrackCommand.removeTarget(self) + center?.changePlaybackPositionCommand.removeTarget(self) center = nil do { try AVAudioSession.sharedInstance().setActive(false) @@ -102,6 +103,8 @@ class MP_PlayerManager:NSObject{ } } } + //当前音乐的字典 + private var currentInfo:[String:Any]? //当前播放器状态 private var playState:MP_PlayerStateType = .Null{ didSet{ @@ -168,7 +171,8 @@ class MP_PlayerManager:NSObject{ //转化为当前播放进度秒值 let currentDuration = CMTimeGetSeconds(time) //更新控制中心的进度条 - updateProgress(currentDuration) +// updateProgress(currentDuration) + updateNowPlayingInfo() //获取当前播放音乐资源的最大时间值 let maxDuration = getMusicDuration() if maxDuration.isNaN == false { @@ -282,25 +286,21 @@ class MP_PlayerManager:NSObject{ if playState != .Playing { //当statuVlaue值等于playerItem准备播放的值,说明已经准备好播放 print("当前音乐-\(loadPlayer?.currentVideo?.title ?? "") 已经准备好播放") -// if playState != .Playing { -// player.play() -// playState = .Playing -// //暂停计时器,并获取延时值 -// suspendTimer() -// let times = Int(self.times) -// let msTimes = times*1000 -// MP_AnalyticsManager.shared.player_b_delay_actionAction(loadPlayer.currentVideo?.song.videoId ?? "", videoname: loadPlayer.currentVideo?.title ?? "", artistname: loadPlayer.currentVideo?.song.shortBylineText ?? "", delay: "\(msTimes)ms") -// MP_AnalyticsManager.shared.player_b_success_actionAction(loadPlayer.currentVideo?.song.videoId ?? "", videoname: loadPlayer.currentVideo?.title ?? "", artistname: loadPlayer.currentVideo?.song.shortBylineText ?? "") -// //执行开始播放闭包 -// if startActionBlock != nil { -// startActionBlock!() -// } -// } } }else { print("当前音乐-\(loadPlayer.currentVideo?.title ?? "") 未做好准备播放,失败原因是\(loadPlayer.currentVideo?.resourcePlayerItem.error?.localizedDescription ?? "")") - //重新 - play() + if loadPlayer?.currentVideo?.isKVO == true { + //切歌时移除KVO监听 + loadPlayer?.currentVideo?.resourcePlayerItem.removeObserver(self, forKeyPath: "status") + loadPlayer?.currentVideo?.resourcePlayerItem.removeObserver(self, forKeyPath: "loadedTimeRanges") + loadPlayer?.currentVideo?.resourcePlayerItem.removeObserver(self, forKeyPath: "playbackLikelyToKeepUp") + loadPlayer?.currentVideo?.isKVO = false + //重新配置数据 + loadPlayer.remakeImproveData { + [weak self] in + self?.play() + } + } } case "loadedTimeRanges"://当前缓冲进度 cacheLoadTimes() @@ -455,6 +455,13 @@ class MP_PlayerManager:NSObject{ //判断当前音乐播放方式 switch playType { case .random://随机,播放随机列表内容 + //检索当前列表是否为只有一首 + guard (loadPlayer?.randomVideos?.count ?? 0) != 1 else { + player.seek(to: .zero) + playState = .Playing + player.play() + return + } for (index, item) in loadPlayer.randomVideos.enumerated() { if item.videoId == loadPlayer.currentVideo?.song.videoId { //找到播放音乐的索引 @@ -472,6 +479,12 @@ class MP_PlayerManager:NSObject{ loadPlayer.improveData(song.videoId ?? "", isRandom: true) } default://常规播放或者单曲播放 + guard (loadPlayer?.songVideos?.count ?? 0) != 1 else { + player.seek(to: .zero) + playState = .Playing + player.play() + return + } for (index, item) in loadPlayer.songVideos.enumerated() { if item.videoId == loadPlayer.currentVideo?.song.videoId { //找到播放音乐的索引 @@ -497,6 +510,12 @@ class MP_PlayerManager:NSObject{ var nextIndex:Int = 0 switch playType { case .random: + guard (loadPlayer?.randomVideos?.count ?? 0) != 1 else { + player.seek(to: .zero) + playState = .Playing + player.play() + return + } for (index, item) in loadPlayer.randomVideos.enumerated() { if item.videoId == loadPlayer.currentVideo?.song.videoId { //找到播放音乐的索引 @@ -514,6 +533,12 @@ class MP_PlayerManager:NSObject{ loadPlayer.improveData(song.videoId ?? "", isRandom: true) } default: + guard (loadPlayer?.songVideos?.count ?? 0) != 1 else { + player.seek(to: .zero) + playState = .Playing + player.play() + return + } for (index, item) in loadPlayer.songVideos.enumerated() { if item.videoId == loadPlayer.currentVideo?.song.videoId { //找到播放音乐的索引 @@ -632,53 +657,73 @@ class MP_PlayerManager:NSObject{ return .noActionableNowPlayingItem } } + //拖拽进度 + center?.changePlaybackPositionCommand.addTarget(handler: { [weak self] event in + guard let self = self else { return .noActionableNowPlayingItem} + + guard let positionEvent = event as? MPChangePlaybackPositionCommandEvent else { + return .commandFailed + } + if loadPlayer.currentVideo != nil { + self.player.seek(to: CMTime(seconds: positionEvent.positionTime, preferredTimescale: 1)) + return .success + }else { + return .noActionableNowPlayingItem + } + }) } //设置远程中心内容更新 func updateNowPlayingInfo() { + guard loadPlayer?.currentVideo != nil else {return} //设置info字典信息 - var info = [String:Any]() + currentInfo = [:] //展示标题 - info[MPMediaItemPropertyTitle] = loadPlayer.currentVideo?.title ?? "" + currentInfo![MPMediaItemPropertyTitle] = loadPlayer?.currentVideo?.title ?? "" //设置艺术家 - info[MPMediaItemPropertyArtist] = loadPlayer.currentVideo?.song?.shortBylineText ?? "" + currentInfo![MPMediaItemPropertyArtist] = loadPlayer?.currentVideo?.song?.shortBylineText ?? "" //设置专辑 - info[MPMediaItemPropertyAlbumTitle] = loadPlayer.currentVideo?.song?.longBylineText + currentInfo![MPMediaItemPropertyAlbumTitle] = loadPlayer?.currentVideo?.song?.longBylineText + //当前时长 + currentInfo![MPNowPlayingInfoPropertyElapsedPlaybackTime] = CMTimeGetSeconds(player.currentItem?.currentTime() ?? .zero) //设置歌曲时长 - info[MPMediaItemPropertyPlaybackDuration] = getMusicDuration() + currentInfo![MPMediaItemPropertyPlaybackDuration] = CMTimeGetSeconds(player.currentItem?.duration ?? .zero) + currentInfo![MPNowPlayingInfoPropertyPlaybackRate] = 1.0 let reviewURL = URL(string: loadPlayer.currentVideo?.song?.reviewUrls?.last ?? "")! - KingfisherManager.shared.retrieveImage(with: reviewURL) { result in + KingfisherManager.shared.retrieveImage(with: reviewURL) { [weak self]result in switch result { case .success(let imageResult): let image = imageResult.image - info[MPMediaItemPropertyArtwork] = MPMediaItemArtwork(boundsSize: image.size, requestHandler: { size in + self?.currentInfo?[MPMediaItemPropertyArtwork] = MPMediaItemArtwork(boundsSize: image.size, requestHandler: { size in return image }) // 确保更新MPNowPlayingInfoCenter的操作在主线程中 DispatchQueue.main.async { //更新远程中心 - MPNowPlayingInfoCenter.default().nowPlayingInfo = info + MPNowPlayingInfoCenter.default().nowPlayingInfo = self?.currentInfo } case .failure(_): - info[MPMediaItemPropertyArtwork] = MPMediaItemArtwork(boundsSize: placeholderImage.size, requestHandler: { size in + self?.currentInfo?[MPMediaItemPropertyArtwork] = MPMediaItemArtwork(boundsSize: placeholderImage.size, requestHandler: { size in return placeholderImage }) // 确保更新MPNowPlayingInfoCenter的操作在主线程中 DispatchQueue.main.async { //更新远程中心 - MPNowPlayingInfoCenter.default().nowPlayingInfo = info + MPNowPlayingInfoCenter.default().nowPlayingInfo = self?.currentInfo } } } } //实时更新当前控制中心的进度条信息 - private func updateProgress(_ time:TimeInterval) { - if var nowPlayingInfo = MPNowPlayingInfoCenter.default().nowPlayingInfo { - nowPlayingInfo[MPNowPlayingInfoPropertyElapsedPlaybackTime] = time - DispatchQueue.main.async { - //更新远程中心 - MPNowPlayingInfoCenter.default().nowPlayingInfo = nowPlayingInfo - } - } - } +// private func updateProgress(_ time:TimeInterval) { +// guard var currentInfo = currentInfo else { +// return +// } +// currentInfo[MPNowPlayingInfoPropertyElapsedPlaybackTime] = setTimesToMinSeconds(time) +// DispatchQueue.main.async { +// print(currentInfo) +// //更新远程中心 +// MPNowPlayingInfoCenter.default().nowPlayingInfo = currentInfo +// } +// } } diff --git a/relax.offline.mp3.music/MP/MPPositive/Models/ViewModels/LoadViewModels/MPPositive_BrowseLoadViewModel.swift b/relax.offline.mp3.music/MP/MPPositive/Models/ViewModels/LoadViewModels/MPPositive_BrowseLoadViewModel.swift index 84e3275..37d5ae0 100644 --- a/relax.offline.mp3.music/MP/MPPositive/Models/ViewModels/LoadViewModels/MPPositive_BrowseLoadViewModel.swift +++ b/relax.offline.mp3.music/MP/MPPositive/Models/ViewModels/LoadViewModels/MPPositive_BrowseLoadViewModel.swift @@ -21,9 +21,14 @@ class MPPositive_BrowseLoadViewModel: NSObject { browseModuleLists.append(contentsOf: lists) //移除为空的数据 browseModuleLists = browseModuleLists.filter{($0.items.count != 0)} - //通知首页刷新UI - NotificationCenter.notificationKey.post(notificationName: .positive_browses_reload) if isCompleted == true { + //将视频移动到最后 + if let index = browseModuleLists.firstIndex(where: {$0.items.first?.browseItem.pageType == "MUSIC_VIDEO_TYPE_OMV"}) { + let removedElement = browseModuleLists.remove(at: index) + browseModuleLists.append(removedElement) + } + //通知首页刷新UI + NotificationCenter.notificationKey.post(notificationName: .positive_browses_reload) //加载完毕后 MP_AnalyticsManager.shared.home_b_module_showsucces_actionAction() } diff --git a/relax.offline.mp3.music/MP/MPPositive/Models/ViewModels/LoadViewModels/MPPositive_PlayerLoadViewModel.swift b/relax.offline.mp3.music/MP/MPPositive/Models/ViewModels/LoadViewModels/MPPositive_PlayerLoadViewModel.swift index 23c536e..9c38c43 100644 --- a/relax.offline.mp3.music/MP/MPPositive/Models/ViewModels/LoadViewModels/MPPositive_PlayerLoadViewModel.swift +++ b/relax.offline.mp3.music/MP/MPPositive/Models/ViewModels/LoadViewModels/MPPositive_PlayerLoadViewModel.swift @@ -146,30 +146,8 @@ class MPPositive_PlayerLoadViewModel: NSObject { } ///重新获取指定歌曲资源 func remakeImproveData(_ completion:@escaping (() -> Void)) { - //当前歌曲不能播放,需要重新配置资源 - improveDataforResouceAndCover(currentVideo.song) {[weak self] resourceUrls, coverUrls in - guard let self = self else {return} - if let resourceUrls = resourceUrls { - currentVideo.song.resourceUrls = resourceUrls.0 - currentVideo.song.itags = resourceUrls.1 - currentVideo.song.mimeTypes = resourceUrls.2 - } - //成功更新资源,将重新补完的歌曲,放进listViewVideos中 - listViewVideos.forEach({ item in - if item.song.videoId == self.currentVideo.song.videoId { - item.song.resourceUrls = self.currentVideo.song.resourceUrls - item.song.itags = self.currentVideo.song.itags - item.song.mimeTypes = self.currentVideo.song.mimeTypes - } - }) -// currentVideo.resourceAsset = .init(url: .init(string: currentVideo.song.resourceUrls!.first!)!) -// currentVideo.resourcePlayerItem = .init(asset: currentVideo.resourceAsset!) -// currentVideo.resourcePlayerItem = .init(url: .init(string: (currentVideo.song.resourceUrls?.first ?? ""))!, bitrate: Int64(currentVideo.song.bitrates?.first ?? 0), title: currentVideo.title, videoId: currentVideo.song.videoId) - currentVideo.configure() - //当值变化时通知播放器页面,更新UI - NotificationCenter.notificationKey.post(notificationName: .positive_player_reload) - completion() - } + currentVideo.configure() + completion() } ///移除选中的song,并更新listViewVideos,移除相同index的值 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 0ab61e3..1606ae6 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 @@ -91,7 +91,7 @@ class MPPositive_BaseViewController: MP_BaseViewController { make.width.equalTo(211*width) make.height.equalTo(172*width) } - let label = createLabel("Failure to obtain data", font: .systemFont(ofSize: 13*width, weight: .regular), textColor: .white, textAlignment: .center) + let label = createLabel("Weak connection. Please check your network", font: .systemFont(ofSize: 13*width, weight: .regular), textColor: .white, textAlignment: .center) errorView.addSubview(label) label.snp.makeConstraints { make in make.centerX.equalToSuperview() @@ -134,7 +134,7 @@ class MPPositive_BaseViewController: MP_BaseViewController { DispatchQueue.main.async { [weak self] in guard let self = self else {return} - MP_HUD.text("Failure to obtain data", delay: 1.0){ [weak self] in + MP_HUD.text("Weak connection.", delay: 1.0){ [weak self] in //执行报错回调闭包 if self?.errorBlock != nil { self?.errorBlock!() diff --git a/relax.offline.mp3.music/MP/MPPositive/ViewControllers/Base(基类,导航栏,标签栏)/MPPositive_MoreSongOperationsViewController.swift b/relax.offline.mp3.music/MP/MPPositive/ViewControllers/Base(基类,导航栏,标签栏)/MPPositive_MoreSongOperationsViewController.swift index 47bde34..a64eef0 100644 --- a/relax.offline.mp3.music/MP/MPPositive/ViewControllers/Base(基类,导航栏,标签栏)/MPPositive_MoreSongOperationsViewController.swift +++ b/relax.offline.mp3.music/MP/MPPositive/ViewControllers/Base(基类,导航栏,标签栏)/MPPositive_MoreSongOperationsViewController.swift @@ -9,8 +9,6 @@ import UIKit import Kingfisher ///更多操作 class MPPositive_MoreSongOperationsViewController: UIViewController { - //下载进度条View - private var loadView = CircularProgressView() //小角标图片 private lazy var indictorImageView:UIImageView = .init(image: .init(named: "Player_Indictor'logo")) //展示ICON @@ -267,6 +265,7 @@ class MPPositive_MoreSongOperationsViewController: UIViewController { } //是否收藏 @objc private func collectionClick(_ sender:UIButton) { + getUserNotificationCenter() if self.collectionBtn.isSelected == true{ self.collectionBtn.isSelected = false MPPositive_CollectionSongModel.fetch(.init(format: "videoId == %@", song.videoId)).forEach { item in @@ -315,6 +314,7 @@ extension MPPositive_MoreSongOperationsViewController:UITableViewDataSource, UIT } func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { if indexPath.row == 0 { + getUserNotificationCenter() if isLoaded { //移除下载 MPPositive_DownloadItemModel.fetch(.init(format: "videoId == %@", song.videoId)).forEach { item in 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 b3f6224..faf90c4 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 @@ -90,21 +90,11 @@ extension MPPositive_TabBarController { @objc private func pupPlayerAction() { DispatchQueue.main.async { [weak self] in - //检索播放器中是否存在load模型 -// if MP_PlayerManager.shared.loadPlayer != nil{ -// 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: true) -// } -// self?.present(playerVC, animated: true) -// } 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: true) + self?.viewControllers![self?.selectedIndex ?? 0].children[0].navigationController?.pushViewController(recommendVC, animated: false) } self?.present(playerVC, animated: true) } diff --git a/relax.offline.mp3.music/MP/MPPositive/ViewControllers/Center(个人曲库页)/MPPositive_LoveSongsViewController.swift b/relax.offline.mp3.music/MP/MPPositive/ViewControllers/Center(个人曲库页)/MPPositive_LoveSongsViewController.swift index 18cff74..3388014 100644 --- a/relax.offline.mp3.music/MP/MPPositive/ViewControllers/Center(个人曲库页)/MPPositive_LoveSongsViewController.swift +++ b/relax.offline.mp3.music/MP/MPPositive/ViewControllers/Center(个人曲库页)/MPPositive_LoveSongsViewController.swift @@ -93,10 +93,14 @@ extension MPPositive_LoveSongsViewController: UITableViewDataSource, UITableView MPPositive_Debouncer.shared.call { [weak self] in guard let self = self else {return} - //弹出播放器 - NotificationCenter.notificationKey.post(notificationName: .pup_player_vc) + guard MP_NetWorkManager.shared.netWorkStatu == .reachable else { + MP_HUD.text("Weak connection.", delay: 2.0, completion: nil) + return + } //优先清除数据 MP_PlayerManager.shared.loadPlayer = nil + //弹出播放器 + NotificationCenter.notificationKey.post(notificationName: .pup_player_vc) //将当前收藏音乐放入列表中 var array:[MPPositive_SongItemModel] = [] for (index,song) in MPPositive_LoadCoreModel.shared.songViewModels.enumerated() { @@ -114,7 +118,6 @@ extension MPPositive_LoveSongsViewController: UITableViewDataSource, UITableView let lodaViewModel = MPPositive_PlayerLoadViewModel(array, currentVideoId: MPPositive_LoadCoreModel.shared.songViewModels[indexPath.row].collectionSong.videoId ?? "") lodaViewModel.improveData(MPPositive_LoadCoreModel.shared.songViewModels[indexPath.row].collectionSong.videoId ?? "") MP_PlayerManager.shared.loadPlayer = lodaViewModel -// NotificationCenter.notificationKey.post(notificationName: .pup_player_vc) } } func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? { diff --git a/relax.offline.mp3.music/MP/MPPositive/ViewControllers/Center(个人曲库页)/MPPositive_OfflineSongsViewController.swift b/relax.offline.mp3.music/MP/MPPositive/ViewControllers/Center(个人曲库页)/MPPositive_OfflineSongsViewController.swift index 32b8fab..65d8b9e 100644 --- a/relax.offline.mp3.music/MP/MPPositive/ViewControllers/Center(个人曲库页)/MPPositive_OfflineSongsViewController.swift +++ b/relax.offline.mp3.music/MP/MPPositive/ViewControllers/Center(个人曲库页)/MPPositive_OfflineSongsViewController.swift @@ -99,10 +99,10 @@ extension MPPositive_OfflineSongsViewController: UITableViewDataSource, UITableV MPPositive_Debouncer.shared.call { [weak self] in guard let self = self else {return} - //弹出播放器 - NotificationCenter.notificationKey.post(notificationName: .pup_player_vc) //优先清除数据 MP_PlayerManager.shared.loadPlayer = nil + //弹出播放器 + NotificationCenter.notificationKey.post(notificationName: .pup_player_vc) //将当前下载音乐放入列表中 var array:[MPPositive_SongItemModel] = [] for (index, song) in MPPositive_LoadCoreModel.shared.loadViewModels.enumerated() { diff --git a/relax.offline.mp3.music/MP/MPPositive/ViewControllers/Home(首页,各项列表页,艺术家页)/MPPositive_ArtistShowViewController.swift b/relax.offline.mp3.music/MP/MPPositive/ViewControllers/Home(首页,各项列表页,艺术家页)/MPPositive_ArtistShowViewController.swift index 29acb6e..74bc142 100644 --- a/relax.offline.mp3.music/MP/MPPositive/ViewControllers/Home(首页,各项列表页,艺术家页)/MPPositive_ArtistShowViewController.swift +++ b/relax.offline.mp3.music/MP/MPPositive/ViewControllers/Home(首页,各项列表页,艺术家页)/MPPositive_ArtistShowViewController.swift @@ -215,11 +215,15 @@ extension MPPositive_ArtistShowViewController: JXPagingViewDelegate{ 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_PlayerManager.shared.loadPlayer = nil //单曲/视频跳转 //弹出播放器 NotificationCenter.notificationKey.post(notificationName: .pup_player_vc) - //优先清除数据 - MP_PlayerManager.shared.loadPlayer = nil //触发next请求,优先获取列表全部单曲基础数据(不完善) MP_NetWorkManager.shared.requestNextList(item.browseItem.playListId ?? "", videoId: item.browseItem.videoId ?? ""){ [weak self] listSongs in guard let self = self else {return} 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 3e47f84..9fd31cf 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 @@ -158,10 +158,14 @@ extension MPPositive_HomeViewController: UITableViewDataSource, UITableViewDeleg MPPositive_Debouncer.shared.call { [weak self] in guard let self = self else {return} - //弹出播放器 - NotificationCenter.notificationKey.post(notificationName: .pup_player_vc) + guard MP_NetWorkManager.shared.netWorkStatu == .reachable else { + MP_HUD.text("Weak connection.", delay: 2.0, completion: nil) + return + } //优先清除数据 MP_PlayerManager.shared.loadPlayer = nil + //弹出播放器 + NotificationCenter.notificationKey.post(notificationName: .pup_player_vc) //触发next请求,优先获取列表全部单曲基础数据(不完善) MP_NetWorkManager.shared.requestNextList(item.browseItem.playListId ?? "", videoId: item.browseItem.videoId ?? ""){ [weak self] listSongs in guard let self = self else {return} @@ -169,7 +173,6 @@ extension MPPositive_HomeViewController: UITableViewDataSource, UITableViewDeleg let lodaViewModel = MPPositive_PlayerLoadViewModel(listSongs, currentVideoId: item.browseItem.videoId ?? "") lodaViewModel.improveData(item.browseItem.videoId ?? "") MP_PlayerManager.shared.loadPlayer = lodaViewModel -// NotificationCenter.notificationKey.post(notificationName: .pup_player_vc) } } case .list: diff --git a/relax.offline.mp3.music/MP/MPPositive/ViewControllers/Home(首页,各项列表页,艺术家页)/MPPositive_ListShowViewController.swift b/relax.offline.mp3.music/MP/MPPositive/ViewControllers/Home(首页,各项列表页,艺术家页)/MPPositive_ListShowViewController.swift index b86c81b..8547796 100644 --- a/relax.offline.mp3.music/MP/MPPositive/ViewControllers/Home(首页,各项列表页,艺术家页)/MPPositive_ListShowViewController.swift +++ b/relax.offline.mp3.music/MP/MPPositive/ViewControllers/Home(首页,各项列表页,艺术家页)/MPPositive_ListShowViewController.swift @@ -248,15 +248,19 @@ class MPPositive_ListShowViewController: MPPositive_BaseViewController, UIViewCo } //MARK: - 点击事件 - //播放/暂停列表 + //播放列表 @objc private func playListActionClick(_ sender:UITapGestureRecognizer) { MPPositive_Debouncer.shared.call { [weak self] in guard let self = self, let item = listOrAlbum.items.randomElement() else {return} - //弹出播放器 - NotificationCenter.notificationKey.post(notificationName: .pup_player_vc) + guard MP_NetWorkManager.shared.netWorkStatu == .reachable else { + MP_HUD.text("Weak connection.", delay: 2.0, completion: nil) + return + } //优先清除数据 MP_PlayerManager.shared.loadPlayer = nil + //弹出播放器 + NotificationCenter.notificationKey.post(notificationName: .pup_player_vc) //触发next请求,优先获取列表全部单曲基础数据(不完善) MP_NetWorkManager.shared.requestNextList(item.browseItem.playListId ?? "", videoId: item.browseItem.videoId ?? ""){ [weak self] listSongs in guard let self = self else {return} @@ -264,13 +268,13 @@ class MPPositive_ListShowViewController: MPPositive_BaseViewController, UIViewCo let lodaViewModel = MPPositive_PlayerLoadViewModel(listSongs, currentVideoId: item.browseItem.videoId ?? "") lodaViewModel.improveData(item.browseItem.videoId ?? "") MP_PlayerManager.shared.loadPlayer = lodaViewModel - //弹出播放器 -// NotificationCenter.notificationKey.post(notificationName: .pup_player_vc) + } } } //切换当前列表收藏状态 @objc private func collectionSwitchClick(_ sender:UIButton) { + getUserNotificationCenter() if self.collectionListBtn.isSelected == true{ self.collectionListBtn.isSelected = false @@ -322,6 +326,10 @@ extension MPPositive_ListShowViewController: UITableViewDataSource, UITableViewD 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 + } //弹出播放器 NotificationCenter.notificationKey.post(notificationName: .pup_player_vc) //触发next请求,优先获取列表全部单曲基础数据(不完善) @@ -331,8 +339,6 @@ extension MPPositive_ListShowViewController: UITableViewDataSource, UITableViewD let lodaViewModel = MPPositive_PlayerLoadViewModel(listSongs, currentVideoId: listOrAlbum.items[indexPath.row].browseItem.videoId ?? "") lodaViewModel.improveData(listOrAlbum.items[indexPath.row].browseItem.videoId ?? "") MP_PlayerManager.shared.loadPlayer = lodaViewModel - //发布弹出音乐播放器的通知 -// NotificationCenter.notificationKey.post(notificationName: .pup_player_vc) } } } diff --git a/relax.offline.mp3.music/MP/MPPositive/ViewControllers/Home(首页,各项列表页,艺术家页)/MPPositive_MoreContentViewController.swift b/relax.offline.mp3.music/MP/MPPositive/ViewControllers/Home(首页,各项列表页,艺术家页)/MPPositive_MoreContentViewController.swift index 8256aa5..5640ad3 100644 --- a/relax.offline.mp3.music/MP/MPPositive/ViewControllers/Home(首页,各项列表页,艺术家页)/MPPositive_MoreContentViewController.swift +++ b/relax.offline.mp3.music/MP/MPPositive/ViewControllers/Home(首页,各项列表页,艺术家页)/MPPositive_MoreContentViewController.swift @@ -62,7 +62,7 @@ class MPPositive_MoreContentViewController: MPPositive_BaseViewController { var browseModuleList:MPPositive_BrowseModuleListViewModel! override func viewDidLoad() { super.viewDidLoad() - setTitle("Report") + setTitle("More") setPopBtn() confirgue() } @@ -113,10 +113,14 @@ extension MPPositive_MoreContentViewController: UICollectionViewDataSource, UICo MPPositive_Debouncer.shared.call { [weak self] in guard let self = self else {return} - //弹出播放器 - NotificationCenter.notificationKey.post(notificationName: .pup_player_vc) + guard MP_NetWorkManager.shared.netWorkStatu == .reachable else { + MP_HUD.text("Weak connection.", delay: 2.0, completion: nil) + return + } //优先清除数据 MP_PlayerManager.shared.loadPlayer = nil + //弹出播放器 + NotificationCenter.notificationKey.post(notificationName: .pup_player_vc) //触发next请求,优先获取列表全部单曲基础数据(不完善) MP_NetWorkManager.shared.requestNextList(browseModuleList.items[indexPath.row].browseItem.playListId ?? "", videoId: browseModuleList.items[indexPath.row].browseItem.videoId ?? ""){ [weak self] listSongs in guard let self = self else {return} @@ -124,7 +128,6 @@ extension MPPositive_MoreContentViewController: UICollectionViewDataSource, UICo let lodaViewModel = MPPositive_PlayerLoadViewModel(listSongs, currentVideoId: browseModuleList.items[indexPath.row].browseItem.videoId ?? "") lodaViewModel.improveData(browseModuleList.items[indexPath.row].browseItem.videoId ?? "") MP_PlayerManager.shared.loadPlayer = lodaViewModel -// NotificationCenter.notificationKey.post(notificationName: .pup_player_vc) } } default: diff --git a/relax.offline.mp3.music/MP/MPPositive/ViewControllers/Player(播放器)/MPPositive_PlayerViewController.swift b/relax.offline.mp3.music/MP/MPPositive/ViewControllers/Player(播放器)/MPPositive_PlayerViewController.swift index 30bafd9..876d2d9 100644 --- a/relax.offline.mp3.music/MP/MPPositive/ViewControllers/Player(播放器)/MPPositive_PlayerViewController.swift +++ b/relax.offline.mp3.music/MP/MPPositive/ViewControllers/Player(播放器)/MPPositive_PlayerViewController.swift @@ -123,6 +123,7 @@ class MPPositive_PlayerViewController: MPPositive_BaseViewController, UIViewCont //歌词View private lazy var lyricsView:MPPositive_PlayerLyricView = .init(frame: .init(x: 0, y: 0, width: screen_Width, height: 480*width)) var recommendBlock:(() -> Void)? + override func viewDidLoad() { super.viewDidLoad() //隐藏导航栏label @@ -420,6 +421,10 @@ class MPPositive_PlayerViewController: MPPositive_BaseViewController, UIViewCont } //切换页面显示内容(单曲封面|歌词)按钮组 @objc private func switchActionClick(_ sender:UIButton) { + guard MP_NetWorkManager.shared.netWorkStatu == .reachable else { + MP_HUD.text("Weak connection.", delay: 2.0, completion: nil) + return + } topShowType = .init(rawValue: sender.tag)! } //切换动画 @@ -467,17 +472,23 @@ class MPPositive_PlayerViewController: MPPositive_BaseViewController, UIViewCont } //弹出关联内容 @objc private func relatedContentClick(_ sender:UIButton) { - //先dismiss - dismiss(animated: true) {[weak self] in - guard let self = self else {return} - if recommendBlock != nil { - recommendBlock!() - } + guard MP_NetWorkManager.shared.netWorkStatu == .reachable else { + MP_HUD.text("Weak connection.", delay: 2.0, completion: nil) + return } + //先dismiss + if recommendBlock != nil { + recommendBlock!() + } + dismiss(animated: true) } //播放/暂停/继续 @objc private func playClick(_ sender:UIButton) { + guard MP_NetWorkManager.shared.netWorkStatu == .reachable else { + MP_HUD.text("Weak connection.", delay: 2.0, completion: nil) + return + } guard MP_PlayerManager.shared.loadPlayer != nil else { return } @@ -504,7 +515,12 @@ class MPPositive_PlayerViewController: MPPositive_BaseViewController, UIViewCont } //展示列表 @objc private func listClick(_ sender:UIButton) { + guard MP_NetWorkManager.shared.netWorkStatu == .reachable else { + MP_HUD.text("Weak connection.", delay: 2.0, completion: nil) + return + } if MP_PlayerManager.shared.loadPlayer != nil { + MPPositive_ModalType = .PlayerList let listVC = MPPositive_PlayerListShowViewController() listVC.transitioningDelegate = self @@ -517,6 +533,10 @@ class MPPositive_PlayerViewController: MPPositive_BaseViewController, UIViewCont } //切换播放器状态(按顺序/随机/单曲) @objc private func typeClick(_ sender:UIButton) { + guard MP_NetWorkManager.shared.netWorkStatu == .reachable else { + MP_HUD.text("Weak connection.", delay: 2.0, completion: nil) + return + } MPPositive_Debouncer.shared.call { [weak self] in guard let self = self else {return} @@ -531,22 +551,34 @@ class MPPositive_PlayerViewController: MPPositive_BaseViewController, UIViewCont } //下一首 @objc private func nextClick(_ sender:UIButton) { + guard MP_NetWorkManager.shared.netWorkStatu == .reachable else { + MP_HUD.text("Weak connection.", delay: 2.0, completion: nil) + return + } + guard MP_PlayerManager.shared.loadPlayer?.currentVideo != nil else { + return + } MPPositive_Debouncer.shared.call { [weak self] in guard let self = self else {return} coverView.sliderView.value = 0 - playBtn.isUserInteractionEnabled = false MP_PlayerManager.shared.nextEvent() } } //上一首 @objc private func previousClick(_ sender:UIButton) { + guard MP_NetWorkManager.shared.netWorkStatu == .reachable else { + MP_HUD.text("Weak connection.", delay: 2.0, completion: nil) + return + } + guard MP_PlayerManager.shared.loadPlayer?.currentVideo != nil else { + return + } MPPositive_Debouncer.shared.call { [weak self] in guard let self = self else {return} coverView.sliderView.value = 0 - playBtn.isUserInteractionEnabled = false MP_PlayerManager.shared.previousEvent() } } diff --git a/relax.offline.mp3.music/MP/MPPositive/ViewControllers/Player(播放器)/MPPositive_RecommendViewController.swift b/relax.offline.mp3.music/MP/MPPositive/ViewControllers/Player(播放器)/MPPositive_RecommendViewController.swift index 99d5bc2..b3c50f4 100644 --- a/relax.offline.mp3.music/MP/MPPositive/ViewControllers/Player(播放器)/MPPositive_RecommendViewController.swift +++ b/relax.offline.mp3.music/MP/MPPositive/ViewControllers/Player(播放器)/MPPositive_RecommendViewController.swift @@ -229,6 +229,9 @@ extension MPPositive_RecommendViewController: JXSegmentedListContainerViewDataSo let listVC = MPPositive_ListShowViewController(item.browseItem.browseId ?? "", params: "", title: item.title ?? "", subtitle: item.subtitle ?? "") navigationController?.pushViewController(listVC, animated: true) case .single: + //优先清除数据 + MP_PlayerManager.shared.loadPlayer = nil + NotificationCenter.notificationKey.post(notificationName: .pup_player_vc) //单曲/视频跳转 //触发next请求,优先获取列表全部单曲基础数据(不完善) MP_NetWorkManager.shared.requestNextList(item.browseItem.playListId ?? "", videoId: item.browseItem.videoId ?? ""){ [weak self] listSongs in 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 89debdd..1324689 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 @@ -113,11 +113,15 @@ class MPPositive_SearchResultShowViewController: MPPositive_BaseViewController, 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_PlayerManager.shared.loadPlayer = nil //单曲/视频跳转 //弹出播放器 NotificationCenter.notificationKey.post(notificationName: .pup_player_vc) - //优先清除数据 - MP_PlayerManager.shared.loadPlayer = nil //触发next请求,优先获取列表全部单曲基础数据(不完善) MP_NetWorkManager.shared.requestNextList(item.item.playListId ?? "", videoId: item.item.videoId ?? ""){ [weak self] listSongs in guard let self = self else {return} diff --git a/relax.offline.mp3.music/MP/MPPositive/Views/Home/MPPositive_ArtistShowHeaderView.swift b/relax.offline.mp3.music/MP/MPPositive/Views/Home/MPPositive_ArtistShowHeaderView.swift index 0fe0fea..c8c131b 100644 --- a/relax.offline.mp3.music/MP/MPPositive/Views/Home/MPPositive_ArtistShowHeaderView.swift +++ b/relax.offline.mp3.music/MP/MPPositive/Views/Home/MPPositive_ArtistShowHeaderView.swift @@ -92,6 +92,7 @@ class MPPositive_ArtistShowHeaderView: UIView { } //收藏这位艺术家 @objc private func collectionClick(_ sender:UIButton) { + getUserNotificationCenter() if self.collectionBtn.isSelected == true{ self.collectionBtn.isSelected = false 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 de81c6b..85c6919 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 @@ -96,6 +96,10 @@ class MPPositive_ArtistShowSongTableViewCell: UITableViewCell { var moreBlock:(() -> Void)? //点击更多 @objc private func moreActionClick(_ sender:UIButton) { + guard MP_NetWorkManager.shared.netWorkStatu == .reachable else { + MP_HUD.text("Weak connection.", delay: 2.0, completion: nil) + return + } guard moreBlock != nil else { return } 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 b73ad61..8cae26c 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 @@ -101,6 +101,10 @@ class MPPositive_MusicItemShowTableViewCell: UITableViewCell { } //点击更多 @objc private func moreActionClick(_ sender:UIButton) { + guard MP_NetWorkManager.shared.netWorkStatu == .reachable else { + MP_HUD.text("Weak connection.", delay: 2.0, completion: nil) + return + } guard moreBlock != nil else { return } diff --git a/relax.offline.mp3.music/MP/MPPositive/Views/Player/MPPositive_PlayerCoverView.swift b/relax.offline.mp3.music/MP/MPPositive/Views/Player/MPPositive_PlayerCoverView.swift index 1eed528..03fed4f 100644 --- a/relax.offline.mp3.music/MP/MPPositive/Views/Player/MPPositive_PlayerCoverView.swift +++ b/relax.offline.mp3.music/MP/MPPositive/Views/Player/MPPositive_PlayerCoverView.swift @@ -81,11 +81,21 @@ class MPPositive_PlayerCoverView: UIView, PKDownloadButtonDelegate { maskView.backgroundColor = .init(hex: "#000000", alpha: 0.7) maskView.layer.masksToBounds = true maskView.layer.cornerRadius = 16*width + //放置一个icon + let iconImageView:UIImageView = .init(image: .init(named: "NoNetReache'log")) + maskView.addSubview(iconImageView) + iconImageView.snp.makeConstraints { make in + make.centerX.equalToSuperview() + make.centerY.equalToSuperview().multipliedBy(0.8) + make.width.equalTo(52*width) + make.height.equalTo(42*width) + } //放置一个label - let noticeLabel:UILabel = createLabel("The network connection is disconnected and the player will stop loading music. Please restore the network as soon as possible!", font: .systemFont(ofSize: 18, weight: .medium), textColor: .white, textAlignment: .center, lines: 0) + let noticeLabel:UILabel = createLabel("Weak connection. Please check your network", font: .systemFont(ofSize: 18, weight: .medium), textColor: .white, textAlignment: .center, lines: 0) maskView.addSubview(noticeLabel) noticeLabel.snp.makeConstraints { make in - make.center.equalToSuperview() + make.top.equalTo(iconImageView.snp.bottom).offset(20*width) + make.centerX.equalToSuperview() make.width.equalToSuperview().multipliedBy(0.7) } return maskView @@ -143,7 +153,7 @@ class MPPositive_PlayerCoverView: UIView, PKDownloadButtonDelegate { maskNotReachableView.snp.makeConstraints { make in make.left.right.top.bottom.equalTo(coverImageView) } - maskNotReachableView.isHidden = true + maskNotReachableView.isHidden = (MP_NetWorkManager.shared.netWorkStatu == .reachable) //添加标题 addSubview(titleLabel) titleLabel.snp.makeConstraints { make in @@ -232,6 +242,11 @@ class MPPositive_PlayerCoverView: UIView, PKDownloadButtonDelegate { } //切换当前列表收藏状态 @objc private func collectionSwitchClick(_ sender:UIButton) { + getUserNotificationCenter() + guard MP_NetWorkManager.shared.netWorkStatu == .reachable else { + MP_HUD.text("Weak connection.", delay: 2.0, completion: nil) + return + } if self.collectionSongBtn.isSelected == true{ self.collectionSongBtn.isSelected = false if MP_PlayerManager.shared.loadPlayer.currentVideo != nil{ @@ -263,6 +278,11 @@ class MPPositive_PlayerCoverView: UIView, PKDownloadButtonDelegate { } //下载按钮代理 func downloadButtonTapped(_ downloadButton: PKDownloadButton!, currentState state: PKDownloadButtonState) { + getUserNotificationCenter() + guard MP_NetWorkManager.shared.netWorkStatu == .reachable else { + MP_HUD.text("Weak connection.", delay: 2.0, completion: nil) + return + } guard MP_PlayerManager.shared.loadPlayer?.currentVideo != nil, MP_PlayerManager.shared.loadPlayer?.currentVideo?.isDlownd == false else { return } diff --git a/relax.offline.mp3.music/MP/MPPositive/Views/Player/MPPositive_PlayerListShowTableViewCell.swift b/relax.offline.mp3.music/MP/MPPositive/Views/Player/MPPositive_PlayerListShowTableViewCell.swift index ae6e055..abccdaa 100644 --- a/relax.offline.mp3.music/MP/MPPositive/Views/Player/MPPositive_PlayerListShowTableViewCell.swift +++ b/relax.offline.mp3.music/MP/MPPositive/Views/Player/MPPositive_PlayerListShowTableViewCell.swift @@ -72,7 +72,7 @@ class MPPositive_PlayerListShowTableViewCell: UITableViewCell { } contentView.addSubview(removeBtn) removeBtn.snp.makeConstraints { make in - make.width.height.equalTo(24*width) + make.width.height.equalTo(44*width) make.centerY.equalTo(coverImageView.snp.centerY) make.right.equalToSuperview().offset(-18*width) } diff --git a/relax.offline.mp3.music/MP/MPPositive/Views/Player/MPPositive_PlayerSilder.swift b/relax.offline.mp3.music/MP/MPPositive/Views/Player/MPPositive_PlayerSilder.swift index d8d8342..e9901da 100644 --- a/relax.offline.mp3.music/MP/MPPositive/Views/Player/MPPositive_PlayerSilder.swift +++ b/relax.offline.mp3.music/MP/MPPositive/Views/Player/MPPositive_PlayerSilder.swift @@ -29,7 +29,7 @@ class MPPositive_PlayerSilder: UISlider { override init(frame:CGRect) { super.init(frame: frame) setUpLayout() - print("调整Slider大小") +// print("调整Slider大小") originalFrame = self.frame } override func awakeFromNib() { 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 98a415b..6517cab 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 @@ -119,6 +119,10 @@ class MPPositive_SearchResultShowTableViewCell: UITableViewCell { //点击更多 @objc private func moreActionClick(_ sender:UIButton) { + guard MP_NetWorkManager.shared.netWorkStatu == .reachable else { + MP_HUD.text("Weak connection.", delay: 2.0, completion: nil) + return + } if moreBlock != nil { moreBlock!() }