Если вы хотите возобновить фоновое аудио пользователя при отключении воспроизводимого видео в приложении, как лучше всего это сделать с минимальными перерывами? - PullRequest
5 голосов
/ 31 марта 2020

Извините за заголовок, немного сложно объяснить.

Представьте, что пользователь слушает Spotify или что-то в фоновом режиме во время использования моего приложения, и они нажимают на видео, чтобы воспроизвести его. Видео по умолчанию отключено, поэтому Spotify продолжается. ТОГДА пользователь нажимает кнопку включения звука, поэтому Spotify приостанавливает работу и начинает воспроизводиться звук теперь без звука.

Теперь выясняется, что звук видео не был таким интересным, и пользователь предпочел бы послушать свою музыку c, поэтому пользователь нажимает mute на этот раз, поэтому аудио видео прекращается, и Spotify должен возобновиться.

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

Так что в ответ вы, казалось бы, можете танцевать A) приостановить видео, B) установить звуковой сеанс на неактивный, таким образом, снова включив Spotify, C) сделать паузу видео. Но если вы исполняете этот танец слишком быстро, iOS раздражается и воспринимает его так, как если бы вы его вообще не приостанавливали, что может привести к потере воспроизведения и вывода видео:

Деактивация аудио-сессии на котором запущен ввод / вывод. Все операции ввода-вывода должны быть остановлены или приостановлены до деактивации аудиосеанса

Нет никаких обработчиков завершения или чего-либо еще (что я вижу), чтобы облегчить, когда вам нужно повторно включить любое приостановленное видео или и так далее, поэтому я прибег к этому грубому куску кода, где я ввожу искусственные (предполагаемые) задержки:

// Pause it
player.pause()
videoControlsView?.isPaused = true

DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(100)) {
    // Wait 0.1 seconds, set audio to inactive
    do {
        try AVAudioSession.sharedInstance().setCategory(.ambient, mode: .default, options: [])
        try AVAudioSession.sharedInstance().setActive(false, options: .notifyOthersOnDeactivation)
    } catch {
        print(error)
    }

    DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(100)) {
        // Wait 0.1 seconds, unpause
        player.play()
        player.isMuted = true
        self.videoControlsView?.isMuted = true
    }
}

Но, несмотря на довольно частое тестирование, этот код явно очень fr agile, а не мой любимый я когда-либо писал. Есть ли правильный способ сделать это?

Примечание: активация (а не деактивация) аудиосеанса не имеет таких проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...