先做一个观察者:
NotificationCenter.default.addObserver(self, selector: #selector(handleRouteChange(_:)), name: AVAudioSession.routeChangeNotification, object: nil)
并实施 handleRouteChange:
@objc func handleRouteChange(_ notification: Notification) {
//bron: https://developer.apple.com/library/archive/documentation/Audio/Conceptual/AudioSessionProgrammingGuide/HandlingAudioHardwareRouteChanges/HandlingAudioHardwareRouteChanges.html#//apple_ref/doc/uid/TP40007875-CH5-SW3
guard let userInfo = notification.userInfo,
let reasonValue = userInfo[AVAudioSessionRouteChangeReasonKey] as? UInt,
let reason = AVAudioSession.RouteChangeReason(rawValue:reasonValue) else {return}
switch reason {
case .routeConfigurationChange:
let session = AVAudioSession.sharedInstance()
for output in session.currentRoute.outputs where output.portType == AVAudioSession.Port.headphones {
play()
break
}
for output in session.currentRoute.outputs where output.portType == AVAudioSession.Port.airPlay {
play()
break
}
for output in session.currentRoute.outputs where output.portType == AVAudioSession.Port.carAudio {
if isPlaying && autoplayCaraudio {
play()
}
break
}
case .oldDeviceUnavailable:
if let previousRoute = userInfo[AVAudioSessionRouteChangePreviousRouteKey] as? AVAudioSessionRouteDescription {
for output in previousRoute.outputs where output.portType == AVAudioSession.Port.headphones {
pause()
break
}
for output in previousRoute.outputs where output.portType == AVAudioSession.Port.airPlay {
pause()
break
}
for output in previousRoute.outputs where output.portType == AVAudioSession.Port.carAudio {
pause()
break
}
}
default: ()
}
}