VoIP SIP Calling Workflow
Purpose
Build an Apple VoIP calling app without conflating system call presentation,
audio-session activation, signaling, media transport, and account state.
Architecture
- System integration: use CallKit or LiveCommunicationKit for call actions,
system UI, and system coordination.
- Wake-up: use PushKit VoIP notifications only for a real incoming call that
is promptly reported through the supported calling framework.
- Audio: use AVFAudio/AVAudioSession for activation, route changes,
interruptions, Bluetooth, and media permissions.
- Signaling and media: choose SIP, WebRTC, or another documented transport
based on interoperability, NAT traversal, codec, security, and backend needs.
SIP is a protocol lane, not an Apple calling UI API.
- App state: own account identity, call state, reconnection, recording,
retention, emergency-call policy, and end-to-end encryption explicitly.
Workflow
- Define incoming, outgoing, answer, decline, end, hold, mute, transfer, and
failure state transitions before integrating UI.
- Report incoming calls to the system promptly, then start media only after the
calling framework and audio system permit it.
- Design a transport adapter behind explicit call-state inputs and outputs;
never let SIP registration or WebRTC callbacks become the global UI owner.
- Decide the fallback behavior separately for VoIP failure and cellular calling.
- Route default-calling or default-dialer eligibility to
default-communication-app-workflow.
Validation
Test physical-device incoming/outgoing calls, background arrival, lock screen,
audio route and interruption changes, reconnect, duplicate pushes, signaling
failure, media failure, and user-visible fallback.
References
1---2name: voip-sip-calling-workflow3description: Build a native Apple VoIP calling app by separating CallKit or LiveCommunicationKit, PushKit, AVFAudio, SIP or WebRTC transport, and call-state ownership.4---56# VoIP SIP Calling Workflow78## Purpose910Build an Apple VoIP calling app without conflating system call presentation,11audio-session activation, signaling, media transport, and account state.1213## Architecture1415- **System integration:** use CallKit or LiveCommunicationKit for call actions,16 system UI, and system coordination.17- **Wake-up:** use PushKit VoIP notifications only for a real incoming call that18 is promptly reported through the supported calling framework.19- **Audio:** use AVFAudio/AVAudioSession for activation, route changes,20 interruptions, Bluetooth, and media permissions.21- **Signaling and media:** choose SIP, WebRTC, or another documented transport22 based on interoperability, NAT traversal, codec, security, and backend needs.23 SIP is a protocol lane, not an Apple calling UI API.24- **App state:** own account identity, call state, reconnection, recording,25 retention, emergency-call policy, and end-to-end encryption explicitly.2627## Workflow28291. Define incoming, outgoing, answer, decline, end, hold, mute, transfer, and30 failure state transitions before integrating UI.312. Report incoming calls to the system promptly, then start media only after the32 calling framework and audio system permit it.333. Design a transport adapter behind explicit call-state inputs and outputs;34 never let SIP registration or WebRTC callbacks become the global UI owner.354. Decide the fallback behavior separately for VoIP failure and cellular calling.365. Route default-calling or default-dialer eligibility to37 `default-communication-app-workflow`.3839## Validation4041Test physical-device incoming/outgoing calls, background arrival, lock screen,42audio route and interruption changes, reconnect, duplicate pushes, signaling43failure, media failure, and user-visible fallback.4445## References4647- [Making and receiving VoIP calls](https://developer.apple.com/documentation/callkit/making-and-receiving-voip-calls)48- [CallKit](https://developer.apple.com/documentation/callkit)49- [Initiating VoIP conversations with LiveCommunicationKit](https://developer.apple.com/documentation/livecommunicationkit/initiating-voip-conversations-with-livecommunicationkit)