默认情况下,我们的应用使用扬声器进行音频输出。但是,我们还需要向用户显示有线耳机是否可用(在应用程序生命周期内甚至在应用程序启动之前就已插入)。因此。我们需要检测当前是否插入了有线耳机。我们可以将耳机与iPhone通话等配合使用,并且耳机符号在iPhone上可见,以确保耳机可以正常工作并被iPhone检测到。
我们正在使用以下代码,这些代码已经在各种线程(here)和博客中进行了充分讨论和建议,但是如果扬声器为ON,则在iOS 12中将不再起作用。
- (BOOL)isHeadsetPluggedIn {
AVAudioSessionRouteDescription* route = [[AVAudioSession sharedInstance] currentRoute];
for (AVAudioSessionPortDescription* desc in [route outputs]) {
if ([[desc portType] isEqualToString:AVAudioSessionPortHeadphones])
return YES;
}
return NO;
}
如果扬声器打开,则currentRoute仅返回“ Speaker”,因此耳机检测失败,并且以上代码返回NO。
我们还尝试使用以下代码检查可用输入,但没有耳机
NSArray<AVAudioSessionPortDescription *> *availableInputs =
[[AVAudioSession sharedInstance] availableInputs];
for (AVAudioSessionPortDescription* desc in availableInputs) {
NSLog(@"Available Port type: %@", [desc portType]);
}
这仅返回“ MicrophoneBuiltIn”(如果蓝牙为ON,则返回蓝牙),但不返回耳机。
以下是我们用于打开/关闭扬声器的代码。
- (BOOL)switchSpeaker:(BOOL)onOrOff
{
NSError* audioError = nil;
BOOL changeResult = NO;
AVAudioSessionPortOverride override = onOrOff?AVAudioSessionPortOverrideSpeaker:AVAudioSessionPortOverrideNone;
changeResult = [[AVAudioSession sharedInstance] overrideOutputAudioPort:override error:&audioError];
return changeResult;
}
有什么主意吗?