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

iOS端liblinphone SDK如何获取SIP头中P-Asserted-Identity字段

你调用call.currentParams?.getCustomHeader(headerName: "P-Asserted-Identity")返回nil的原因是,currentParams存储的是本地发起呼叫时配置的参数,不会同步远端SIP消息携带的头字段。P-Asserted-Identity属于远端返回的SIP信令内容,需要从SIP消息对象中读取,具体操作如下:

步骤1:注册需要读取的自定义头

你使用的Linphone SDK默认会过滤未主动注册的自定义头,需要在Core初始化完成后、发起呼叫前,添加如下代码注册要捕获的头字段:

core.addCustomHeader(toRead: "P-Asserted-Identity")

步骤2:在通话状态回调中读取字段

在onCallStateChanged回调中,选择对应状态读取SIP消息的头字段:呼出场景建议在EarlyMedia或Connected状态读取响应头,呼入场景建议在IncomingReceived状态读取请求头,示例代码如下:

mCoreDelegate = CoreDelegateStub( onCallStateChanged: { (core: Core, call: Call, state: Call.State, message: String) in
    // 根据场景选择触发状态,这里示例是呼出场景
    guard state == .connected || state == .earlyMedia else { return }
    // 读取远端返回的SIP响应消息,呼入场景要读INVITE请求的话替换为call.currentRequest
    guard let sipMessage = call.currentResponse else { return }
    // 读取P-Asserted-Identity字段值
    guard let paiValue = sipMessage.getHeader(name: "P-Asserted-Identity") else { return }
    
    // 解析字段提取显示名,示例逻辑可根据实际格式调整
    if let nameStart = paiValue.firstIndex(of: "\""),
       let nameEnd = paiValue[nameStart...].dropFirst().firstIndex(of: "\"") {
        let displayName = String(paiValue[paiValue.index(after: nameStart)..<nameEnd])
        // 这里执行替换号码显示的逻辑
        print("获取到的身份标识:\(displayName)")
    }
})

注意事项

  • 如果要读取呼入INVITE请求携带的P-Asserted-Identity,将call.currentResponse替换为call.currentRequest即可
  • 注册自定义头的操作必须在呼叫发起前完成,否则SDK不会保留对应字段,读取结果仍会为空

内容的提问来源于stack exchange,提问作者Patrik Spišák

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 01:15:04