skip to Main Content

How can I detect when someone cancels AVPlayer?

Here’s my code to show the video. How can I detect when someone exits the video screen?

// Create a new AVPlayerViewController and pass it a reference to the player.
let controller = AVPlayerViewController()
controller.player = player

NotificationCenter.default.addObserver(self, selector: #selector(videoDidEnded), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: player.currentItem)

NotificationCenter.default.addObserver(self, selector: #selector(videoDidCancel), name: NSNotification.Name.kAVPlayerViewControllerDismissingNotification, object: player.currentItem)

// Modally present the player and call the player's play() method when complete.
present(controller, animated: true) {
    Amplitude.instance().logEvent("ac_content_video_start", withEventProperties: [
        "Name": self.book.title,
        "Length": 10,
        "No_upvotes": self.book.starCount,
        "Category": self.book.categories as Any
    ])
    player.play()
}

2

Answers


  1. Unfortunately that is not possible and there is no such event.

    What you could do is to associate a UITapGestureRecognizer with the view of the AVPlayerViewController where you can capture the stop/pause/cancel events of your AVPlayerViewController. Then in your selector you can handle the pause/stop/cancel.

    Login or Signup to reply.
  2. There is no specific delegate or notification that I know of, however I could offer this workaround.

    1. Conformance to the UIViewControllerTransitioningDelegate

    Make the UIViewController that presents the AVPlayerViewController conform to the transitioning delegate

    class YourVC: UIViewController, UIViewControllerTransitioningDelegate
    

    2. Add a var to keep track of video status

    // Again, in the VC that presents the AVPlayerViewController
    var hasMovieFinished = false
    

    3. AVPlayerController SetUp

    Make the view controller presenting the AVPlayerController the transitioningDelegate of the AVPlayerController

    let controller = AVPlayerViewController()
    
    // Add this
    controller.transitioningDelegate = self
    
    controller.player = player
    

    4. Add this to your movie finish notification handler

    This way you know, the movie finished

    @objc
    func videoDidEnded() {
        print("Video finished")
        hasMovieFinished = true
        
        // up to you if you dismiss the controller or not
        dismiss(animated: true) {
            // do what you want
        }
    }
    

    5. Finally, implement the transition delegate function

    // MARK: UIViewControllerTransitioningDelegate
    // Gets called when a modal was dismissed
    func animationController(forDismissed dismissed: UIViewController)
    -> UIViewControllerAnimatedTransitioning?
    {
        // The dismissal was before the movie ended
        if !hasMovieFinished
        {
            print("Movie was cancelled")
            // DO WHAT YOU WANT, MOVIE WAS CANCELLED
        }
        
        return nil
    }
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search