From ca6af27c4d96ada0bea1481e4b21068a3caa33ae Mon Sep 17 00:00:00 2001 From: liwei1dao Date: Thu, 4 Sep 2025 21:51:06 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E9=9F=B3=E4=B9=90=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E5=9B=BE=E7=89=87=E4=B8=8D=E5=8A=A0=E8=BD=BD=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ios/Runner/Info.plist | 41 ++++++++++++++++ .../Sources/music_service/MusicService.swift | 49 +++++++++++++++---- 2 files changed, 81 insertions(+), 9 deletions(-) diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index 4cde8e5c9..1087023b6 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -102,6 +102,47 @@ NSAllowsArbitraryLoadsInWebContent + + NSExceptionDomains + + music.126.net + + NSExceptionAllowsInsecureHTTPLoads + + NSExceptionMinimumTLSVersion + TLSv1.0 + NSIncludesSubdomains + + + p1.music.126.net + + NSExceptionAllowsInsecureHTTPLoads + + NSExceptionMinimumTLSVersion + TLSv1.0 + + p2.music.126.net + + NSExceptionAllowsInsecureHTTPLoads + + NSExceptionMinimumTLSVersion + TLSv1.0 + + p3.music.126.net + + NSExceptionAllowsInsecureHTTPLoads + + NSExceptionMinimumTLSVersion + TLSv1.0 + + p4.music.126.net + + NSExceptionAllowsInsecureHTTPLoads + + NSExceptionMinimumTLSVersion + TLSv1.0 + + NSBluetoothAlwaysUsageDescription Bluetooth permission is required to connect and manage audio devices diff --git a/local_plugins/music_service/ios/music_service/Sources/music_service/MusicService.swift b/local_plugins/music_service/ios/music_service/Sources/music_service/MusicService.swift index 74374fbc6..4e6c098ea 100644 --- a/local_plugins/music_service/ios/music_service/Sources/music_service/MusicService.swift +++ b/local_plugins/music_service/ios/music_service/Sources/music_service/MusicService.swift @@ -48,8 +48,14 @@ public class MusicService: NSObject { // MARK: - 音频会话设置 private func setupAudioSession() { do { - try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default, options: [.allowAirPlay, .allowBluetooth]) - try AVAudioSession.sharedInstance().setActive(true) + let audioSession = AVAudioSession.sharedInstance() + try audioSession.setCategory(.playback, mode: .default, options: [.allowAirPlay, .allowBluetooth, .allowBluetoothA2DP]) + try audioSession.setActive(true) + + // 确保媒体控制中心可以接收到我们的应用 + setupRemoteCommandCenter() + + print("音频会话和媒体控制设置成功") } catch { print("设置音频会话失败: \(error)") } @@ -380,6 +386,12 @@ public class MusicService: NSObject { currentVolume = 1.0 player?.volume = currentVolume + // 立即设置媒体信息,即使播放器还未准备就绪 + updateNowPlayingInfo(song: song) + + // 确保远程控制中心已设置 + setupRemoteCommandCenter() + print("播放器已创建,等待加载完成...") } @@ -574,20 +586,39 @@ public class MusicService: NSObject { // 异步加载封面图片 if !coverUrl.isEmpty, let url = URL(string: coverUrl) { + print("开始加载封面图片: \(coverUrl)") + DispatchQueue.global(qos: .background).async { - if let data = try? Data(contentsOf: url), - let image = UIImage(data: data) { - DispatchQueue.main.async { - nowPlayingInfo[MPMediaItemPropertyArtwork] = MPMediaItemArtwork(boundsSize: image.size) { _ in image } - MPNowPlayingInfoCenter.default().nowPlayingInfo = nowPlayingInfo + // 创建带超时的URLRequest + var request = URLRequest(url: url) + request.timeoutInterval = 10.0 + + URLSession.shared.dataTask(with: request) { data, response, error in + if let error = error { + print("图片加载失败: \(error.localizedDescription)") + DispatchQueue.main.async { + MPNowPlayingInfoCenter.default().nowPlayingInfo = nowPlayingInfo + } + return } - } else { + + guard let data = data, let image = UIImage(data: data) else { + print("图片数据无效或格式不支持") + DispatchQueue.main.async { + MPNowPlayingInfoCenter.default().nowPlayingInfo = nowPlayingInfo + } + return + } + + print("图片加载成功") DispatchQueue.main.async { + nowPlayingInfo[MPMediaItemPropertyArtwork] = MPMediaItemArtwork(boundsSize: image.size) { _ in image } MPNowPlayingInfoCenter.default().nowPlayingInfo = nowPlayingInfo } - } + }.resume() } } else { + print("封面图片URL为空") MPNowPlayingInfoCenter.default().nowPlayingInfo = nowPlayingInfo } }