AVAudioSessionInterruptionNotification с AVAudioSessionInterruptionWasSuspendedKey срабатывает при попытке возобновить работу из фонового режима

AVAudioPlayer воспроизводит звук в фоновом режиме, и пользователь приостанавливает его либо с помощью элементов управления гарнитурой, либо с помощью элементов управления экрана блокировки. Если пользователь делает это менее 30 секунд и пытается возобновить работу - все работает нормально. Если пользователь пытается возобновить его более чем через 30 секунд - звук начинает воспроизводиться, но через секунду срабатывает audioSessionInterruptionNotification из AVAudioSessionDelegate, с AVAudioSessionInterruptionWasSuspendedKey YES.

После этого приложение полностью перестает реагировать на события удаленного управления. События запускаются, но AVAudioPlayer не реагирует ни на какие команды. На самом деле [[self audioplayer] isAudioPlaying] возвращает НЕТ, пока воспроизведение продолжается.

Если я попытаюсь справиться с этим следующим образом - это помогает (поэтому я устанавливаю AVAudioSession в неактивное состояние, а затем метод playHelper активирует его и воспроизводит звук), но возникает сбой, потому что уведомление срабатывает после того, как оно начинает играть.

- (void)audioSessionInterruptionNotification:(NSNotification *)interruption {
    UInt8 interruptionType = [[interruption.userInfo valueForKey:AVAudioSessionInterruptionTypeKey] intValue];

    NSLog(@"Session interrupted > --- %s ---\n", interruptionType == AVAudioSessionInterruptionTypeBegan ? "Begin Interruption" : "End Interruption");
    NSDictionary *notificationUserInfo = [interruption userInfo];
    if (interruptionType == AVAudioSessionInterruptionTypeBegan) {
        if ([notificationUserInfo valueForKey:AVAudioSessionInterruptionWasSuspendedKey]) {
            [[AVAudioSession sharedInstance] setActive:false error:nil];
            [self playHelper];
        } else {
            [self interruptionStarted];
        }
    } else if (interruptionType == AVAudioSessionInterruptionTypeEnded) {
        [self interruptionEnded:(NSUInteger)[notificationUserInfo objectForKey:AVAudioSessionInterruptionOptionKey]];
    }
}

Посоветуйте, что может быть причиной этого.


person Serg P    schedule 25.07.2019    source источник


Ответы (1)


Уведомление AVAudioSessionInterruptionWasSuspendedKey выдается, потому что вы должны деактивировать аудиосеанс всякий раз, когда ваше приложение переходит в фоновый режим и ничего не воспроизводится. Если ваш проигрыватель играет, когда пользователь делает паузу с экрана блокировки, вам не нужно деактивировать сеанс.

Вы должны слушать уведомления, когда ваше приложение отправляется в фоновый режим и когда оно становится активным, код в Swift должен выглядеть так.

NotificationCenter.default.addObserver(forName: UIApplication.willResignActiveNotification, object: nil, queue: .main) { sender in
            guard self.player.isPlaying == false else { return }
            self.setSession(active: false)
        }

NotificationCenter.default.addObserver(forName: UIApplication.didBecomeActiveNotification, object: nil, queue: .main) { sender in
            guard self.player.isPlaying else { return }
            self.setSession(active: true)
        }

    func setSession(active: Bool) -> Bool {
        let session = AVAudioSession.sharedInstance()
        do {
            try session.setCategory(.playback, mode: .default)
            try session.setActive(active)
            return true
        } catch let error {
            print("*** Failed to activate audio session: \(error.localizedDescription)")
            return false
        }
    }
person Adam    schedule 03.09.2019