我有一个具有Callkit
功能的应用。当我按下扬声器按钮时,它将闪烁并设置为关闭状态(有时扬声器设置为LOUD但图标仍然是OFF)。当我多次点击它时......可以清楚地看到此功能的行为不正确。
然而,WhatsApp在开始时扬声器关闭,3秒后激活它并开始工作。有没有人遇到类似的东西,可以给我一个解决方案吗?
答案 0 :(得分:3)
Apple工程师提出了一种解决方法,它应该修复callkit而不是正确激活音频会话:
解决方法是在调用
configureAudioSession()
方法之前,在应用程序生命周期的早期配置应用程序的音频会话(调用-provider:performAnswerCallAction:
)。例如,您可以在呼叫configureAudioSession()
之前立即呼叫-[CXProvider reportNewIncomingCallWithUUID:update:completion:]
,以确保在通知CallKit有关来电之前完全配置音频会话。
来自:https://forums.developer.apple.com/thread/64544#189703
如果这没有帮助,您可能应该发布一个示例项目,为我们重现您的行为,以便能够进一步分析它。
答案 1 :(得分:0)
参考Abnormal behavior of speaker button on system provided call screen
以前的版本也遇到了同样的问题。所以这不是电话套件上发生的新问题。 此问题必须从iOS解决。我们无法控制这一点。
请浏览苹果开发者论坛
和
答案 2 :(得分:0)
也许您可以将Mode设置为AVAudioSessionModeDefault。
当我使用CallKit + WebRTC
我配置了AVAudioSessionModeDefault模式。
Alloc CXProvider和reportNewIncomingCallWithUUID
使用WebRTC,在ICEConnected之后,WebRTC将模式更改为AVAudioSessionModeVoiceChat,然后发生扬声器问题。
稍后我将setMode返回到AVAudioSessionModeDefault,扬声器运行良好。
答案 3 :(得分:0)
以上答案是正确的,“语音聊天”模式破坏了一切。
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
答案 4 :(得分: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 @Алексей Смольский的帮助。