Если ваше приложение воспроизводит видео и приостанавливает фоновый звук, как вы получите фоновый звук для возобновления, когда вы закончите? - PullRequest
0 голосов
/ 30 января 2019

У меня есть приложение, где пользователи могут воспроизводить видео в полноэкранном режиме.Это достигается просто с помощью AVPlayerViewController.

Это прекрасно работает, но в обстоятельствах, когда пользователь, скажем, слушает подкаст, если он нажимает на видео для просмотра, он приостанавливает подкаст, так что пользователь может смотреть видео, но когдаЯ закрываю видео, которое, как я ожидаю, возобновит подкаст.Это поведение в большинстве приложений, я подтвердил это, например, в Twitter и Tweetbot.Как ни странно, приведенный ниже код работает для Apple Podcasts (он возобновит возобновление), но не для других, и другие приложения, такие как вышеупомянутый Tweetbot, работают универсально.

Мне совершенно не повезло, получив этоработать сам, однако.

Вещи, которые я пробовал:

  • Просто представить AVPlayerViewController с минимальным количеством необходимого кода: не возобновляется.
  • Вкл viewDidDisappearAVPlayerViewController вызов AVAudioSession.sharedInstance().setActive(false, options: .notifyOthersOnDeactivation): не возобновляется и выдает ошибку «игрок занят».
  • Хорошо, давайте попробуем остановить игрока вручную с помощью player?.pause() в viewDidDisappear: hasn 't возобновляет, все еще выдает ошибку «игрок занят».
  • Хмм, может быть, дать ему секунду?Попробуйте позвонить setActive через DispatchQueue.main.asyncAfter из 1 секунды?Нет ошибок, но не возобновляется.

Я поместил его в тестовый проект с очень небольшим количеством кода:

import UIKit
import AVKit
import AVFoundation

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        let button = UIButton(type: .system)
        button.addTarget(self, action: #selector(buttoned(sender:)), for: .touchUpInside)
        button.setTitle("Tap here to view video", for: .normal)
        button.titleLabel?.font = UIFont.systemFont(ofSize: 19.0)
        button.frame = view.bounds
        view.addSubview(button)
    }

    @objc private func buttoned(sender: UIButton) {
        let videoURL = URL(string: "https://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4")
        let player = AVPlayer(url: videoURL!)
        let playerViewController = CustomVideoController()
        playerViewController.player = player
        self.present(playerViewController, animated: true) {
            playerViewController.player?.play()
        }
    }
}

class CustomVideoController: AVPlayerViewController {
    override func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)

        do {
            try AVAudioSession.sharedInstance().setActive(false, options: .notifyOthersOnDeactivation)
        } catch {
            print(error)
        }
    }
}

Вот полный компилируемыйпроект (буквально только приведенный выше код): https://drive.google.com/file/d/1oWb-bNIQv5B1KjMkez6BxuEIh_n6eFxH/view

Воспроизведите что-нибудь из Apple Music, Spotify, Overcast и т. д., затем запустите приложение и нажмите просмотр видео.

Я вродесхожу с ума, пытаясь понять эту относительно тривиальную вещь, поскольку я уверен, что просто делаю что-то невероятно глупое, но любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 31 января 2019

(извините, я не могу оставлять комментарии)

Вы пробовали тестировать на другом устройстве (с другой версией iOS?).Ваш пример кода отлично работал на моем iPhone 6 (iOS 12.1.2), я тестировал музыку и подкасты.

0 голосов
/ 30 января 2019

Вы пытались использовать player в качестве члена var?Таким образом, вы можете уничтожить его после исчезновения вида, еще не проверенного, но код должен быть таким:

import UIKit
import AVKit
import AVFoundation

class ViewController: UIViewController {

    var player:AVPlayer?

    override func viewDidLoad() {
        super.viewDidLoad()

        let button = UIButton(type: .system)
        button.addTarget(self, action: #selector(buttoned(sender:)), for: .touchUpInside)
        button.setTitle("Tap here to view video", for: .normal)
        button.titleLabel?.font = UIFont.systemFont(ofSize: 19.0)
        button.frame = view.bounds
        view.addSubview(button)
    }

    @objc private func buttoned(sender: UIButton) {
        let videoURL = URL(string: "https://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4")
        player = AVPlayer(url: videoURL!)
        let playerViewController = CustomVideoController()
        playerViewController.player = player
        self.present(playerViewController, animated: true) {
            playerViewController.player?.play()
        }
    }
}

class CustomVideoController: AVPlayerViewController {
    override func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)
        player.pause()
        player = nil
        do {
            try AVAudioSession.sharedInstance().setActive(false, options: .notifyOthersOnDeactivation)
        } catch {
            print(error)
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...