PKPushRegistry for VoIP pushes and reports the call to
CallKit synchronously from its PushKit delegate — so the native call screen appears even when
the app is terminated. No AppDelegate wiring is required.
1. Capabilities
In Xcode → Signing & Capabilities, add:- Push Notifications
- Background Modes → Voice over IP and Audio, AirPlay, and Picture in Picture
2. Info.plist
The microphone usage string is required because the in-call audio module uses
.playAndRecord. A ring-only app that never captures audio can set manageCallAudio: false
or callAudioMode: 'observe' — see In-call audio.3. Send the VoIP push
RingKit emits the VoIP token via theregistration event. Send VoIP pushes with a VoIP
Services APNs authentication key (.p8) or certificate:
Payload (default
payloadPreset: "raw"):
apsEnvironment routing
Theregistration event carries apsEnvironment (development | production), read from the
embedded provisioning profile. Use it to route the VoIP token through the matching APNs gateway
(or the right OneSignal test_type) — a sandbox token routed as production never rings.
OneSignal
SetpayloadPreset: "onesignal" and RingKit unwraps OneSignal’s custom.a envelope. Register
the emitted VoIP token with your OneSignal VoIP app.
Notes
- PushKit VoIP pushes do not fire on the iOS Simulator — test the wake path on a real
device. The CallKit UI itself can be exercised in the simulator via
reportIncomingCall(...). - CallKit needs no special entitlement beyond Push Notifications.
- The provider name on the CallKit screen is the app’s own display name — iOS does not allow
overriding it at runtime, so the
appNameconfig applies to Android only.
Testing
Read the VoIP token fromregistration, then run the ready-made
example/scripts/send-voip-ios.mjs sender with your .p8 key (topic <bundle>.voip,
apns-push-type: voip). The call screen must appear with the app terminated. See the
plugin’s docs/TESTING.md for the full device matrix.