AudioServicesPlaySystemSound никогда не воспроизводится, когда звонок отключен, по моему опыту. Если вы вместо этого воспроизводите звуки с помощью AVAudioPlayer, вы должны получить искомое поведение:
let player: AVAudioPlayer = try AVAudioPlayer(contentsOf: url)
player.delegate = self
player.play()
Вам также нужно будет активировать аудиосеанс перед воспроизведением, если вы этого еще не сделали. И установите категорию аудио сеанса, которая поддерживает звуки, когда вы молчите, как вы уже сделали. Для экономии заряда аккумулятора остановите аудиосессию, когда звук не воспроизводится.
Заметное различие между AudioServices и AVAudioPlayer заключается в том, что, если звонок отключен, воспроизведение AudioServices возобновится практически сразу, в то время как AVAudioPlayer примет полную длину звука до завершения. Насколько я знаю, единственный способ обнаружить и отреагировать на настройку звонка пользователя - это использовать AudioServices вместо AVAudioPlayer. Если вы просто хотите играть в молчании, это не должно относиться к делу.