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 @Binding
s, 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:
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:
ready
-true
if the player is ready to play a video.status
-unstarted, ended, playing, paused, buffering, queued
quality
-small, medium, large, hd720, hd1080, highResolution
duration
- will be set after theduration
action is invoked.currentTime
- will be set after thecurrentTime
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
}
}
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.