Application will not be launched because it failed to report an incoming call too many times (or repeatedly crashed.)

Hi,


I am developing iOS app which receives VoIP Push Notifications and next calls CallKit | Apple Developer Documentation to bring Incoming Call UI panel. From time to time however the app fails to start, with error as below logged into the device console:


default 10:29:04.933753+0200 callservicesd Application  will not be launched because it failed to report an incoming call too many times (or repeatedly crashed.)
default 10:29:04.933836+0200 callservicesd VoIP push for app  dropped on the floor


My question is: does anyone know if statistics about application crashes and/or "failed to report an incoming call" are stored locally on the device? Or perhaps collected on Apple servers and used for all instances of my app on all devices out there?


In case of the first scenario - does anyone know how to reset this stats on the device, so the Push Notification will be starting the app again?


In case the second scenario - is there any way to flag device to Apple server as "development" and have it excluded from the stats? So it doesn't affect "production" app instances out there?


Any help and suggestions very much appreciated.


Regards,

Chris

Replies

My question is: does anyone know if statistics about application crashes and/or "failed to report an incoming call" are stored locally on the device?


There isn't any specially handling of the crash itself, so a crash log is generated and it's processed in exactly the same way as any other crash log.


Or perhaps collected on Apple servers and used for all instances of my app on all devices out there?


No, nothing like that it is going.


In case of the first scenario - does anyone know how to reset this stats on the device, so the Push Notification will be starting the app again?


It will reset itself every ~24 hours but you can also reset it "manually" by either restarting the device or deleting and reinstalling the app.


In case the second scenario - is there any way to flag device to Apple server as "development" and have it excluded from the stats? So it doesn't affect "production" app instances out there?


Nothing like that is necessary. The behavior itself here is actually implemented entirely on the device itself, so our servers don't actually "know" that delivery ever stopped. If you look in the console log, you can actually see that the push always reaches the device normally and the system itself is simply not delivering the push to your app.


-Kevin

I have been testing iOS14Beta 8 and I made about 400 incoming VoIP Pushes in the space of an hour or so. For those incoming calls I got two cases of "Killing VoIP app because it failed to post an incoming call in time" even though my code does that.

I have logged that Issue in a separate Forum item ( https://developer.apple.com/forums/thread/653756) as I think that is a bug in iOS14Beta's as I have never seen that issue with iOS13.x

Anyway after the second failure all other incoming VoIP Pushes were blocked with

"Application will not be launched because it failed to report an incoming call too many times (or repeatedly crashed.)"

This happened about 33 hours ago..
  • I tried restarting the iPhone (as Kevin DTS suggested) but it did not help. Pushes were still blocked. So maybe that behaviour has changed since Kevin's post.

  • Every few hours I make a test call to the App but the VoIP Push is still ignored.. Kevin also suggested that it should allow Pushes through after ~24 hours.

It would be great if we could get clarification from Apple about the following

1) What does "in time" mean? When we get a VoIP Push my understanding is that you must offer the call to Callkit before you return form pushRegistry:(PKPushRegistry *)registry didReceiveIncomingPushWithPayload:(PKPushPayload *)payload forType:(PKPushType)type withCompletionHandler:(void (^)(void))completion. However is there a time limit from when you start running this routine? We need to do some preprocessing on the pushed data before offering the call

2) When will iOS block all further incoming calls? For example is it if you fail to offer two calls within an hour. Or is it if you fail to offer 2 calls period? If you fail to offer a call and then 3 days later fail to offer a call will that Block all further calls. What is the algorithm?

3) When VoIP Pushes are blocked then what needs to happen to allow then through again? Is it simply a time period? if I keep sending calls in does that reset that? IE. Do you need no incoming Pushes for 24 hours to clear it?

4) Is there a new Issue in iOS14Betas Please see the separate thread about that
https://developer.apple.com/forums/thread/653756

General Comment
It has been a lot of work and very difficult to change our code to always offer calls before returning from "didReceiveIncomingPushWithPayload" routine. I can understand why Apple insist on that and will kill the App.

HOWEVER I suggest that blocking all further incoming calls is a very very severe step to take.

In complex call handing situations where you may not have a perfect connection back to your VoIP Server and there are time lags etc it is impossible to avoid the situation in extreme circumstances where a VoIP Push arrives but you are not in a position to offer the call.

Apple's Callkit framework is far superior to the competition but this step makes it extremely difficult to make a reliable VoIP App. A VoIP App is useless if calls are blocked..

@DTS Engineer

"It will reset itself every ~24 hours but you can also reset it "manually" by either restarting the device or deleting and reinstalling the app."

(on iOS 16.6) neither deleting and then re-installing the app, nor restarting the phone, resets the "Application will not be launched because it failed to report an incoming call too many times".

Is there any other way to reset this (during development) other than wait 24 hours?