우선 백그라운드 미디어 재생까지는 구현된 것으로 가정

MPRemoteCommandCenter

외부 액세서리 및 시스템의 제어를 통한 원격 이벤트에 응답하는 Object

shared() 메서드를 통한 싱글턴으로 사용된다.

공유 인스턴스 검색

class func shared() -> MPRemoteCommandCenter

시스템의 원격 명령 개체에 액세스하는 데 사용하는 공유 개체를 반환합니다.

 

재생 명령

var pauseCommand: MPRemoteCommand

현재 항목의 재생을 일시 중지하기위한 명령 개체입니다.

var playCommand: MPRemoteCommand

현재 항목의 재생을 시작하기위한 명령 개체입니다.

var stopCommand: MPRemoteCommand

현재 항목의 재생을 중지하기위한 명령 개체입니다.

var togglePlayPauseCommand: MPRemoteCommand

현재 항목 재생과 일시 중지 사이를 전환하기위한 명령 개체입니다.

트랙 간 탐색

var nextTrackCommand: MPRemoteCommand

다음 트랙을 선택하기위한 명령 개체입니다.

var previousTrackCommand: MPRemoteCommand

이전 트랙을 선택하기위한 명령 개체입니다.

var changeRepeatModeCommand: MPChangeRepeatModeCommand

반복 모드를 변경하기위한 명령 개체입니다.

var changeShuffleModeCommand: MPChangeShuffleModeCommand

셔플 모드를 변경하기위한 명령 개체입니다.

트랙 내용 탐색

var changePlaybackRateCommand: MPChangePlaybackRateCommand

현재 미디어 항목의 재생 속도를 변경하기위한 명령 개체입니다.

var seekBackwardCommand: MPRemoteCommand

단일 미디어 항목을 통해 뒤로 검색하기위한 명령 개체입니다.

var seekForwardCommand: MPRemoteCommand

단일 미디어 항목을 통해 앞으로 검색하기위한 명령 개체입니다.

var skipBackwardCommand: MPSkipIntervalCommand

미디어 항목의 이전 지점을 재생하기위한 명령 개체입니다.

var skipForwardCommand: MPSkipIntervalCommand

미디어 항목에서 미래 지점을 재생하기위한 명령 개체입니다.

var changePlaybackPositionCommand: MPChangePlaybackPositionCommand

미디어 항목에서 재생 위치를 변경하기위한 명령 개체입니다.

미디어 항목 평가

var ratingCommand: MPRatingCommand

미디어 항목을 평가하기위한 명령 개체입니다.

var likeCommand: MPFeedbackCommand

사용자가 현재 재생중인 것을 좋아함을 나타내는 명령 개체입니다.

var dislikeCommand: MPFeedbackCommand

사용자가 현재 재생중인 항목을 싫어함을 나타내는 명령 개체입니다.

미디어 항목 북마크

var bookmarkCommand: MPFeedbackCommand

사용자가 미디어 항목을 기억하기를 원함을 나타내는 명령 개체입니다.

언어 옵션 활성화

var enableLanguageOptionCommand: MPRemoteCommand

언어 옵션을 활성화하기위한 명령 개체입니다.

var disableLanguageOptionCommand: MPRemoteCommand

언어 옵션을 비활성화하기위한 명령 개체


MPNowPlayingInfoCenter

현재 재생중인 미디어에 대한 현재 정보를 설정하는 Object

The MPNowPlayingInfoCenter object contains a nowPlayingInfo dictionary whose contents describe the item being played.

nowPlayingInfo Dictionary를 사용해서 콘텐츠를 업데이트 할 수 있다.

 

AirPlay도 가능하고, 자동차나 iPod 악세서리에 연결 시 정보가 표시될 수 있다고 한다.

 

MPRemoteCommandCenter와 마찬가지로 싱글톤 객체를 반환한다.

default() 메서드를 사용하여 참조할 수 있다.

기본 Now Playing 정보 센터로 작업하기

class func `default`() -> MPNowPlayingInfoCenter

현재 정보 센터를 재생하는 싱글 톤을 반환합니다.

var nowPlayingInfo: [String : Any]?

현재 재생중인 기본 정보 센터에 대한 현재 재생중인 정보입니다.

enum MPNowPlayingInfoMediaType

현재 재생중인 미디어 유형입니다.

 

지금 재생중인 메타 데이터 속성

현재 재생중인 항목에 대한 구체적인 정보를 제공합니다.

let MPNowPlayingInfoCollectionIdentifier: String

현재 재생중인 항목이 속한 컬렉션의 식별자입니다.

let MPNowPlayingInfoPropertyAvailableLanguageOptions: String

현재 재생중인 항목에 사용할 수있는 언어 옵션 그룹입니다.

let MPNowPlayingInfoPropertyAssetURL: String

현재 재생중인 항목의 기본 자산을 가리키는 URL입니다.

let MPNowPlayingInfoPropertyChapterCount: String

현재 재생중인 항목의 총 챕터 수입니다.

let MPNowPlayingInfoPropertyChapterNumber: String

현재 재생중인 챕터에 해당하는 번호입니다.

let MPNowPlayingInfoPropertyCurrentLanguageOptions: String

현재 재생중인 항목에 대해 현재 활성화 된 언어 옵션입니다.

let MPNowPlayingInfoPropertyDefaultPlaybackRate: String

현재 재생중인 항목의 기본 재생 속도입니다.

let MPNowPlayingInfoPropertyCurrentPlaybackDate: String

현재 경과 된 재생 시간과 관련된 날짜입니다.

let MPNowPlayingInfoPropertyElapsedPlaybackTime: String

현재 재생중인 항목의 경과 시간 (초)입니다.

let MPNowPlayingInfoPropertyExternalContentIdentifier: String

앱을 다시 시작하더라도 현재 재생중인 항목을 고유하게 식별하는 불투명 식별자입니다.

let MPNowPlayingInfoPropertyExternalUserProfileIdentifier: String

앱을 다시 시작하더라도 현재 재생중인 항목이 재생되는 프로필을 고유하게 식별하는 불투명 식별자입니다.

let MPNowPlayingInfoPropertyIsLiveStream: String

현재 재생중인 항목이 실시간 스트림인지 여부를 나타냅니다.

let MPNowPlayingInfoPropertyMediaType: String

지금 재생중인 항목의 미디어 유형입니다.

let MPNowPlayingInfoPropertyPlaybackProgress: String

현재 재생중인 항목의 현재 진행률입니다.

let MPNowPlayingInfoPropertyPlaybackQueueCount: String

앱의 재생 대기열에있는 총 항목 수입니다.

let MPNowPlayingInfoPropertyPlaybackQueueIndex: String

앱의 재생 대기열에서 현재 재생중인 항목의 색인입니다.

let MPNowPlayingInfoPropertyPlaybackRate: String

현재 재생중인 항목의 재생 속도이며 값은 정상 재생 속도  나타냅니다.1.0

let MPNowPlayingInfoPropertyServiceIdentifier: String

현재 재생중인 항목과 관련된 서비스 제공 업체입니다.


기능 구현

뭐 사용할 수 있는 건 많다...

 

우선 사용하는 Application이 Remote Control Events를 처리할 수 있도록 하자.

UIApplication.shared.beginReceivingRemoteControlEvents()

 

나는 재생/일시정지/이전, 다음곡 재생/재생 위치 변경 의 기본적인 스트리밍 혹은 음악 재생 앱들이 사용하는 기능들을 썼다.

		//싱글톤 객체 참조 변수 선언
        let center = MPRemoteCommandCenter.shared()
        
		//playButton 음악 재생
        center.playCommand.addTarget { (_) -> MPRemoteCommandHandlerStatus in
            self.playSong()
            return .success
        }
        
        //pauseButton 음악 일시정지
        center.pauseCommand.addTarget { (_) -> MPRemoteCommandHandlerStatus in
            self.pauseSong()
            return .success
        }
        
        //nextTrackButton 다음곡 재생
        center.nextTrackCommand.addTarget { (_) -> MPRemoteCommandHandlerStatus in
            self.playNext()
            return .success
        }
        
        //prevTrackButton 이전곡 재생
        center.previousTrackCommand.addTarget { (_) -> MPRemoteCommandHandlerStatus in
            self.playPrev()
            return .success
        }
        
        //slider 재생 위치 변경
        center.changePlaybackPositionCommand.addTarget { (event) -> MPRemoteCommandHandlerStatus in
            if let positionTime = (event as? MPChangePlaybackPositionCommandEvent)?.positionTime {
                let seekTime = CMTime(value: Int64(positionTime), timescale: 1)
                self.player.seek(to: seekTime)
            }

            return .success
        }

해당 그림처럼 내가 사용하고자 했던 Command들은 활성화가 된다.

 


UI

그럼 이제 어떤 곡이 재생 중인지 보여야겠다

func updateRemoteCommandInfoCenter() {
        let center = MPNowPlayingInfoCenter.default()
        var nowPlayingInfo = center.nowPlayingInfo ?? [String: Any]()
           
		DispatchQueue.main.async {
          nowPlayingInfo[MPMediaItemPropertyArtwork] = MPMediaItemArtwork(boundsSize: nowPlayingImage.size, requestHandler: { (_) -> UIImage in
          	nowPlayingImage
          })
          //
          nowPlayingInfo[MPMediaItemPropertyTitle] = nowPlayingMusic.songName
          nowPlayingInfo[MPMediaItemPropertyArtist] = nowPlayingMusic.artistName
          nowPlayingInfo[MPMediaItemPropertyPlaybackDuration] = self.player.currentItem?.asset.duration.seconds
          nowPlayingInfo[MPNowPlayingInfoPropertyPlaybackRate] = self.player.rate
          nowPlayingInfo[MPNowPlayingInfoPropertyElapsedPlaybackTime] = self.player.currentTime().seconds
          
          //적용한 nowPlayingInfo를 center에 적용
          center.nowPlayingInfo = nowPlayingInfo
        }
}

이미지 사이즈가 맞지 않아 화질이 깨지긴하지만, 쨋든 UI까지 적용했다.

+ Recent posts