刚开始为 iOS 7 开发,发现 AudioSession 相关函数和 PropertyListeners 在 iOS 7 中被弃用。
在使用以下方法检测耳机是否已插入或拔出设备之前:
/* add callback for device route change */
AudioSessionAddPropertyListener (
kAudioSessionProperty_AudioRouteChange,
audioRouteChangeListenerCallback,
(__bridge void *)(self));
然后实现侦听器回调以对内部算法执行不同的操作。现在iOS 7弃用了它,没有任何替代方案的文档,这里有专家的解决方案吗?谢谢!
处理通知AVAudioSessionRouteChangeNotification
(在 iOS 6.0 及更高版本中可用。
尝试以下代码进行Swift 4.2
:
@objc func handleRouteChange(_ notification: Notification) {
let reasonValue = (notification as NSNotification).userInfo![AVAudioSessionRouteChangeReasonKey] as! UInt
let routeDescription = (notification as NSNotification).userInfo![AVAudioSessionRouteChangePreviousRouteKey] as! AVAudioSessionRouteDescription?
NSLog("Route change:")
if let reason = AVAudioSession.RouteChangeReason(rawValue: reasonValue) {
switch reason {
case .newDeviceAvailable:
NSLog(" NewDeviceAvailable")
case .oldDeviceUnavailable:
NSLog(" OldDeviceUnavailable")
case .categoryChange:
NSLog(" CategoryChange")
NSLog(" New Category: %@", AVAudioSession.sharedInstance().category.rawValue)
case .override:
NSLog(" Override")
case .wakeFromSleep:
NSLog(" WakeFromSleep")
case .noSuitableRouteForCategory:
NSLog(" NoSuitableRouteForCategory")
case .routeConfigurationChange:
NSLog(" RouteConfigurationChange")
case .unknown:
NSLog(" Unknown")
@unknown default:
NSLog(" UnknownDefault(%zu)", reasonValue)
}
} else {
NSLog(" ReasonUnknown(%zu)", reasonValue)
}
if let prevRout = routeDescription {
NSLog("Previous route:n")
NSLog("%@", prevRout)
NSLog("Current route:n")
NSLog("%@n", AVAudioSession.sharedInstance().currentRoute)
}
}
并在func setupAudioSession()
中使用它
private func setupAudioSession() {
// Configure the audio session
let sessionInstance = AVAudioSession.sharedInstance()
// we don't do anything special in the route change notification
NotificationCenter.default.addObserver(self,
selector: #selector(self.handleRouteChange(_:)),
name: AVAudioSession.routeChangeNotification,
object: sessionInstance)
}
对于Objective C
请尝试此代码
- (void)handleRouteChange:(NSNotification *)notification
{
UInt8 reasonValue = [[notification.userInfo valueForKey:AVAudioSessionRouteChangeReasonKey] intValue];
AVAudioSessionRouteDescription *routeDescription = [notification.userInfo valueForKey:AVAudioSessionRouteChangePreviousRouteKey];
NSLog(@"Route change:");
switch (reasonValue) {
case AVAudioSessionRouteChangeReasonNewDeviceAvailable:
NSLog(@" NewDeviceAvailable");
break;
case AVAudioSessionRouteChangeReasonOldDeviceUnavailable:
NSLog(@" OldDeviceUnavailable");
break;
case AVAudioSessionRouteChangeReasonCategoryChange:
NSLog(@" CategoryChange");
NSLog(@" New Category: %@", [[AVAudioSession sharedInstance] category]);
break;
case AVAudioSessionRouteChangeReasonOverride:
NSLog(@" Override");
break;
case AVAudioSessionRouteChangeReasonWakeFromSleep:
NSLog(@" WakeFromSleep");
break;
case AVAudioSessionRouteChangeReasonNoSuitableRouteForCategory:
NSLog(@" NoSuitableRouteForCategory");
break;
default:
NSLog(@" ReasonUnknown");
}
NSLog(@"Previous route:n");
NSLog(@"%@n", routeDescription);
NSLog(@"Current route:n");
NSLog(@"%@n", [AVAudioSession sharedInstance].currentRoute);
}
并在(void)setupAudioSession
中使用它
- (void)setupAudioSession {
// Configure the audio session
AVAudioSession *sessionInstance = [AVAudioSession sharedInstance];
// we don't do anything special in the route change notification
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handleRouteChange:)
name:AVAudioSessionRouteChangeNotification
object:sessionInstance];
}