재생 목록 플레이어

- 잠금화면 플레이어 추가
This commit is contained in:
Yu Sung 2024-12-18 02:46:59 +09:00
parent d77b83033d
commit bfcb5798bd
2 changed files with 85 additions and 7 deletions

View File

@ -105,8 +105,8 @@ extension ContentPlayManager {
UIApplication.shared.beginReceivingRemoteControlEvents()
}
self.registerNowPlayingInfoCenter()
self.registerRemoteControlEvents()
self.fetchAlbumArtAndUpdateNowPlayingInfo()
} catch {
DispatchQueue.main.async {
self.showError()
@ -193,7 +193,39 @@ extension ContentPlayManager {
self.resetAudioData()
}
private func registerNowPlayingInfoCenter() {
private func fetchAlbumArtAndUpdateNowPlayingInfo() {
guard let url = URL(string: coverImage) else {
print("잘못된 이미지 URL")
registerNowPlayingInfoCenter(with: nil) //
return
}
// URLSession
URLSession.shared.dataTask(with: url) { [weak self] data, _, error in
if let error = error {
print("앨범 아트 다운로드 실패: \(error.localizedDescription)")
DispatchQueue.main.async {
self?.registerNowPlayingInfoCenter(with: nil) //
}
return
}
guard let data = data, let image = UIImage(data: data) else {
print("이미지 데이터를 가져오지 못했습니다.")
DispatchQueue.main.async {
self?.registerNowPlayingInfoCenter(with: nil) //
}
return
}
//
DispatchQueue.main.async {
self?.registerNowPlayingInfoCenter(with: image)
}
}.resume()
}
private func registerNowPlayingInfoCenter(with albumArtImage: UIImage?) {
let center = MPNowPlayingInfoCenter.default()
var nowPlayingInfo = center.nowPlayingInfo ?? [String: Any]()

View File

@ -106,6 +106,17 @@ final class ContentPlayerPlayManager: NSObject, ObservableObject {
}
}
.store(in: &cancellables)
do {
let audioSession = AVAudioSession.sharedInstance()
try audioSession.setCategory(.playback, mode: .moviePlayback)
try audioSession.setActive(true)
self.registerRemoteControlEvents()
self.fetchAlbumArtAndUpdateNowPlayingInfo()
} catch {
DEBUG_LOG("Audio Session 설정 실패: \(error.localizedDescription)")
}
}
private func checkPlaybackStart(bufferedTime: Double, isLikelyToKeepUp: Bool) {
@ -247,16 +258,47 @@ final class ContentPlayerPlayManager: NSObject, ObservableObject {
}
}
private func registerNowPlayingInfoCenter() {
private func fetchAlbumArtAndUpdateNowPlayingInfo() {
guard let url = URL(string: coverImageUrl) else {
print("잘못된 이미지 URL")
registerNowPlayingInfoCenter(with: nil) //
return
}
// URLSession
URLSession.shared.dataTask(with: url) { [weak self] data, _, error in
if let error = error {
print("앨범 아트 다운로드 실패: \(error.localizedDescription)")
DispatchQueue.main.async {
self?.registerNowPlayingInfoCenter(with: nil) //
}
return
}
guard let data = data, let image = UIImage(data: data) else {
print("이미지 데이터를 가져오지 못했습니다.")
DispatchQueue.main.async {
self?.registerNowPlayingInfoCenter(with: nil) //
}
return
}
//
DispatchQueue.main.async {
self?.registerNowPlayingInfoCenter(with: image)
}
}.resume()
}
private func registerNowPlayingInfoCenter(with albumArtImage: UIImage?) {
let center = MPNowPlayingInfoCenter.default()
var nowPlayingInfo = center.nowPlayingInfo ?? [String: Any]()
nowPlayingInfo[MPMediaItemPropertyTitle] = title
nowPlayingInfo[MPMediaItemPropertyArtist] = nickname
if let artworkURL = URL(string: coverImageUrl), let imageData = try? Data(contentsOf: artworkURL), let artworkImage = UIImage(data: imageData) {
let artwork = MPMediaItemArtwork(boundsSize: artworkImage.size) { size in
return artworkImage
}
if let image = albumArtImage {
let artwork = MPMediaItemArtwork(boundsSize: image.size) { _ in image }
nowPlayingInfo[MPMediaItemPropertyArtwork] = artwork
}
@ -275,21 +317,25 @@ final class ContentPlayerPlayManager: NSObject, ObservableObject {
private func registerRemoteControlEvents() {
let center = MPRemoteCommandCenter.shared()
center.playCommand.isEnabled = true
center.playCommand.addTarget { [unowned self] (commandEvent) -> MPRemoteCommandHandlerStatus in
self.playOrPause()
return .success
}
center.pauseCommand.isEnabled = true
center.pauseCommand.addTarget { [unowned self] (commandEvent) -> MPRemoteCommandHandlerStatus in
self.playOrPause()
return .success
}
center.skipForwardCommand.isEnabled = true
center.skipForwardCommand.addTarget { [unowned self] (commandEvent) -> MPRemoteCommandHandlerStatus in
self.playNextContent()
return .success
}
center.skipBackwardCommand.isEnabled = true
center.skipBackwardCommand.addTarget { [unowned self] (commandEvent) -> MPRemoteCommandHandlerStatus in
self.playPreviousContent()
return .success