6

I'm attempting to enable AirPlay with my AVPlayerViewController. In the document:

https://developer.apple.com/reference/avkit/avplayerviewcontroller

It states

AVPlayerViewController automatically supports AirPlay, but you need to perform some project and audio session configuration before it can be enabled in your application.

Under the Capabilities tab, I did enable the Background Mode for Audio, AirPlay, and Picture in Picture. I have created the AVPlayerViewController as follows:

// Create the view controller and player
let moviePlayerViewController: AVPlayerViewController = AVPlayerViewController()
let moviePlayer = AVPlayer(url: videoUrl!)

moviePlayer.allowsExternalPlayback = true
moviePlayer.usesExternalPlaybackWhileExternalScreenIsActive = true

// Initialize the AVPlayer
moviePlayerViewController.player = moviePlayer

// Present movie player and play when completion
self.present(moviePlayerViewController, animated: false, completion: {
    moviePlayerViewController.player?.play()
})

I thought the two lines

moviePlayer.allowsExternalPlayback = true
moviePlayer.usesExternalPlaybackWhileExternalScreenIsActive = true

Would add the AirPlay support but I'm wrong. I have read that AirPlay can be used by adding MPVolumeView, but that's for a custom video controller, not the built in one. Any help would be greatly appreciated.

clemens
  • 16,716
  • 11
  • 50
  • 65
Mike Walker
  • 2,944
  • 8
  • 30
  • 62

2 Answers2

3

You should still be able to use MPVolumeView. Just use the following:

    let volumeView = MPVolumeView()
    self.view.addSubview(volumeView)

or if you just want the menu to show up, you can use:

    let volumeView = MPVolumeView(frame: CGRect(x: -100, y: 0, width: 0, height: 0))
    self.addSubview(volumeView)
    for view: UIView in volumeView.subviews {
        if let button = view as? UIButton {
            button.sendActions(for: .touchUpInside)
            volumeView.removeFromSuperview()
            break
        }
    }

This will put it outside of the current view and then trigger the action that displays the air play menu.

zoecarver
  • 5,523
  • 2
  • 26
  • 56
  • My plan is to share iPhone screen to any TV (Apple or samsung means airPlay supported devices). How i can implement this ? – Jamshed Alam Aug 06 '20 at 06:50
1

Nowadays you should have no problem doing this.

(1) Under the Capabilities tab, enable Background Mode for Audio

(2) With your

var ezPlayer: AVPlayerViewController!

just

    ezPlayer.showsPlaybackControls = true
    ezPlayer.player = AVPlayer(url: ... )

    ezPlayer.player!.allowsExternalPlayback = true
    ezPlayer.player!.usesExternalPlaybackWhileExternalScreenIsActive = 

and you should be fine. Build to a device. Assuming you are on a usable wifi network with an apple TV, apple laptops, the airplay icon will appear and work.

There's no need to use an MPVolumeView these days.

Fattie
  • 27,874
  • 70
  • 431
  • 719