All posts

Calls that ring like real calls

Most messaging apps ring like notifications. Cyca rings like a phone call: full screen on a locked device, answerable without unlocking, with audio live the moment you swipe — even when the app was force-quit before the call arrived.

Why that is hard

An app that has been swiped away is not running. Nothing of ours is listening. Getting a call through means a push wakes the system's own calling layer first, and our code has to reach it in the seconds before iOS gives up — while the audio session, the network connection, and the user interface all come up at once, in the right order.

Get any of it wrong and the failure is silent. Not a crash, not an error — just a phone that never rings, or a call that connects with no sound.

One change per release

We have a rule for this part of the app: the call layer never receives bundled changes. One behavioural change, one release, tested on real hardware before the next one starts.

It sounds slow. It is much faster than the alternative, which we learned the expensive way: a release that bundled a new feature into the calling path passed every automated check and broke one-to-one calls for everyone. Automated checks freeze code. They cannot see two subsystems colliding at runtime.

Simulators cannot see it either. There is no telephony on a simulator, so the system's calling layer behaves differently there than on a phone in your pocket. For calls, push, camera and audio routing, our only evidence is a physical device.

What works today

  • Voice and video, audio both directions, on real phones.
  • A locked, force-quit phone rings natively and answers from the lock screen.
  • Hanging up stops the other phone ringing — including when it is locked or the app is dead.
  • Minimise a video call and it becomes a small floating window you can drag; the app underneath stays usable.
  • The call log stays populated while a call is live.

Share this post