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

Posted

技术标签:

【中文标题】如何在使用 Callkit 时播放声音,例如铃声?【英文标题】:How to play sounds, like the ringing beep, while using Callkit? 【发布时间】:2019-05-22 09:37:00 【问题描述】:

我正在尝试使用 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)")
    

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

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

【问题讨论】:

我不知道这是否与您的问题有关,但您应该在provider(_ provider: CXProvider, perform action: CXStartCallAction) 中致电action.fulfill() @marco ,是的,实际上我的代码中已经有了它。我没有在这里展示它,所以我可以保持简短。这与通话使我的其他声音静音有关。但是我不知道如何解决这个问题。 【参考方案1】:

对结构进行了一些改动,现在它可以工作了。我不确定是什么改变了想法。如果人们面临同样的问题。 - 确保你对音频播放器有很强的参考。 - 确保模式为 .playback 或 .playAndRecord

【讨论】:

以上是关于如何在使用 Callkit 时播放声音,例如铃声?的主要内容,如果未能解决你的问题,请参考以下文章

iPhone:如何播放忽略音量和铃声开关设置的声音?

如何以编程方式播放默认电话铃声?

当铃声静音时,如何防止我的应用程序(使用 AVPlayer)静音?

设备在播放啥吗?

CallKit 可以在交换通话后重新激活声音

如何以编程方式增加iPhone音量