SwiftUI YouTube Player for iOS and MacOS
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.
Installation
This component is distributed as a Swift package. Just add this repo’s URL to XCode:
https://github.com/globulus/swiftui-youtube-player
How to use
- Pass the config parameter to optionally set various player properties:
playInlineallowsControlsshowInfo
- 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.muteunmuteplaypausestopclearseek(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.previousnext
- The state binding reports back the current state of the player. Available data:
ready–trueif the player is ready to play a video.status–unstarted, ended, playing, paused, buffering, queuedquality–small, medium, large, hd720, hd1080, highResolutionduration– will be set after thedurationaction is invoked.currentTime– will be set after thecurrentTimeaction is invoked.error– set if an error ocurred while playing the video,nilotherwise.
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
}
}
Text(infoText)
Button("Prev") {
action = .previous
}
Button("Next") {
action = .next
}
}
YouTubePlayer(action: $action, state: $state)
Spacer()
}
}
}
Recipe
For a more detailed description of the code, visit this recipe. Check out SwiftUIRecipes.com for more SwiftUI recipes!
Acknowledgements
- The component internally uses SwiftUI WebView to render YouTube content.
- Most functionality was inspired by the Swift YouTube Player component.
Changelog
- 1.0.0 – Initial release.