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

如何在Linphone中检测当前通话及来电状态以展示CallKit视图

Hey there! I’ve run into similar Linphone + CallKit integration quirks before, so let’s break down what’s going on here and how to fix it.

Why linphone_core_get_current_call() isn’t working for incoming calls

The linphone_core_get_current_call() method only returns active, connected calls—not incoming calls that are still ringing. When a call is incoming (but not yet answered), it hasn’t been promoted to the "current call" status, so this function will return nil even though there’s an incoming call waiting.

How to detect incoming call status properly

You have two reliable approaches to catch incoming calls and trigger your CallKit UI:

1. Use Linphone’s call state listener (recommended)

Linphone provides a callback system to listen for call state changes. This is the cleanest way to react to incoming calls as soon as they arrive.

First, set up a call state listener when you initialize your Linphone core:

// Define the callback function to handle state changes
func callStateUpdated(core: OpaquePointer?, call: OpaquePointer?, state: LinphoneCallState, message: UnsafePointer<CChar>?) {
    switch state {
    case LinphoneCallStateIncomingReceived, LinphoneCallStateIncomingEarlyMedia:
        // This is your incoming call trigger—show CallKit UI here
        showCallKitIncomingUI()
    case LinphoneCallStateConnected, LinphoneCallStateStreamsRunning:
        // Update CallKit to reflect an active call if needed
        updateCallKitToActiveState()
    case LinphoneCallStateEnd, LinphoneCallStateReleased:
        // Dismiss CallKit UI when the call ends
        dismissCallKitUI()
    default:
        break
    }
}

// Add the listener to your Linphone core during setup
linphone_core_add_call_state_listener(theLinphone.lc, callStateUpdated, nil)

2. Manually check for incoming calls (for one-time checks)

If you need to proactively check if there’s an incoming call at a specific moment, iterate through all active calls and check their state:

func isThereAnIncomingCall() -> Bool {
    guard let callList = linphone_core_get_calls(theLinphone.lc) else {
        return false
    }
    
    var currentCall = linphone_call_list_get_first(callList)
    while currentCall != nil {
        let callState = linphone_call_get_state(currentCall)
        // Check if the call is in an incoming state
        if callState == LinphoneCallStateIncomingReceived || callState == LinphoneCallStateIncomingEarlyMedia {
            linphone_call_list_destroy(callList) // Don't forget to clean up the list
            return true
        }
        currentCall = linphone_call_list_get_next(currentCall)
    }
    
    linphone_call_list_destroy(callList)
    return false
}

Quick notes to avoid pitfalls

  • Make sure your Linphone core is fully initialized before trying to access call states.
  • Double-check that you’ve requested all necessary permissions (microphone, phone, etc.) for both Linphone and CallKit to work correctly.
  • Follow Apple’s CallKit guidelines when presenting/dismissing the UI—Apple enforces strict rules around call UI presentation to maintain system consistency.

内容的提问来源于stack exchange,提问作者Gaurav Gupta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:38:12