Callkit扬声器漏洞 / WhatsApp如何解决它?

28

我的应用程序具有Callkit功能。当我按扬声器按钮时,它会闪烁并动画到关闭状态(有时扬声器设置为LOUD,但图标仍然是OFF状态)。当我多次点击它时...可以清楚地看到此功能未能正确运行。

然而,WhatsApp一开始就将扬声器关闭,并在3秒后激活它,这样它就可以工作了。是否有人遇到过类似的问题并能给出解决方案?

Youtube视频链接以演示我的问题


@Pan,你解决了这个问题吗? - Abhishek Mitra
不行。这个问题还存在...我为总共800声望点设置了悬赏,但没有提供的答案能够满足我的要求。 - Pan Mluvčí
1
@PanMluvčí,你找到解决方案了吗?我也遇到了同样的问题。 - Gabriel Gava
你有成功吗? - WorieN
有解决这个问题的方法吗?我也遇到了同样的问题。 - Balaji Ramakrishnan
显示剩余2条评论
5个回答

6
有一位苹果工程师提出了一个解决CallKit无法正确激活音频会话的解决方法:
引入一个解决方法是在应用程序生命周期的早期配置应用程序的音频会话(调用configureAudioSession()),然后再调用-provider:performAnswerCallAction:方法。例如,您可以在调用-[CXProvider reportNewIncomingCallWithUUID:update:completion:]之前立即调用configureAudioSession(),以确保在通知CallKit有来电之前完全配置音频会话。
来源:https://forums.developer.apple.com/thread/64544#189703 如果这个方法没有帮助到您,您可能需要发布一个能够重现您行为的示例项目,以便我们进一步分析。

2
上面的答案是正确的,“语音聊天”模式会破坏一切。
以下是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。

它是.voiceChat模式,将其更改为.default,一切都正常工作!不知道是什么原因引起的,但无论它是什么,我认为这是一个CallKit错误。 - Ramin

0

我通过以下步骤解决了这个问题。

在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()}
通话连接后,我将AudioSession类别重置为默认值。
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 @Алексей Сmольский的帮助。


我在实现这个功能时遇到了另一个问题。当通话连接后从语音聊天模式切换回默认模式时,我的音频会话PortOverride也会被更改。例如,我正在使用扬声器进行通话,通话连接后,扬声器将更改为麦克风。有什么建议吗? - Balaji Ramakrishnan
你好,配置 configureAudioSession 代码应该放在哪里?你是指 RTC 连接还是通话连接? - famfamfam

0

也许您可以将 setMode 设置为 AVAudioSessionModeDefault。

当我使用 CallKit + WebRTC 时

  1. 我配置 AVAudioSessionModeDefault 模式。

  2. 分配 CXProvider 并使用 reportNewIncomingCallWithUUID。

  3. 使用 WebRTC,在 ICEConnected 后,WebRTC 将模式更改为 AVAudioSessionModeVoiceChat,然后会出现扬声器问题。

  4. 稍后我将 setMode 设置回 AVAudioSessionModeDefault,扬声器就能正常工作。


0

不,我并没有像你说的那样冻结了显示屏。它是在工作的,但我需要双击扬声器按钮才能激活它,而且它会自动停止工作。 - Pan Mluvčí
请检查此问题 https://dev59.com/Eafja4cB1Zd3GeqP19l9 是否是您所遇到的类似问题。 - Britto Thomas
1
是的...有一个几乎相同的问题,但我看不到任何解决方案。 - Pan Mluvčí
请查看苹果论坛 https://forums.developer.apple.com/message/190773#190773 https://forums.developer.apple.com/message/202644#202644 - Britto Thomas
1
各位......感谢大家的回复......但是你们提供的链接都没有什么有用的信息。 - Pan Mluvčí
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接