뮤직플레이어앱을 개발하면서 제어센터를 사용하기 위해 코드를 짰지만 webview에서 동영상을 재생하는 방식인 우리 앱에선 동작하지 않아 버리기엔 아까워 코드를 공유하고자 남깁니다.
// 제어센터 초기세팅
import MediaPlayer
func MPNowPlayingInfoCenterSetting() {
// 제어 센터 이벤트 수신 시작
// Info.plist에
// UIBackgroundModes : audio 또는
// Required background modes : App plays audio or streams audio/video using AirPlay 해주어야 합니다.
UIApplication.shared.beginReceivingRemoteControlEvents()
let center = MPRemoteCommandCenter.shared()
center.skipForwardCommand.isEnabled = true
center.skipBackwardCommand.isEnabled = true
center.playCommand.addTarget { [weak self] _ in
self?.play()
return .success
}
center.pauseCommand.addTarget { [weak self] _ in
self?.pause()
return .success
}
center.skipForwardCommand.addTarget { [weak self] _ in
self?.forward()
return .success
}
center.skipBackwardCommand.addTarget { [weak self] _ in
self?.backward()
return .success
}
}
// 제어센터 갱신
import MediaPlayer
import Kingfisher
func updateMPNowPlayingInfoCenter(song: SongEntity, progress: PlayProgress) {
var nowPlayingInfo = center.nowPlayingInfo ?? [String: Any]()
nowPlayingInfo[MPMediaItemPropertyTitle] = song.title
nowPlayingInfo[MPMediaItemPropertyArtist] = song.artist
let thumbnailURLString = "thumbnail.com/thumbnail_1"
let placeholderImage = UIImage(named: "placeholder")
if let thumbnailURL = URL(string: thumbnailURLString) {
let resource = ImageResource(downloadURL: thumbnailURL)
KingfisherManager.shared.retrieveImage(with: resource) { result in
switch result {
case .success(let imageResult):
let artwork = MPMediaItemArtwork(boundsSize: imageResult.image.size) { size in
return imageResult.image
}
case .failure(let error):
DEBUG_LOG("이미지를 불러오는데 실패했습니다. Error: \(error)")
nowPlayingInfo[MPMediaItemPropertyArtwork] = placeholderImage
}
}
} else {
nowPlayingInfo[MPMediaItemPropertyArtwork] = placeholderImage
}
// 재생 중이면 1.0, 일시정지 등 재생 중이 아닐 때는 0.0
nowPlayingInfo[MPNowPlayingInfoPropertyPlaybackRate] = self.state == .playing ? 1.0 : 0.0
// 현재재생시간 (초를 정수형태로)
nowPlayingInfo[MPNowPlayingInfoPropertyElapsedPlaybackTime] = Int(progress.currentProgress)
// 총 길이 (초를 정수형태로)
nowPlayingInfo[MPMediaItemPropertyPlaybackDuration] = Int(progress.endProgress)
center.nowPlayingInfo = nowPlayingInfo
}
'iOS' 카테고리의 다른 글
XCode15+ Image Color Assets 관리 방법의 변화 (0) | 2024.03.05 |
---|---|
XCode Archive 시 has no member Error 발생 (0) | 2024.03.04 |
UITableView 로 가사 기능(트래킹, 하이라이팅, 탐색) 개발 기록 (0) | 2023.04.21 |
Tuist Project 'Could not build Objective-C module' 오류 해결법 (0) | 2023.01.12 |
[SwiftUI] 사라질 때 transition이 적용안되는 경우 (SwiftUI removal transition not animated) (0) | 2022.11.29 |