仅导航到应用程序时,CallKit Audio会话开始

时间:2019-05-14 09:04:09

标签: ios voip avaudiosession callkit

我现在正在使用voip应用程序,并希望支持暂停。 但是当第二个电话打来时,我保留了当前的电话。切换到我的第一个电话,我什么都听不到。 听到声音的方法是从callKit本机屏幕导航到我的应用,因此我可以听到声音。

func configureAudioSession() {

    _ = try? AVAudioSession.sharedInstance().setCategory(AVAudioSession.Category.playAndRecord, mode: .videoChat, options: AVAudioSession.CategoryOptions.mixWithOthers)
    _ = try? AVAudioSession.sharedInstance().overrideOutputAudioPort(AVAudioSession.PortOverride.none)
    _ = try? AVAudioSession.sharedInstance().setMode(AVAudioSession.Mode.voiceChat)
}

func startAudio() {
    print("Starting audio")

    do {
        _ = try AVAudioSession.sharedInstance().setActive(true)
    } catch {
    }
}

  func stopAudio() {
    print("Stopping audio")

    do {
        _ = try AVAudioSession.sharedInstance().setActive(false)
    } catch {
    }
}

1 个答案:

答案 0 :(得分:0)

对于支持保持,您不必启动/停止音频会话,而是可以使用Callkit本身提供的CXSetHeldCallAction。这是我使用的保留代码。

let callKitCallController = CXCallController()

func performHoldAction(isOnHold:Bool, uuid:UUID) {
    let holdCallAction = CXSetHeldCallAction(call: uuid, onHold: isOnHold)
    let transaction = CXTransaction(action: holdCallAction)
    callKitCallController.request(transaction) { error in
        if let error = error {
            CPrint("holdCallAction transaction request failed: \(error.localizedDescription).")
            return
        }
        CPrint("holdCallAction transaction request successful")
    }
}

一旦系统将呼叫保留(通过上述方法,或者由于接受其他传入呼叫或任何其他原因),然后在CXProviderDelegate中,方法func provider(_ provider: CXProvider, perform action: CXSetHeldCallAction)为您提供详细信息的回调。

在这里,系统/呼叫包本身与音频交互,您无需显式启动或停止音频即可保存。

注意:请确保您为新呼叫指定的supportsHolding已将true赋予CXCallUpdate