Back to Skills

callkit

Implement VoIP calling with CallKit and PushKit. Use when building incoming/outgoing call flows, registering for VoIP push notifications, configuring CXProvider and CXCallController, handling call actions, coordinating audio sessions, or creating Call Directory extensions for caller ID and call blocking.

857stars43forksUpdated 7/9/2026

Security Assessment

Low Risk(85/100)

Detected risks:

Secret Exposure([SKILL.md] token =)
Security Score85/100

About callkit

A guide to building VoIP calling features that integrate with the native iOS call UI using CallKit and PushKit, targeting Swift 6.3 and iOS 26+. It covers incoming and outgoing call flows, VoIP push registration, audio-session coordination, and Call Directory extensions for caller ID and call blocking. Project setup enables the Voice over IP background mode, the Push Notifications capability, and, for caller-ID features, a Call Directory Extension target. A types table introduces CXProvider (reports calls and receives actions), CXCallController (requests start, end, hold, and mute actions), CXCallUpdate (call metadata), CXProviderDelegate (handles system actions and audio events), PKPushRegistry (VoIP push registration), and the iOS 26.4+ PKVoIPPushMetadata that signals whether a push must be reported. Provider configuration advises creating a single CXProvider at launch, kept alive for the app lifetime, with a CXProviderConfiguration describing capabilities (localizedName, supportsVideo, call-group limits, supported handle types, and recents inclusion). The incoming-call flow shows reporting a call to CallKit immediately via reportNewIncomingCall; required calls must be reported before the PushKit completion handler returns or the system terminates the app, and answering means preparing audio and fulfilling the CXAnswerCallAction only once the call is actually ready, failing and reporting ended on error. Outgoing calls are requested through CXCallController with a CXStartCallAction wrapped in a CXTransaction, then routed through the delegate, which reports startedConnecting and connected timestamps. The PushKit section explains registering at every launch, forwarding token changes to the server, and the report decision: on iOS 26.4+, PKVoIPPushMetadata.mustReport gates whether a CallKit (or LiveCommunicationKit) report is required before completion, while older delegates treat every VoIP call push as report-required. A table summarizes report decisions and completion timing across these paths. Remaining sections address audio-session coordination and the Call Directory extension and manager, plus common mistakes and a review checklist.

FAQ

What OS and language version does this target?

Swift 6.3 and iOS 26+, using CallKit and PushKit for native VoIP call integration.

When must an incoming VoIP call be reported?

Report required calls to CallKit immediately, before the PushKit completion handler returns, via reportNewIncomingCall; failing to do so causes the system to terminate the app.

How should I create the CXProvider?

Create a single CXProvider at app launch, keep it alive for the app's lifetime, and configure it with a CXProviderConfiguration describing your calling capabilities.

What does PKVoIPPushMetadata.mustReport control?

On iOS 26.4+, it gates reporting: true means you must report the call with CallKit or LiveCommunicationKit before completion, while false means no such report is required.

How are outgoing calls started?

Request them through CXCallController with a CXStartCallAction wrapped in a CXTransaction; the system routes the request through your CXProviderDelegate, where you report startedConnecting and connected timestamps.

All Files

3 files
SKILL.md18.4 KB
View
references/callkit-patterns.md12.4 KB
View
evals/evals.json4.4 KB
View

Install callkit

Download and extract the skill files to your .claude/skills/ directory.

Quick Setup:

  1. Copy the skill folder to .claude/skills/
  2. Claude will automatically detect and use the skill