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
相关产品推荐
相关产品推荐

