Hello everyone,
I’m an iOS developer working on a real-time communication app that supports VoIP calls using CallKit. The app has been in production for more than 5 years.
Over the years, some users have occasionally reported that they do not receive incoming call pushes. We have tried multiple optimizations on both the client and server side, but the improvement has been limited.
From Apple documentation and discussions online, I understand that iOS may restrict VoIP pushes if the system detects violations of VoIP push usage rules (for example, not presenting a CallKit call after receiving a VoIP push). However, the exact rules and thresholds for these violations are not clearly documented, so I’d like to ask a few questions to better understand the expected behavior.
Below is a simplified description of our current call flow.
Call Flow
Caller
When the user initiates a call:
We do not use CallKit
The call is handled entirely using a custom in-app call UI
Callee
When the user receives a call:
Device locked or app in background
A VoIP push wakes the app
The app presents the CallKit incoming call UI
App in foreground
The server still sends a VoIP push
The app first reports the call to CallKit
After a very short delay, the app programmatically ends the CallKit call
Then a custom in-app call UI is presented via the app's long connection
The reason we always send a VoIP push (even when the app is in the foreground) is that we want to maximize call delivery reliability.
Selecting any option will automatically load the page