Я использую CallKit
с TokBox
и кое-как, как он работает с одной ошибкой, т.е. после приема вызова динамик становится активным и не может быть отключен нажатием на него. Вызов начинается с активного говорящего, что, по-моему, является ошибкой, но WhatsApp и FBMassenger использовали то же самое со своим пользовательским экраном вызова, но их говорящий становится неактивным после получения вызова, который я искал, и никакого соответствующего ответа я не нашел, поэтому далеко.
В TokBox
они предоставили OTDefaultAudioDevice.h
и OTDefaultAudioDevice.m
файл, из которого они сконфигурировали все об аудио с CallKitSpeakerBox
. Где я нашел следующую конфигурацию:
#define AUDIO_DEVICE_HEADSET @"AudioSessionManagerDevice_Headset"
#define AUDIO_DEVICE_BLUETOOTH @"AudioSessionManagerDevice_Bluetooth"
#define AUDIO_DEVICE_SPEAKER @"AudioSessionManagerDevice_Speaker"
Который использовался следующим образом:
- (BOOL)configureAudioSessionWithDesiredAudioRoute:(NSString*)desiredAudioRoute
{
OT_AUDIO_DEBUG(@"configureAudioSessionWithDesiredAudioRoute %@",desiredAudioRoute);
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
NSError *err;
//ios 8.0 complains about Deactivating an audio session that has running
// I/O. All I/O should be stopped or paused prior to deactivating the audio
// session. Looks like we can get away by not using the setActive call
if (SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(@"7.0")) {
// close down our current session...
[audioSession setActive:NO error:nil];
}
if ([AUDIO_DEVICE_BLUETOOTH isEqualToString:desiredAudioRoute]) {
[self setBluetoothAsPrefferedInputDevice];
}
if (SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(@"7.0")) {
// Set our session to active...
if (![audioSession setActive:YES error:&err]) {
NSLog(@"unable to set audio session active: %@", err);
return NO;
}
}
if ([AUDIO_DEVICE_SPEAKER isEqualToString:desiredAudioRoute]) {
// replace AudiosessionSetProperty (deprecated from iOS7) with
// AVAudioSession overrideOutputAudioPort
#if !(TARGET_OS_TV)
[audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker
error:&err];
#endif
} else
{
[audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideNone
error:&err];
}
return YES;
}
Где AVAudioSessionPortOverrideSpeaker
используется для всех устройств, что, как я считаю, является основной причиной включения динамиков, хотя я точно не знаю. * т.е. 1016 *
if ([AUDIO_DEVICE_SPEAKER isEqualToString:desiredAudioRoute]) {
// replace AudiosessionSetProperty (deprecated from iOS7) with
// AVAudioSession overrideOutputAudioPort
#if !(TARGET_OS_TV)
[audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker
error:&err];
#endif
} else
{
[audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideNone
error:&err];
}
}
Есть ли у кого-нибудь какие-либо предложения или кто-нибудь здесь, кто исправил это состояние до сих пор?
Я также считаю, что многие, как я, проходят через эту проблему.
Любая помощь будет ощутима.
Спасибо