
Callkit
Implement PushKit and CallKit incoming-call flows on iOS 26.x VoIP apps so pushes report correctly and APNs VoIP settings stay compliant.
Overview
CallKit is an agent skill for the Build phase that sketches and reviews PushKit plus CallKit incoming-call implementation for iOS 26.x VoIP apps.
Install
npx skills add https://github.com/dpearson2699/swift-ios-skills --skill callkitWhat is this skill?
- iOS 26.4+ PKVoIPPushMetadata delegate path with mustReport handling
- Fallback pushRegistry(_:didReceiveIncomingPushWith:for:completion:) for iOS 26.0–26.3
- CXProvider.reportNewIncomingCall before completing required PushKit handling
- APNs VoIP guidance: short apns-expiration (0 or a few seconds)
- Documents SDK requirement to use CallKit for PushKit VoIP and report-failure delivery risk
- Covers iOS 26.4 PKVoIPPushMetadata delegate and fallback through iOS 26.0–26.3
Adoption & trust: 1.2k installs on skills.sh; 713 GitHub stars; 3/3 security scanners passed (skills.sh audits).
What problem does it solve?
You are updating a VoIP app and need a correct PushKit-to-CallKit path across iOS 26.4 metadata APIs and older delegates without violating Apple's reporting rules.
Who is it for?
Indie iOS developers adding or hardening VoIP incoming-call handling on recent iOS 26 SDKs.
Skip if: Teams building Android-only VoIP, web RTC without native PushKit, or apps that never receive VoIP pushes.
When should I use this skill?
Updating an iOS VoIP app for PushKit/CallKit behavior, sketching incoming-call paths, or reviewing CallKit provider code for iOS 26.x.
What do I get? / Deliverables
You get an implementation outline with delegate choice, mustReport behavior, reporting order before PushKit completion, and APNs VoIP settings you can paste into your Swift project.
- PushKit + CallKit implementation outline
- Delegate and mustReport decision notes
- APNs VoIP header recommendations
Recommended Skills
Journey fit
VoIP call wiring is core product engineering when shipping a native iOS communications app, not a launch or ops-only task. CallKit and PushKit bridge Apple system frameworks and your app delegate—classic mobile platform integration work during implementation.
How it compares
Use for Apple CallKit/PushKit compliance detail instead of generic WebRTC or backend-only signaling guides.
Common Questions / FAQ
Who is callkit for?
Solo builders and small teams shipping native iOS VoIP apps who need PushKit and CallKit behavior spelled out for current iOS 26.x releases.
When should I use callkit?
During Build when wiring incoming calls, reviewing a CallKit provider delegate, or aligning APNs VoIP payloads with mustReport and completion ordering before Ship.
Is callkit safe to install?
Review the Security Audits panel on this Prism page and inspect the skill package before letting an agent apply changes to your telephony or push credentials.
SKILL.md
READMESKILL.md - Callkit
{ "skill_name": "callkit", "evals": [ { "id": 0, "prompt": "I'm updating an iOS 26 VoIP app for the latest PushKit behavior. Sketch the PushKit + CallKit incoming-call path for iOS 26.4 and earlier iOS 26.x, including when I can ignore a VoIP push, when I must report to CallKit, and the APNs server settings that matter.", "expected_output": "A source-grounded CallKit/PushKit implementation outline that prefers the iOS 26.4 metadata delegate, respects mustReport, keeps the older delegate as fallback, reports required calls before PushKit completion, and notes short VoIP push expiration.", "files": [], "expectations": [ "Uses the iOS 26.4+ PKPushRegistryDelegate method with PKVoIPPushMetadata when available.", "Checks PKVoIPPushMetadata.mustReport and explains that false means the app is not required to report the push to CallKit or LiveCommunicationKit.", "Keeps the older pushRegistry(_:didReceiveIncomingPushWith:for:completion:) path for iOS 26.0-26.3 or older deployment targets.", "Reports required VoIP call pushes with CXProvider.reportNewIncomingCall before completing PushKit handling.", "Mentions that apps built with the iOS 13 SDK or later must use CallKit for PushKit VoIP calls and repeated report failures can stop VoIP push delivery.", "Recommends apns-expiration 0 or only a few seconds for VoIP push requests." ] }, { "id": 1, "prompt": "Review this CallKit plan for mistakes: when the user taps Answer, call action.fulfill() right away and then connect WebRTC; start the audio engine before provider(_:didActivate:); send another VoIP push if the caller hangs up; for encrypted payloads, always use CXProvider.reportNewIncomingVoIPPushPayload from a notification service extension.", "expected_output": "A correction-focused review that defers answer fulfillment until connection succeeds, waits for CallKit audio activation, uses the app-server connection after the initial push, and limits reportNewIncomingVoIPPushPayload to Apple's documented encrypted-metadata case.", "files": [], "expectations": [ "Explains that CXAnswerCallAction should be fulfilled after the server/media connection is established and failed or ended if connection fails.", "States that the audio engine should start only after provider(_:didActivate:) and should stop on provider(_:didDeactivate:).", "Routes hangups and call-detail updates over the existing app-server connection after the initial VoIP push instead of sending more VoIP pushes.", "Limits CXProvider.reportNewIncomingVoIPPushPayload to notification service extensions that decrypt payloads when the server cannot tell whether content is a VoIP call or other data.", "Mentions that reportNewIncomingVoIPPushPayload requires the com.apple.developer.usernotifications.filtering entitlement.", "Does not turn the answer into a generic APNs notification permission or rich-notification guide." ] }, { "id": 2, "prompt": "I need caller ID and call blocking for a spam filter, plus iOS 26 call translation and normal APNs auth-key rotation. Can the Call Directory extension look up each caller from my API as calls arrive? What belongs in CallKit and what should move to another skill?", "expected_output": "A boundary-aware answer that keeps Call Directory and CallKit call-translation behavior in scope, rejects per-call lookup, uses sorted country-code phone numbers and settings/status APIs, and routes generic APNs auth-key rotation to push notification guidance.", "files": [], "expectations": [ "States that Call Directory extensions load bulk caller ID/blocking data in beginRequest(with:) and are not invoked for per-call web lookups.", "Represents CXCallDirectoryPhoneNumber as country code followed by digits and requires sorted or sequential entries.", "Mentions checking ex