Skip to main content
RingKit is configured statically under plugins.RingKit in capacitor.config. It must be static: on a killed app the JS layer isn’t alive when the VoIP push arrives, so the native side reads this config to brand and present the call.

Config keys

Payload mapping

RingKit doesn’t own your push transport — your backend/provider sends the push, RingKit consumes it. It reads the call fields out of whatever shape you send:
  • payloadPreset: "raw" (default) — read the fields from the payload directly (top-level unless overridden by payloadKeys).
  • payloadPreset: "onesignal" — first unwrap OneSignal’s custom.a envelope, then apply payloadKeys.
If your fields live under different names or nested paths, remap them with dot-paths:
The defaults are callId, handle, hasVideo, chatId, avatarUrl, type. No backend change is required beyond matching one of these shapes.

Remote cancel

If the caller hangs up before the callee answers, send the callee another push with the same callId and type equal to cancelType (default "cancel"). RingKit dismisses the ring — even on a killed device:
  • iOS — CallKit requires every VoIP push to report a call, so the cancel reports a brief, self-ending placeholder (a momentary missed-call entry) and ends the real ring. This flash is unavoidable per Apple’s rule.
  • Android — the FCM service tears the call surface down silently. Custom handlers branch on RingKitPayload.isCancel(dataMap, config) → RingKitIncomingCall.dismiss(context, callId).