잠금화면 플레이어 재생시간 동기화
This commit is contained in:
parent
c77d186ceb
commit
f909de3bfc
|
@ -1,226 +1,226 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
<plist version="1.0">
|
<plist version="1.0">
|
||||||
<dict>
|
<dict>
|
||||||
<key>FirebaseAppDelegateProxyEnabled</key>
|
<key>FirebaseAppDelegateProxyEnabled</key>
|
||||||
<false/>
|
<false/>
|
||||||
<key>NSAppTransportSecurity</key>
|
<key>GADApplicationIdentifier</key>
|
||||||
<dict>
|
<string>ca-app-pub-1299501215847962~3447556960</string>
|
||||||
<key>NSAllowsArbitraryLoads</key>
|
<key>NSAppTransportSecurity</key>
|
||||||
<true/>
|
<dict>
|
||||||
</dict>
|
<key>NSAllowsArbitraryLoads</key>
|
||||||
<key>UIAppFonts</key>
|
<true/>
|
||||||
<array>
|
</dict>
|
||||||
<string>gmarket_sans_bold.otf</string>
|
<key>SKAdNetworkItems</key>
|
||||||
<string>gmarket_sans_medium.otf</string>
|
<array>
|
||||||
<string>gmarket_sans_light.otf</string>
|
<dict>
|
||||||
</array>
|
<key>SKAdNetworkIdentifier</key>
|
||||||
<key>UIBackgroundModes</key>
|
<string>cstr6suwn9.skadnetwork</string>
|
||||||
<array>
|
</dict>
|
||||||
<string>audio</string>
|
<dict>
|
||||||
<string>fetch</string>
|
<key>SKAdNetworkIdentifier</key>
|
||||||
<string>remote-notification</string>
|
<string>4fzdc2evr5.skadnetwork</string>
|
||||||
</array>
|
</dict>
|
||||||
<key>GADApplicationIdentifier</key>
|
<dict>
|
||||||
<string>ca-app-pub-1299501215847962~3447556960</string>
|
<key>SKAdNetworkIdentifier</key>
|
||||||
<key>SKAdNetworkItems</key>
|
<string>4pfyvq9l8r.skadnetwork</string>
|
||||||
<array>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>SKAdNetworkIdentifier</key>
|
<key>SKAdNetworkIdentifier</key>
|
||||||
<string>cstr6suwn9.skadnetwork</string>
|
<string>2fnua5tdw4.skadnetwork</string>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>SKAdNetworkIdentifier</key>
|
<key>SKAdNetworkIdentifier</key>
|
||||||
<string>4fzdc2evr5.skadnetwork</string>
|
<string>ydx93a7ass.skadnetwork</string>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>SKAdNetworkIdentifier</key>
|
<key>SKAdNetworkIdentifier</key>
|
||||||
<string>4pfyvq9l8r.skadnetwork</string>
|
<string>5a6flpkh64.skadnetwork</string>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>SKAdNetworkIdentifier</key>
|
<key>SKAdNetworkIdentifier</key>
|
||||||
<string>2fnua5tdw4.skadnetwork</string>
|
<string>p78axxw29g.skadnetwork</string>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>SKAdNetworkIdentifier</key>
|
<key>SKAdNetworkIdentifier</key>
|
||||||
<string>ydx93a7ass.skadnetwork</string>
|
<string>v72qych5uu.skadnetwork</string>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>SKAdNetworkIdentifier</key>
|
<key>SKAdNetworkIdentifier</key>
|
||||||
<string>5a6flpkh64.skadnetwork</string>
|
<string>ludvb6z3bs.skadnetwork</string>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>SKAdNetworkIdentifier</key>
|
<key>SKAdNetworkIdentifier</key>
|
||||||
<string>p78axxw29g.skadnetwork</string>
|
<string>cp8zw746q7.skadnetwork</string>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>SKAdNetworkIdentifier</key>
|
<key>SKAdNetworkIdentifier</key>
|
||||||
<string>v72qych5uu.skadnetwork</string>
|
<string>3sh42y64q3.skadnetwork</string>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>SKAdNetworkIdentifier</key>
|
<key>SKAdNetworkIdentifier</key>
|
||||||
<string>ludvb6z3bs.skadnetwork</string>
|
<string>c6k4g5qg8m.skadnetwork</string>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>SKAdNetworkIdentifier</key>
|
<key>SKAdNetworkIdentifier</key>
|
||||||
<string>cp8zw746q7.skadnetwork</string>
|
<string>s39g8k73mm.skadnetwork</string>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>SKAdNetworkIdentifier</key>
|
<key>SKAdNetworkIdentifier</key>
|
||||||
<string>3sh42y64q3.skadnetwork</string>
|
<string>3qy4746246.skadnetwork</string>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>SKAdNetworkIdentifier</key>
|
<key>SKAdNetworkIdentifier</key>
|
||||||
<string>c6k4g5qg8m.skadnetwork</string>
|
<string>f38h382jlk.skadnetwork</string>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>SKAdNetworkIdentifier</key>
|
<key>SKAdNetworkIdentifier</key>
|
||||||
<string>s39g8k73mm.skadnetwork</string>
|
<string>hs6bdukanm.skadnetwork</string>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>SKAdNetworkIdentifier</key>
|
<key>SKAdNetworkIdentifier</key>
|
||||||
<string>3qy4746246.skadnetwork</string>
|
<string>v4nxqhlyqp.skadnetwork</string>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>SKAdNetworkIdentifier</key>
|
<key>SKAdNetworkIdentifier</key>
|
||||||
<string>f38h382jlk.skadnetwork</string>
|
<string>wzmmz9fp6w.skadnetwork</string>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>SKAdNetworkIdentifier</key>
|
<key>SKAdNetworkIdentifier</key>
|
||||||
<string>hs6bdukanm.skadnetwork</string>
|
<string>yclnxrl5pm.skadnetwork</string>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>SKAdNetworkIdentifier</key>
|
<key>SKAdNetworkIdentifier</key>
|
||||||
<string>v4nxqhlyqp.skadnetwork</string>
|
<string>t38b2kh725.skadnetwork</string>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>SKAdNetworkIdentifier</key>
|
<key>SKAdNetworkIdentifier</key>
|
||||||
<string>wzmmz9fp6w.skadnetwork</string>
|
<string>7ug5zh24hu.skadnetwork</string>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>SKAdNetworkIdentifier</key>
|
<key>SKAdNetworkIdentifier</key>
|
||||||
<string>yclnxrl5pm.skadnetwork</string>
|
<string>gta9lk7p23.skadnetwork</string>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>SKAdNetworkIdentifier</key>
|
<key>SKAdNetworkIdentifier</key>
|
||||||
<string>t38b2kh725.skadnetwork</string>
|
<string>vutu7akeur.skadnetwork</string>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>SKAdNetworkIdentifier</key>
|
<key>SKAdNetworkIdentifier</key>
|
||||||
<string>7ug5zh24hu.skadnetwork</string>
|
<string>y5ghdn5j9k.skadnetwork</string>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>SKAdNetworkIdentifier</key>
|
<key>SKAdNetworkIdentifier</key>
|
||||||
<string>gta9lk7p23.skadnetwork</string>
|
<string>n6fk4nfna4.skadnetwork</string>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>SKAdNetworkIdentifier</key>
|
<key>SKAdNetworkIdentifier</key>
|
||||||
<string>vutu7akeur.skadnetwork</string>
|
<string>v9wttpbfk9.skadnetwork</string>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>SKAdNetworkIdentifier</key>
|
<key>SKAdNetworkIdentifier</key>
|
||||||
<string>y5ghdn5j9k.skadnetwork</string>
|
<string>n38lu8286q.skadnetwork</string>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>SKAdNetworkIdentifier</key>
|
<key>SKAdNetworkIdentifier</key>
|
||||||
<string>n6fk4nfna4.skadnetwork</string>
|
<string>47vhws6wlr.skadnetwork</string>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>SKAdNetworkIdentifier</key>
|
<key>SKAdNetworkIdentifier</key>
|
||||||
<string>v9wttpbfk9.skadnetwork</string>
|
<string>kbd757ywx3.skadnetwork</string>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>SKAdNetworkIdentifier</key>
|
<key>SKAdNetworkIdentifier</key>
|
||||||
<string>n38lu8286q.skadnetwork</string>
|
<string>9t245vhmpl.skadnetwork</string>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>SKAdNetworkIdentifier</key>
|
<key>SKAdNetworkIdentifier</key>
|
||||||
<string>47vhws6wlr.skadnetwork</string>
|
<string>eh6m2bh4zr.skadnetwork</string>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>SKAdNetworkIdentifier</key>
|
<key>SKAdNetworkIdentifier</key>
|
||||||
<string>kbd757ywx3.skadnetwork</string>
|
<string>a2p9lx4jpn.skadnetwork</string>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>SKAdNetworkIdentifier</key>
|
<key>SKAdNetworkIdentifier</key>
|
||||||
<string>9t245vhmpl.skadnetwork</string>
|
<string>22mmun2rn5.skadnetwork</string>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>SKAdNetworkIdentifier</key>
|
<key>SKAdNetworkIdentifier</key>
|
||||||
<string>eh6m2bh4zr.skadnetwork</string>
|
<string>4468km3ulz.skadnetwork</string>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>SKAdNetworkIdentifier</key>
|
<key>SKAdNetworkIdentifier</key>
|
||||||
<string>a2p9lx4jpn.skadnetwork</string>
|
<string>2u9pt9hc89.skadnetwork</string>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>SKAdNetworkIdentifier</key>
|
<key>SKAdNetworkIdentifier</key>
|
||||||
<string>22mmun2rn5.skadnetwork</string>
|
<string>8s468mfl3y.skadnetwork</string>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>SKAdNetworkIdentifier</key>
|
<key>SKAdNetworkIdentifier</key>
|
||||||
<string>4468km3ulz.skadnetwork</string>
|
<string>klf5c3l5u5.skadnetwork</string>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>SKAdNetworkIdentifier</key>
|
<key>SKAdNetworkIdentifier</key>
|
||||||
<string>2u9pt9hc89.skadnetwork</string>
|
<string>ppxm28t8ap.skadnetwork</string>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>SKAdNetworkIdentifier</key>
|
<key>SKAdNetworkIdentifier</key>
|
||||||
<string>8s468mfl3y.skadnetwork</string>
|
<string>ecpz2srf59.skadnetwork</string>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>SKAdNetworkIdentifier</key>
|
<key>SKAdNetworkIdentifier</key>
|
||||||
<string>klf5c3l5u5.skadnetwork</string>
|
<string>uw77j35x4d.skadnetwork</string>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>SKAdNetworkIdentifier</key>
|
<key>SKAdNetworkIdentifier</key>
|
||||||
<string>ppxm28t8ap.skadnetwork</string>
|
<string>pwa73g5rt2.skadnetwork</string>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>SKAdNetworkIdentifier</key>
|
<key>SKAdNetworkIdentifier</key>
|
||||||
<string>ecpz2srf59.skadnetwork</string>
|
<string>mlmmfzh3r3.skadnetwork</string>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>SKAdNetworkIdentifier</key>
|
<key>SKAdNetworkIdentifier</key>
|
||||||
<string>uw77j35x4d.skadnetwork</string>
|
<string>578prtvx9j.skadnetwork</string>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>SKAdNetworkIdentifier</key>
|
<key>SKAdNetworkIdentifier</key>
|
||||||
<string>pwa73g5rt2.skadnetwork</string>
|
<string>4dzt52r2t5.skadnetwork</string>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>SKAdNetworkIdentifier</key>
|
<key>SKAdNetworkIdentifier</key>
|
||||||
<string>mlmmfzh3r3.skadnetwork</string>
|
<string>e5fvkxwrpn.skadnetwork</string>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>SKAdNetworkIdentifier</key>
|
<key>SKAdNetworkIdentifier</key>
|
||||||
<string>578prtvx9j.skadnetwork</string>
|
<string>8c4e2ghe7u.skadnetwork</string>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>SKAdNetworkIdentifier</key>
|
<key>SKAdNetworkIdentifier</key>
|
||||||
<string>4dzt52r2t5.skadnetwork</string>
|
<string>zq492l623r.skadnetwork</string>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>SKAdNetworkIdentifier</key>
|
<key>SKAdNetworkIdentifier</key>
|
||||||
<string>e5fvkxwrpn.skadnetwork</string>
|
<string>3rd42ekr43.skadnetwork</string>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>SKAdNetworkIdentifier</key>
|
<key>SKAdNetworkIdentifier</key>
|
||||||
<string>8c4e2ghe7u.skadnetwork</string>
|
<string>3qcr597p9d.skadnetwork</string>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
</array>
|
||||||
<key>SKAdNetworkIdentifier</key>
|
<key>UIAppFonts</key>
|
||||||
<string>zq492l623r.skadnetwork</string>
|
<array>
|
||||||
</dict>
|
<string>gmarket_sans_bold.otf</string>
|
||||||
<dict>
|
<string>gmarket_sans_medium.otf</string>
|
||||||
<key>SKAdNetworkIdentifier</key>
|
<string>gmarket_sans_light.otf</string>
|
||||||
<string>3rd42ekr43.skadnetwork</string>
|
</array>
|
||||||
</dict>
|
<key>UIBackgroundModes</key>
|
||||||
<dict>
|
<array>
|
||||||
<key>SKAdNetworkIdentifier</key>
|
<string>audio</string>
|
||||||
<string>3qcr597p9d.skadnetwork</string>
|
<string>fetch</string>
|
||||||
</dict>
|
<string>remote-notification</string>
|
||||||
</array>
|
</array>
|
||||||
</dict>
|
</dict>
|
||||||
</plist>
|
</plist>
|
||||||
|
|
|
@ -46,11 +46,21 @@ final class ContentPlayerPlayManager: NSObject, ObservableObject {
|
||||||
|
|
||||||
override init() {
|
override init() {
|
||||||
self.player = AVPlayer()
|
self.player = AVPlayer()
|
||||||
|
|
||||||
|
do {
|
||||||
|
let audioSession = AVAudioSession.sharedInstance()
|
||||||
|
try audioSession.setCategory(.playback, mode: .moviePlayback)
|
||||||
|
try audioSession.setActive(true)
|
||||||
|
} catch {
|
||||||
|
DEBUG_LOG("Audio Session 설정 실패: \(error.localizedDescription)")
|
||||||
|
}
|
||||||
|
|
||||||
super.init()
|
super.init()
|
||||||
}
|
}
|
||||||
|
|
||||||
func setPlaylist(playlist: [AudioContentPlaylistContent]) {
|
func setPlaylist(playlist: [AudioContentPlaylistContent]) {
|
||||||
resetPlayer()
|
resetPlayer()
|
||||||
|
self.registerRemoteControlEvents()
|
||||||
self.playlist = playlist
|
self.playlist = playlist
|
||||||
playlistManager = AudioContentPlaylistManager(playlist: playlist)
|
playlistManager = AudioContentPlaylistManager(playlist: playlist)
|
||||||
playNextContent()
|
playNextContent()
|
||||||
|
@ -70,7 +80,6 @@ final class ContentPlayerPlayManager: NSObject, ObservableObject {
|
||||||
.sink { [weak self] currentTime in
|
.sink { [weak self] currentTime in
|
||||||
if !(self?.isEditing ?? false) {
|
if !(self?.isEditing ?? false) {
|
||||||
self?.currentTime = CMTimeGetSeconds(currentTime)
|
self?.currentTime = CMTimeGetSeconds(currentTime)
|
||||||
MPNowPlayingInfoCenter.default().nowPlayingInfo?[MPNowPlayingInfoPropertyElapsedPlaybackTime] = self?.currentTime
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.store(in: &cancellables)
|
.store(in: &cancellables)
|
||||||
|
@ -110,16 +119,7 @@ final class ContentPlayerPlayManager: NSObject, ObservableObject {
|
||||||
}
|
}
|
||||||
.store(in: &cancellables)
|
.store(in: &cancellables)
|
||||||
|
|
||||||
do {
|
self.fetchAlbumArtAndUpdateNowPlayingInfo()
|
||||||
let audioSession = AVAudioSession.sharedInstance()
|
|
||||||
try audioSession.setCategory(.playback, mode: .moviePlayback)
|
|
||||||
try audioSession.setActive(true)
|
|
||||||
|
|
||||||
self.fetchAlbumArtAndUpdateNowPlayingInfo()
|
|
||||||
self.registerRemoteControlEvents()
|
|
||||||
} catch {
|
|
||||||
DEBUG_LOG("Audio Session 설정 실패: \(error.localizedDescription)")
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private func checkPlaybackStart(bufferedTime: Double, isLikelyToKeepUp: Bool) {
|
private func checkPlaybackStart(bufferedTime: Double, isLikelyToKeepUp: Bool) {
|
||||||
|
@ -138,6 +138,7 @@ final class ContentPlayerPlayManager: NSObject, ObservableObject {
|
||||||
DEBUG_LOG("재생 중단: 버퍼링 부족 (\(bufferedTime)초)")
|
DEBUG_LOG("재생 중단: 버퍼링 부족 (\(bufferedTime)초)")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
updateNowPlayingInfo()
|
||||||
}
|
}
|
||||||
|
|
||||||
private func handlePlaybackEnded() {
|
private func handlePlaybackEnded() {
|
||||||
|
@ -283,10 +284,24 @@ final class ContentPlayerPlayManager: NSObject, ObservableObject {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func registerNowPlayingInfoCenter(with albumArtImage: UIImage?) {
|
private func updateNowPlayingInfo() {
|
||||||
let center = MPNowPlayingInfoCenter.default()
|
guard var nowPlayingInfo = MPNowPlayingInfoCenter.default().nowPlayingInfo else { return }
|
||||||
var nowPlayingInfo = [String: Any]()
|
|
||||||
|
|
||||||
|
nowPlayingInfo[MPNowPlayingInfoPropertyElapsedPlaybackTime] = player?.currentTime().seconds
|
||||||
|
nowPlayingInfo[MPNowPlayingInfoPropertyPlaybackRate] = isPlaying ? 1.0 : 0.0
|
||||||
|
|
||||||
|
let duration = CMTimeGetSeconds(player?.currentItem?.duration ?? CMTime.zero)
|
||||||
|
if duration.isFinite {
|
||||||
|
nowPlayingInfo[MPMediaItemPropertyPlaybackDuration] = duration
|
||||||
|
}
|
||||||
|
|
||||||
|
MPNowPlayingInfoCenter.default().nowPlayingInfo = nowPlayingInfo
|
||||||
|
}
|
||||||
|
|
||||||
|
private func registerNowPlayingInfoCenter(with albumArtImage: UIImage?) {
|
||||||
|
guard let currentItem = player?.currentItem else { return }
|
||||||
|
|
||||||
|
var nowPlayingInfo = [String: Any]()
|
||||||
nowPlayingInfo[MPMediaItemPropertyTitle] = title
|
nowPlayingInfo[MPMediaItemPropertyTitle] = title
|
||||||
nowPlayingInfo[MPMediaItemPropertyArtist] = nickname
|
nowPlayingInfo[MPMediaItemPropertyArtist] = nickname
|
||||||
|
|
||||||
|
@ -296,33 +311,51 @@ final class ContentPlayerPlayManager: NSObject, ObservableObject {
|
||||||
}
|
}
|
||||||
|
|
||||||
if let player = player {
|
if let player = player {
|
||||||
nowPlayingInfo[MPMediaItemPropertyPlaybackDuration] = player.currentItem?.duration.seconds
|
|
||||||
nowPlayingInfo[MPNowPlayingInfoPropertyPlaybackRate] = player.rate
|
nowPlayingInfo[MPNowPlayingInfoPropertyPlaybackRate] = player.rate
|
||||||
|
nowPlayingInfo[MPNowPlayingInfoPropertyElapsedPlaybackTime] = player.currentTime().seconds
|
||||||
|
|
||||||
|
// CMTimeGetSeconds를 사용해 duration을 가져옴
|
||||||
|
let duration = CMTimeGetSeconds(currentItem.duration)
|
||||||
|
if duration.isFinite {
|
||||||
|
nowPlayingInfo[MPMediaItemPropertyPlaybackDuration] = duration
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
center.nowPlayingInfo = nowPlayingInfo
|
MPNowPlayingInfoCenter.default().nowPlayingInfo = nowPlayingInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
private func registerRemoteControlEvents() {
|
private func registerRemoteControlEvents() {
|
||||||
let center = MPRemoteCommandCenter.shared()
|
let center = MPRemoteCommandCenter.shared()
|
||||||
|
|
||||||
center.playCommand.isEnabled = true
|
|
||||||
center.playCommand.addTarget { [unowned self] (commandEvent) -> MPRemoteCommandHandlerStatus in
|
center.playCommand.addTarget { [unowned self] (commandEvent) -> MPRemoteCommandHandlerStatus in
|
||||||
self.playOrPause()
|
self.playOrPause()
|
||||||
return .success
|
return .success
|
||||||
}
|
}
|
||||||
|
|
||||||
center.pauseCommand.isEnabled = true
|
|
||||||
center.pauseCommand.addTarget { [unowned self] (commandEvent) -> MPRemoteCommandHandlerStatus in
|
center.pauseCommand.addTarget { [unowned self] (commandEvent) -> MPRemoteCommandHandlerStatus in
|
||||||
self.playOrPause()
|
self.playOrPause()
|
||||||
return .success
|
return .success
|
||||||
}
|
}
|
||||||
|
|
||||||
|
center.nextTrackCommand.isEnabled = true
|
||||||
|
center.nextTrackCommand.addTarget { [unowned self] (commandEvent) -> MPRemoteCommandHandlerStatus in
|
||||||
|
self.playNextContent()
|
||||||
|
return .success
|
||||||
|
}
|
||||||
|
|
||||||
|
center.previousTrackCommand.isEnabled = true
|
||||||
|
center.previousTrackCommand.addTarget { [unowned self] (commandEvent) -> MPRemoteCommandHandlerStatus in
|
||||||
|
self.playPreviousContent()
|
||||||
|
return .success
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func unRegisterRemoteControlEvents() {
|
private func unRegisterRemoteControlEvents() {
|
||||||
let center = MPRemoteCommandCenter.shared()
|
let center = MPRemoteCommandCenter.shared()
|
||||||
center.playCommand.removeTarget(nil)
|
center.playCommand.removeTarget(nil)
|
||||||
center.pauseCommand.removeTarget(nil)
|
center.pauseCommand.removeTarget(nil)
|
||||||
|
center.nextTrackCommand.removeTarget(nil)
|
||||||
|
center.previousTrackCommand.removeTarget(nil)
|
||||||
UIApplication.shared.endReceivingRemoteControlEvents()
|
UIApplication.shared.endReceivingRemoteControlEvents()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue