Возобновление AVPlayer после прерывания с SwiftUI - PullRequest
2 голосов
/ 26 апреля 2020

Я создаю приложение для потокового радио, используя AVPlayer и AVPlayerItem. Я построил свое приложение для воспроизведения радио в фоновом режиме, например:

do {
    try AVAudioSession.sharedInstance().setCategory(.playback)
    try AVAudioSession.sharedInstance().setActive(true)
} catch {
   print(error)
}

После прерывания AVPlayer (например, когда пользователь получает вызов), AVPlayer isn ' возобновить игру. Мне нужно активно воспроизвести его снова, чтобы прослушать потоковую передачу.

Как я могу заставить AVPlayer автоматически возобновить работу после прерывания с помощью SwiftUI? (Я нашел несколько решений, но ни одно из них не подходит для работы с SwiftUI.

Спасибо!

1 Ответ

3 голосов
/ 30 апреля 2020

Нет ничего общего со SwiftUI или пользовательским интерфейсом в целом, чтобы возобновить воспроизведение после прерывания.

Как сказано в документации Apple :

Сначала зарегистрируйтесь в уведомлении о прерывании:

func registerForNotifications() {
    NotificationCenter.default.addObserver(self,
                                           selector: #selector(handleInterruption),
                                           name: .AVAudioSessionInterruption,
                                           object: AVAudioSession.sharedInstance())
}

Затем обработайте уведомление следующим образом:

func handleInterruption(_ notification: Notification) {
    guard let info = notification.userInfo,
        let typeValue = info[AVAudioSessionInterruptionTypeKey] as? UInt,
        let type = AVAudioSessionInterruptionType(rawValue: typeValue) else {
            return
    }
    if type == .began {
        // Interruption began, take appropriate actions (save state, update user interface)
    }
    else if type == .ended {
        guard let optionsValue =
            userInfo[AVAudioSessionInterruptionOptionKey] as? UInt else {
                return
        }
        let options = AVAudioSessionInterruptionOptions(rawValue: optionsValue)
        if options.contains(.shouldResume) {
            // Interruption Ended - playback should resume
        }
    }
}

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

...