SwiftUI YouTube Player for iOS and MacOS

Fully functional, SwiftUI-ready YouTube player for iOS 14+ and MacOS 11+. Actions and state are both delivered via SwiftUI @Bindings, meaking it dead-easy to integrate into any existing SwiftUI View.

Preview iOS


This component is distributed as a Swift package. Just add this repo’s URL to XCode:


How to use

  • Pass the config parameter to optionally set various player properties:
    • playInline
    • allowsControls
    • showInfo
  • The action binding is used to control the player – whichever action you want it to perform, just set the variable’s value to it. Available actions:
    • idle – does nothing and can be used as the default value.
    • load(URLRequest) – loads the video from the provided URL.
    • loadID(String) – loads the video based on its YouTube ID.
    • loadPlaylistId(String) – loads a playlist based on its YouTube ID.
    • mute
    • unmute
    • play
    • pause
    • stop
    • clear
    • seek(Float, Bool – seeks the given position in the video.
    • duration – evaluates the video’s duration and updates the state.
    • currentTime – evaluates the current play time and updates the state.
    • previous
    • next
  • The state binding reports back the current state of the player. Available data:
    • readytrue if the player is ready to play a video.
    • statusunstarted, ended, playing, paused, buffering, queued
    • qualitysmall, medium, large, hd720, hd1080, highResolution
    • duration – will be set after the duration action is invoked.
    • currentTime – will be set after the currentTime action is invoked.
    • error – set if an error ocurred while playing the video, nil otherwise.

Sample code

import SwiftUIYouTubePlayer

struct YouTubeTest: View {
    @State private var action = YouTubePlayerAction.idle
    @State private var state = YouTubePlayerState.empty
    private var buttonText: String {
        switch state.status {
        case .playing:
            return "Pause"
        case .unstarted,  .ended, .paused:
            return "Play"
        case .buffering, .queued:
            return "Wait"
    private var infoText: String {
        "Q: \(state.quality)"
    var body: some View {
        VStack {
            HStack {
                Button("Load") {
                    action = .loadID("v1PBptSDIh8")
                Button(buttonText) {
                    if state.status != .playing {
                        action = .play
                    } else {
                        action = .pause
                Button("Prev") {
                    action = .previous
                Button("Next") {
                    action = .next
            YouTubePlayer(action: $action, state: $state)


For a more detailed description of the code, visit this recipe. Check out SwiftUIRecipes.com for more SwiftUI recipes!



  • 1.0.0 – Initial release.