如何防止 Callkit 停止 AVAudioPlayer?

Posted

技术标签:

【中文标题】如何防止 Callkit 停止 AVAudioPlayer?【英文标题】:How to prevent Callkit from stopping AVAudioPlayer? 【发布时间】:2018-03-29 01:06:16 【问题描述】:

我有一个使用 Twilio 的 voip 视频聊天应用程序,我正在尝试为拨打电话的用户播放回铃音。但是每当调用didActivate:audiosession 时,我的 AVAudioPlayer 就会停止,导致回铃音只播放片刻。 Callkit 已激活音频会话时,如何继续播放回铃音?这是我的代码:

func configure() 
        do 
            try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayAndRecord, mode: AVAudioSessionModeVideoChat, options: [.mixWithOthers, .allowBluetooth, .defaultToSpeaker])
         catch 
            print(error.localizedDescription)
        

        let configuration = CXProviderConfiguration(localizedName: "Thirty")
        configuration.maximumCallGroups = 1
        configuration.maximumCallsPerCallGroup = 1
        configuration.supportsVideo = true
        configuration.supportedHandleTypes = [.generic]
        if let callKitIcon = UIImage(named: "callkitIcon") 
            configuration.iconTemplateImageData = UIImagePNGRepresentation(callKitIcon)
            
        callKitProvider = CXProvider(configuration: configuration)
        callKitProvider?.setDelegate(self, queue: nil)

        let path = Bundle.main.path(forResource: "ringbackMorningSong.mp3", ofType:nil)!
        let url = URL(fileURLWithPath: path)
        ringbackAudioPlayer = try? AVAudioPlayer(contentsOf: url)
        ringbackAudioPlayer?.numberOfLoops = -1
        ringbackAudioPlayer?.prepareToPlay()
    

然后当用户点击“拨打电话”按钮时,ringbackAudioPlayer 开始播放。

然后执行CXStartCallAction。然后didActivate:audioSession 被调用,这就是我的回铃音停止的地方。

【问题讨论】:

你在哪里打电话 ringbackAudioPlayer.play() 当用户点击“拨打电话”按钮时,它会在不同的视图控制器上调用。 遇到了同样的问题。将不胜感激任何帮助。谢谢! 【参考方案1】:

可能不是最佳解决方案,但我通过在参与者DidConnect 方法 (twilio) 中添加 CXStartCallAction(call: uuid, handle: callHandle) 解决了这个问题。这样 AVAudioPlayer 就不会被 CallKit 打断,其他用户连接后就不需要 AVAudioPlayer 声音了。

【讨论】:

以上是关于如何防止 Callkit 停止 AVAudioPlayer?的主要内容,如果未能解决你的问题,请参考以下文章

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

使用 Callkit 接听电话后如何保持原生 UI

如何使用 CallKit API 映射社交资料

如何在 xcode8 beta 6 中授权 callkit

(iphone) 如何使用 AVAudioPlayer 顺序播放声音?

即使启用了设备“请勿打扰”,如何显示 VoIP 推送呼叫的传入 CallKit 窗口?