Я использую 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
используется для всех устройств, что, я считаю, является основной причиной включения динамика, хотя я точно не знаю. то есть
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];
}
}
Есть ли у кого-нибудь какие-либо предложения или кто-нибудь здесь, кто уже исправил это состояние?
Я также считаю, что многие, как и я, проходят через эту проблему.
Любая помощь будет ощутима.
Спасибо