관찰 상태 / 이벤트

컨트롤러는 SwiftUI 바인딩용 @Published 상태와, 웹 onEvent 에 대응하는 Combine 이벤트 퍼블리셔를 제공합니다.

@Published 관찰 상태

// 재생 상태
isPlaying: Bool          currentTime: TimeInterval    duration: TimeInterval
isReady: Bool            isLive: Bool                 hasEnded: Bool
isFullscreen: Bool       isPipActive: Bool            isModalPresented: Bool
playbackRate: Float      maxResolution: CGSize        isCaptureBlocked: Bool

// 재생목록
currentItem: PlaylistItem?    playlist: [PlaylistItem]    playIndex: Int

// 자막
availableSubtitles: [SubtitleTrack]    activeSubtitleID: String?
currentSubtitleText: String

// 라이선스 / 에러
lastError: PlayerError?       licenseError: VPELicenseError?
isLicenseValidated: Bool

avPlayer: AVPlayer 로 원시 AVPlayer 에 직접 접근할 수도 있습니다.

Combine 이벤트 구독

events: AnyPublisher<PlayerEvent, Never> 로 이벤트를 구독합니다.

import Combine

var cancellables = Set<AnyCancellable>()

player.events
    .sink { event in
        switch event.type {
        case .ready:   print("준비 완료")
        case .play:    print("재생 시작")
        case .ended:   print("재생 종료")
        case .error:   print("오류:", event.data ?? [:])
        default:       break
        }
    }
    .store(in: &cancellables)

이벤트 타입

이벤트 타입은 웹 PlayerEvent 스키마와 동일한 의미를 가집니다.

stateChange · ready · play · pause · ended
fullscreen · fullscreenExit · loadingStart · loadingEnd
bufferingStart · bufferingEnd · seeking · seeked · waiting
volumechange · timeupdate · controlbarActive · controlbarDeactive
next · prev · skipForward · skipBack · playlistChange · error

iOS 전용 이벤트

HLS 매니페스트 내장 자막(EXT-X-MEDIA)이 자동 로드되면 .embeddedSubtitlesAvailable([SubtitleTrack]) 이벤트가 발생합니다. 각 트랙은 kind == .embedded, embeddedOptionID 를 가집니다. 자세한 내용은 자막 페이지를 참고하세요.

player.events
    .sink { event in
        if case let .embeddedSubtitlesAvailable(tracks) = event {
            print("내장 자막", tracks.map(\.label))
        }
    }
    .store(in: &cancellables)
iOS SDKBeta