우선 백그라운드 미디어 재생까지는 구현된 것으로 가정
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까지 적용했다.
'iOS' 카테고리의 다른 글
[iOS] TabBar Slide Down/Up Animation (0) | 2021.03.25 |
---|---|
[iOS] Animation - 2 (feat. Frame-Based Layout vs AutoLayout) (0) | 2021.03.25 |
[iOS] Background Audio AVPlayer (0) | 2021.03.22 |
[iOS] UITableView 선택/삽입/삭제/이동 (0) | 2021.03.18 |
[iOS] Animation - 1 (0) | 2021.03.17 |