如何在使用 Callkit 时播放声音,例如铃声?

How to play sounds, like the ringing beep, while using Callkit?

我正在尝试使用 webRTC 和 Callkit 实现 VoIP。通话期间音频工作得很好,但我想在用户发起通话(拨出电话)时向用户播放声音。

当用户发起呼叫并等待接听者接听时,我想播放等待提示音(长音)。我可以设法在不使用 Callkit 的情况下播放声音,但是当我通知 Callkit 关于去电时,它会以某种方式取消音频。我的假设是它这样做是因为它 IOS 在开始通话时使音频静音。

所以我的问题是,当 Callkit 处于活动状态时如何播放 mp3 文件。或者这个等待声音是否以某种方式集成在 Callkit 或 WebRTC 中?

我为音频会话设置了不同的类别,但到目前为止运气不好。请参阅下面我当前代码的摘要。

public var audioPlayer: AVAudioPlayer?

private init() {
    do {
        audioPlayer = try AVAudioPlayer(contentsOf: URL(fileURLWithPath: Bundle.main.path(forResource: "dialring", ofType: "mp3")!))
        audioPlayer!.prepareToPlay()
        audioPlayer!.numberOfLoops = -1 //loop
    } catch {
        print(error.localizedDescription)
    }
}

func provider(_ provider: CXProvider, perform action: CXStartCallAction) {
    configureAudioSession()
    audioPlayer?.play()
}

func configureAudioSession() {
    print("Configuring audio session")
    let session = AVAudioSession.sharedInstance()
    do {
        try AVAudioSession.sharedInstance().setCategory(.playAndRecord, options: [.mixWithOthers])
        try session.setMode(AVAudioSession.Mode.voiceChat)
    } catch (let error) {
        print("Error while configuring audio session: \(error)")
    }
}

如果有人能指出正确的方向,我将不胜感激。

编辑:我启用了音频背景模式。

稍微修改一下结构,现在它可以工作了。我不确定是什么改变了想法。如果人们面临同样的问题。 - 确保您对音频播放器保持强烈的参考。 - 确保模式为 .playback 或 .playAndRecord