A call is considered “ended” when the communication session and CallKit lifecycle are terminated and all related resources are cleaned up.
In CallKit, ending a call is handled using:
CXEndCallAction
Call termination can happen because:
Regardless of the reason, CallKit models termination through:
CXEndCallAction
User taps End
↓
CXEndCallAction created
↓
Transaction sent to CallKit
↓
System validates request
↓
CXProviderDelegate fires
↓
App cleans up call state
↓
action.fulfill()