我有一个具有Callkit
功能的应用程序。当我按下扬声器按钮时,它会闪烁并动画化到 OFF 状态(有时扬声器设置为 LOUD,但图标仍然关闭(。当我多次点击它时...可以清楚地看到,此功能的行为不正确。
但是,WhatsApp 一开始扬声器已关闭,并在 3+ 秒后激活它并正常工作。有没有人遇到过类似的事情,可以给我一个解决方案?
Youtube视频链接来演示我的问题
苹果工程师提出了一种解决方法,可以修复呼叫套件未正确激活音频会话的问题:
解决方法是在调用
-provider:performAnswerCallAction:
方法之前,在应用生命周期的早期配置应用的音频会话(调用configureAudioSession()
(。例如,您可以在呼叫-[CXProvider reportNewIncomingCallWithUUID:update:completion:]
之前立即呼叫configureAudioSession()
,以确保在通知 CallKit 有关传入呼叫之前完全配置音频会话。
寄件人: https://forums.developer.apple.com/thread/64544#189703
如果这没有帮助,您可能应该发布一个示例项目,重现您的行为,以便我们能够进一步分析它。
上面的答案是正确的,"语音聊天"模式毁了一切。
WebRTC 的 Swift 4 示例。建立连接后呼叫下一个
let rtcAudioSession = RTCAudioSession.sharedInstance()
rtcAudioSession.lockForConfiguration()
do {
try rtcAudioSession.setCategory(AVAudioSession.Category.playAndRecord.rawValue, with:
AVAudioSession.CategoryOptions.mixWithOthers)
try rtcAudioSession.setMode(AVAudioSession.Mode.default.rawValue)
try rtcAudioSession.overrideOutputAudioPort(.none)
try rtcAudioSession.setActive(true)
} catch let error {
debugPrint("Couldn't force audio to speaker: (error)")
}
rtcAudioSession.unlockForConfiguration()
您也可以使用 AVAudioSession.sharedInstance(( 代替 RTC
引用自系统提供的呼叫屏幕上扬声器按钮的异常行为
在以前的版本中也遇到了同样的问题。因此,这不是呼叫工具包上发生的新问题。此问题必须从iOS解决。我们无法控制这一点。
请浏览苹果开发者论坛
呼叫套件/检测扬声器组
和
[呼叫套件] 音频会话未激活?
也许你可以将Mode设置为AVAudioSessionModeDefault。
当我使用 CallKit + WebRTC 时
-
我配置 AVAudioSessionModeDefault 模式。
-
Alloc CXProvider and reportNewIncomingCallWithUUID
-
使用WebRTC,在ICEC连接后,WebRTC将模式更改为AVAudioSessionModeVoiceChat,然后发生扬声器问题。
-
后来我将Mode设置回AVAudioSessionModeDefault,扬声器工作得很好。
我已经通过执行以下步骤解决了这个问题。
-
在 CXAnswerCallAction 中,使用以下代码设置音频会话配置。
RTCDispatcher.dispatchAsync(on: RTCDispatcherQueueType.typeAudioSession) { let audioSession = RTCAudioSession.sharedInstance() audioSession.lockForConfiguration() let configuration = RTCAudioSessionConfiguration.webRTC() configuration.categoryOptions = [AVAudioSessionCategoryOptions.allowBluetoothA2DP,AVAudioSessionCategoryOptions.duckOthers, AVAudioSessionCategoryOptions.allowBluetooth] try? audioSession.setConfiguration(configuration) audioSession.unlockForConfiguration()}
-
呼叫连接后,我将音频会话类别重置为默认值。
func configureAudioSession() { let session = RTCAudioSession.sharedInstance() session.lockForConfiguration() do { try session.setCategory(AVAudioSession.Category.playAndRecord.rawValue, with: .allowBluetooth) try session.setMode(AVAudioSession.Mode.default.rawValue) try session.setPreferredSampleRate(44100.0) try session.setPreferredIOBufferDuration(0.005) } catch let error { debugPrint("Error changeing AVAudioSession category: (error)") } session.unlockForConfiguration()}
感谢 SO @Алексей Смольский 的帮助。