You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Linphone iOS SDK中发送DTMF?sendDtmf报invalid call错误如何解决

Linphone iOS SDK V5 SendDTMF功能失效问题原因及解决方案

问题原因

  • call实例状态异常:日志输出invalid call说明你当前持有call实例不是有效活跃通话对象,只有处于LinphoneCallStateStreamsRunning(流运行中)状态的通话才能调用发送DTMF接口,若通话处于连接中、挂起、即将挂断状态,调用接口都会报错。
  • call实例归属Core不匹配:你的代码中同时初始化了coreManager1和coreManager2两个独立的Linphone Core实例,若call实例不是从当前正在运行迭代的Core中获取的,跨Core调用方法会直接判定为无效call。
  • DTMF协商配置异常:若SIP协商阶段未成功协商RFC2833的telephone-event载荷,且Linphone Core未开启带内DTMF支持,调用发送DTMF接口也会返回错误。

解决方案

  1. 发送DTMF前先校验当前活跃通话状态,确保使用的是最新的有效call实例:
@IBAction func btnsAppend(_ sender: UIButton) {
    let digit = sender.currentTitle!
    let cchar = (digit.cString(using: .utf8)?[0])!
    // 从全局唯一Core中获取当前活跃通话
    guard let activeCall = lc?.calls.first, activeCall.state == .streamsRunning else {
        print("无有效活跃通话,无法发送DTMF")
        return
    }
    do {
        try activeCall.sendDtmf(dtmf: cchar)
    } catch {
        print("DTMF发送失败:\(error)")
    }
}
  1. 全局仅保留一个Linphone Core实例,删除多余的Core实例(你的代码中coreManager1和coreManager2保留一个即可),避免状态错乱。
  2. Core初始化阶段配置DTMF相关参数,适配你的服务端要求:
// Core初始化完成后配置
lc?.useRfc2833Dtmf = true // 优先使用RFC2833 DTMF,兼容性最好
lc?.useInBandDtmf = true // 开启带内DTMF作为兜底,RFC2833协商失败时使用
lc?.sendDtmfViaSipInfo = false // 不需要通过SIP INFO发送DTMF时关闭,按需调整

内容的提问来源于stack exchange,提问作者Ajoy Karmakar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 15:09:03