Embed and control YouTube videos in your iOS applications! Neato, right? Let's see how it works.
WKWebView breaking changes
Add this to your Cartfile:
…and then run
Don't forget to:
Link binary with librariesbuild phase
YouTubePlayer.frameworkas an input file to the
carthage copy-frameworksrun script phase (only necesasry if you're building for iOS)
See Carthage for more information about using Carthage as a dependency manager.
Ensure you are opting into using frameworks with
use_frameworks!. Then add the following to your Podfile:
…and then run
// Import Swift module import YouTubePlayer
Build and lay out the view however you wish, whether in IB w/ an outlet or programmatically.
@IBOutlet var videoPlayer: YouTubePlayerView!
// init YouTubePlayerView w/ playerFrame rect (assume playerFrame declared) var videoPlayer = YouTubePlayerView(frame: playerFrame)
Give the player a video to load, whether from ID or URL.
// Load video from YouTube ID videoPlayer.loadVideoID("nfWlot6h_JM")
// Load video from YouTube URL let myVideoURL = NSURL(string: "https://www.youtube.com/watch?v=wQg3bXrVLtg") videoPlayer.loadVideoURL(myVideoURL!)
YouTubePlayerView has methods for controlling the player (play, pause, seek, change video, etc.) They are:
func loadVideoURL(videoURL: NSURL)
func loadVideoID(videoID: String)
func loadPlaylistID(playlistID: String)
func seekTo(seconds: Float, seekAhead: Bool)
func getCurrentTime(completion: ((Double?) -> Void)?)
func getDuration(completion: ((Double?) -> Void)?))
loadVideoURL(videoURL: NSURL) or
loadVideoID(videoID: String). You can check the readiness of the player at any time by checking its
ready: Bool property. These functions run asynchronously, so it is not guaranteed that a call to a play function will be safe if it immediately follows a call to a load function. I plan to update the library soon to add completion handlers to be called when the player is ready.
In the meantime, you can also the
playerReady(videoPlayer: YouTubePlayerView) to ensure code is executed immediately when the player becomes ready.
Responding to events
YouTube's iFrame player emits certain events based on the lifecycle of the player. The
YouTubePlayerDelegate outlines these methods that get called during a player's lifecycle. They are:
func playerReady(videoPlayer: YouTubePlayerView)
func playerStateChanged(videoPlayer: YouTubePlayerView, playerState: YouTubePlayerState)
func playerQualityChanged(videoPlayer: YouTubePlayerView, playbackQuality: YouTubePlaybackQuality)
Side note: All these delegate methods are optional which means that you can implement none, all, or some of them in your delegate class.
UIWebView (deprecated) to
WKWebView required changing
player calls which return values to be asynchronous. If you upgrade to 0.7.0,
you will need to replace any call to either
getDuration() with its asynchronous equivalent, documented