# Event Listeners Reference
ByteArk Player delivers events through two channels: Delegate (ByteArkPlayerPlaybackDelegate) for type-safe reception, and Notification (ByteArkPlayerPlaybackEngineNotification) for use inside plugins.
# Option 1 — Delegate
There are two ways to receive delegate callbacks:
Subclass ByteArkPlayerViewController and override callback methods:
class PlayerViewController: ByteArkPlayerViewController {
override func playbackPlay(player: ByteArkPlayer) {
super.playbackPlay(player: player)
// Playback started
}
}
1
2
3
4
5
6
2
3
4
5
6
Or assign delegate on the player instance:
class CustomViewController: UIViewController, ByteArkPlayerPlaybackDelegate {
override func viewDidLoad() {
super.viewDidLoad()
playerViewController.player.delegate = self
}
func playbackPlay(player: ByteArkPlayer) {
// Playback started
}
}
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# Player lifecycle callbacks
| Callback | Description |
|---|---|
playerReady(player:) | Player created and ready |
playerLoadingMetadata(player:) | Started loading metadata |
playerLoadedMetadata(player:) | Finished loading metadata |
playbackReady(player:, item:) | The video is ready to play |
playbackFirstPlay(player:) | The video plays for the first time |
playbackPlay(player:) | Playback starts/resumes |
playbackPause(player:) | Playback paused |
playbackEnded(player:) | Playback finished |
playbackStalled(player:) | Player entered stalled state |
# Buffer & seek callbacks
| Callback | Description |
|---|---|
playbackSeeking(player:) | Seek started |
playbackSeeked(player:) | Seek finished |
playbackBuffering(player:) | Buffering started |
playbackBuffered(player:) | Buffering finished |
# Progress & status callbacks
| Callback | Description |
|---|---|
playbackTimeupdate(player:, time:) | Playback position updated |
playbackError(player:, error:) | An error occurred |
# UI callbacks
| Callback | Description |
|---|---|
playerEnterFullscreen(player:) | Entered fullscreen |
playerExitFullscreen(player:) | Exited fullscreen |
playerEnterPictureInPictureMode(player:) | Entered Picture-in-Picture |
playerExitPictureInPictureMode(player:) | Exited Picture-in-Picture |
# Tracks & playback callbacks
| Callback | Description |
|---|---|
playbackMuted(player:) | Muted |
playbackUnmuted(player:) | Unmuted |
playbackSpeedChanged(player:, speed:) | Playback speed changed |
playbackVolumeChanged(player:, volume:) | Volume changed |
playbackAudioTrackChanged(player:, audioTrack:) | Audio track changed |
playbackSubtitleTrackChanged(player:, subtitleTrack:) | Subtitle track changed |
playbackResolutionChanged(player:, resolution:) | Resolution changed |
playbackPlaylistItemChanged(player:, item:) | Playlist item changed |
# Option 2 — Notification
For use inside plugins or when you prefer a notification-center observer:
let token = player.addPlaybackEngineObserve(
for: ByteArkPlayerPlaybackEngineNotification.play
) { notification in
// Handle event
}
1
2
3
4
5
2
3
4
5
Available cases of ByteArkPlayerPlaybackEngineNotification:
| Notification | Description |
|---|---|
.ready | Player ready |
.loadingMetadata / .loadedMetadata | Metadata loading state |
.firstPlay / .play / .pause / .ended | Playback lifecycle |
.seeking / .seeked | Seek state |
.stalled / .buffering / .buffered | Buffer state |
.timeupdate | Playback position updated |
.error | Error occurred |
.playbackItemReady | Playlist item ready to play |
.enterPictureInPictureMode / .exitPictureInPictureMode | PiP state |
.enablePictureInPictureMode / .disablePictureInPictureMode | PiP enabled/disabled |
.enterFullscreenMode / .exitFullscreenMode | Fullscreen state |
.muted / .unmuted | Mute state |
.playbackSpeedChanged | Speed changed |
.playbackVolumeChanged | Volume changed |
.audioTrackChanged / .subtitleTrackChanged / .resolutionChanged | Tracks/quality changed |
.playlistItemChanged | Playlist item changed |