Hi,
I have some scenario in which I need to reportIncoming to CallKit with same UUID 2 times. So I just need to know that, it will cause an issue of CallKit or with application.
So, first and foremost, if you haven't already, then you should adopt the new PushKit delegate we just added. That's the "proper" solution to these issues, as it will allow you to simply skip any call you’re not obligated to report.
Similarly, if that delegate returns "mustReport", then I would suggest just reporting the call with a new UUID. The checks are structured in such a way that I don't think there's ANY way you could actually get this to happen:
- PKVoIPPushMetadata.mustReport=true
AND
- The call to fail with callUUIDAlreadyExists
Yes — CallKit will return callUUIDAlreadyExists on the second report, which suppresses the second ring. However, on iOS 16+ we observed that the duplicate reportNewIncomingCall still produces a brief banner flash (~80–120 ms on A13-class silicon) before CallKit rejects it.
Did you file a bug on this and, if so, what's the bug number? When we first introduced this "trick", callservicesd was dropping the duplicate call as soon as it arrived so the rest of the call infrastructure never even saw the call. Any sort of glitch like you're describing indicates that there is something very odd going on.
Next, looking over the post you linked to (interesting write-up, BTW), I have a few comments:
Dual-path delivery: your backend must send BOTH a PushKit VoIP push AND an ordinary alert push (APNs alert, FCM, etc.) for the same call.
Why are you doing this? A standard alert push and VoIP push have basically IDENTICAL delivery behavior. More to the point, how is the standard alert push helping your app? It won't wake your app, so you'll either end up:
-
Posting an alert you don't need (because your app was asleep).
-
Receiving the push in-app... because callservicesd woke your app up to handle the VoIP push!
Note that these issues can easily make it seem like push latency it higher/lower/different than it really is, as differences in infrastructure timing swamp relatively small differences in actual arrival time.
Note that this:
The two pushes travel over different APNs topics (VoIP vs alert), arrive on independent TCP connections,
...is false. Both push types are received by APNs over the same network connection. This is visible in the console log if you know what to look for.
and are dispatched into different iOS delivery pipelines.
This is true. VoIP pushes are routed to callservicesd while standard pushes are routed to the standard push infrastructure.
Many production apps do this intentionally for reliability — VoIP has a hard rate limit (~3/min on iOS 13+) and alerts are the safety net.
What?? Where have you heard of this? And have you filed bugs? I have no idea where this idea would have come from but I'm not aware of any such limit and it's totally the opposite of my own experience. In particular:
-
The primary reason the iOS 13 call reporting requirements were introduced was widespread PushKit behavior that could charitably be described as "bonkers". So apps were generating 100+ pushes/minute for EVERY call report.
-
Between iOS 13 and 14, a number of small timing bugs in callservicesd enforcement mechanism were found by a developer whose testing harness was... unique. My favorite example was an invalid termination which was reliably reproduced by repeating the voip push-> call report-> end call immediately cycle every 7s (no more, no less)... for several HOURS.
As I said, I don't know where this idea came from but it's not true and never has been. As long as you report a call as the system requires, you can send as many VoIP pushes as you want.
__
Kevin Elliott
DTS Engineer, CoreOS/Hardware