재생 목록 플레이어
- 잠금화면 플레이어 추가
This commit is contained in:
		@@ -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
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user