An issue with the CallKit UI, specifically regarding the functionality of the speaker button.
When a user initiates a video call with CallKit and then, using the existing CallKit session, initiates an audio call, there are no issues with CallKit or the audio.
However, if the user terminates the video call from the CallKit UI, the active CallKit session ends. To resume the ongoing audio call, we report a new CallKit call upon the end call trigger. While there are no issues with this reporting, the CallKit UI does not provide an audio route for the built-in receiver, and the speaker button remains unresponsive.
IPA was build on SDK 18 and running on iOS beta 26.
Issue is NOT seen with SDK18 and running iOS 18.x or lower devices.
Feedback - FB18855566
CallKit
RSS for tagDisplay the system-calling UI for your app’s VoIP services and coordinate your calling services with other apps and the system using CallKit.
Posts under CallKit tag
158 Posts
Selecting any option will automatically load the page
Post
Replies
Boosts
Views
Activity
Hello,
I’m new here. I'm developing an iOS app and I’d like to know whether it is possible to detect if a phone call is being recorded by another app running in the background.
I’ve already reviewed the documentation for CallKit and AVAudioSession, but I couldn’t find anything related. My expectation was that iOS might provide some callback or API to indicate if a call is being recorded (third-party apps), but so far I haven’t found a way.
My questions are:
Does iOS expose any API to detect if a call is being recorded?
If not, is there any indirect, Apple's policy compliant method (e.g., microphone usage events) that can be relied upon?
Or is this something that iOS explicitly prevents for privacyreasons?
Expecting solutions that align with Apple’s policies and would be accepted under the App Store Review Guidelines.
Thanks in advance for any guidance.
I added a extension called Call Directory to an IOS app as we want to call blocking and caller id. I was able to add App Groups to both runner and CallDirectory. I cannot see of add Call Directory capability. Am I missing something. I added the extension through the Call Directory Target template. If I try to add this to CallDirectory.enitlements manually com.apple.developer.callkit.call-directory
call-blocking
caller-identification
i recieve this signing error. Provisioning profile "iOS Team Provisioning Profile: "" doesn't include the com.apple.developer.callkit.call-directory entitlement. I cannot add Call Directory to an identifier in Apple Developer either.
We are currently developing a VoIP application that supports Local Push extention.
We discovered an issue with this app where the performEndCallAction response to reportCallWithUUID is occasionally slow.(See below for detail)
It usually works without any issues, so we believe there is no problem with the app's processing flow.
This issue only occurs very rarely, but each time it does there is a delay of about 60 seconds,
which leads us to suspect that there is some kind of problem on the iOS side, and that fail-safe processing is occurring after 60 seconds.
Do you know of a workaround for this issue?
iOSアプリでNEAppPushSessionを使い、NEAppPushDelegateの通知を受けてCallKitの着信画面を表示する実装をしていますが、以下の問題に直面しています。
8/13
ログにて下記のエラーが頻発しました。
通知の受け取りテストを約120回してその間ずっとこのエラーが出ていました。
エラー 2025-08-14 11:27:06.793073 +0900 nesessionmanager NESMAppPushSession[SimplePushDefaultConfiguration:7B7218F3-94B5-4AE5-9B9E-94E176694D02] failed to report incoming call to CallKit, error: Error Domain=NSCocoaErrorDomain Code=4099 "The connection to service named com.apple.callkit.networkextension.messagecontrollerhost was invalidated from this process." UserInfo={NSDebugDescription=The connection to service named com.apple.callkit.networkextension.messagecontrollerhost was invalidated from this process.}
このエラーログが頻発した後、callkitの通知画面が表示されなくなりました。
ですがどうやら通知の監視は開始しているようです。
15時間後の8/14
時間をあけたからか、再度通知が来るようになりました。
ですが再度通知の受け取りテストを行った時に同じエラーログが出ました。
再度通知テストを約120回程行ったら、このエラーログが頻発した後、callkitの通知画面が表示されなくなりました。
ですがどうやら今回も通知の監視は開始しているようです。
15時間後の8/15
今日は15時間かけても通知を取得できませんでした。
ですが同じく通知の監視は開始していそうです。
iPhoneの再起動、Xcodeのクリーンアップ、アンインストールして再インストールなどしても通知は来ないままでした。
また、不思議なことに通知が来ない事象が起きた端末以外でも同じように通知を取得することができません。
他の通知は受け取ることができますが独自の通知であるNEAppPushManagerだけ通知を取得することができません。
質問です。
再度通知を出すためには何をすれば良いでしょうか。
この事象は4099エラーを出しすぎたことにより発生する障害なのでしょうか。
4099エラーを出ている原因は何でしょうか。
Topic:
Accessibility & Inclusion
SubTopic:
General
Tags:
User Notifications
PushKit
CallKit
Push To Talk
I am currently implementing VoIP push notifications in my iOS app using PushKit. On iOS 18, I am able to receive VoIP notifications successfully when the app is in the foreground. However, when the app is in the background or in a terminated (kill) state, the notifications do not arrive.
In earlier iOS versions, my existing implementation worked as expected across all app states. This issue seems to have started after testing on iOS 18, which appears to have introduced stricter permission or background execution requirements.
Questions:
Has iOS 18 introduced new permission requirements or entitlements for VoIP push notifications?
Do I need to explicitly request a new type of user permission for VoIP notifications?
Are there additional background modes, Info.plist keys, or PushKit changes required for VoIP to work in background and terminated states on iOS 18?
Additional Information:
. Foreground: Works fine, pushRegistry(_:didReceiveIncomingPushWith:for:completion:) is triggered.
. Background/Terminated: No call to the above delegate method.
. Using correct voip push type in the payload.
. PushKit is configured in AppDelegate.
. Background modes for "Voice over IP" and "Background Processing" are enabled.
. Using a real device with iOS 18 for testing (not simulator).
Any guidance or updated documentation references for handling VoIP pushes in iOS 18 would be greatly appreciated.
I’m currently developing a spam number blocking app using CallKit.
I’ve confirmed that up to iOS 26 beta 5, there is a bug where number blocking doesn’t work.
In my current tests, the ringtone doesn’t sound and the blocking works fine, but the call still appears in the missed calls list, which is bothersome.
If the bug is fixed in future versions (as it was in previous versions), is there a way to block the number so that it also does not appear in missed calls?
Good afternoon,
Our team is currently developing a mobile application that includes video call functionality, and we are seeking the optimal approach to enable incoming calls on iOS devices.
Ideally, we would like calls to be delivered even when the app is completely closed or after the device is restarted. As I understand it, this may require obtaining VoIP permissions; otherwise, calls may only work when the app is open or running in the background.
I would appreciate it if you could confirm my understanding and advise me on the steps or requirements for obtaining the appropriate permissions.
Currently, when I try to launch the app in XCode, I see an error (screenshot).
After updating to iOS 18.5, we’ve observed that outgoing audio from our app intermittently stops being transmitted during VoIP calls using AVAudioSession configured with .playAndRecord and .voiceChat. The session is set active without errors, and interruptions are handled correctly, yet audio capture suddenly ceases mid-call. This was not observed in earlier iOS versions (≤ 18.4). We’d like to confirm if there have been any recent changes in AVAudioSession, CallKit, or related media handling that could affect audio input behavior during long-running calls.
func configureForVoIPCall() throws {
try setCategory(
.playAndRecord, mode: .voiceChat,
options: [.allowBluetooth, .allowBluetoothA2DP, .defaultToSpeaker])
try setActive(true)
}
I'm integrating Twilio Voice (v6.12.1) into my React Native app (using Swift bridging for iOS) and have implemented full VoIP, PushKit, and CallKit support for incoming calls.
✅ What works:
Incoming calls trigger the VoIP push and display the full-screen CallKit interface (or fallback UI).
Decline Call works as expected.
Call logs and events print correctly.
❌ Problem:
When I try to accept the call using the CallKit Accept button or React Native fallback UI, I consistently get:
❌ [TwilioVoiceModule] answerCall() callInvite is missing.
I also noticed that the console logs for answerCall() are being printed three times in a row, even though the accept button is only pressed once. Additionally in the first time console, answerCall() CallInvite found, accepting...
🔍 Observations:
The callInvite is properly received when the VoIP push arrives.
But when answerCall() is triggered, callInvite becomes nil.
This happens in CallKit accept, RN UI accept, and even notification banner accept.
📦 How it's set up (summarized):
PushKit Registration – via PKPushRegistry in AppDelegate.swift
VoIP push handling – forwards payload to TwilioVoiceModule.handleIncomingPush()
CallKit integration – uses CXProviderDelegate to report and handle accept actions
JS Bridge – emits acceptCallAction to JS
React Native calls TwilioVoiceModule.answerCall(uuid, callSid)
In answerCall() method: self.callInvite is nil – so call cannot be accepted.
Attaching the link to view the relevant code: https://docs.google.com/document/d/15pNjKrfk954OaotpMIEh3xQUtst---1K45DBXoYctGM/edit?usp=sharing
💡 Call Accept Flow (iOS):
VoIP Push → TwilioVoiceModule.handleIncomingPush()
Twilio SDK creates callInvite
reportNewIncomingCall() triggers CallKit UI
On accept: CXAnswerCallAction → emits event to JS
RN calls TwilioVoiceModule.answerCall(uuid, callSid)
Problem: callInvite is already nil
❓ What I'm trying to understand:
Why is callInvite becoming nil before answerCall() is called?
Why are the logs showing the answerCall() call 3 times?
Is there a race condition or multiple accept triggers?
Should I ensure callInvite is accepted only once across all 3 accept paths?
**
💬 Any help would be appreciated.**
📱 Environment:
React Native 0.78.x
iOS 17+
Swift bridging with TwilioVoiceModule.swift
Twilio Voice SDK 6.12.1
PushKit + CallKit + react-native-callkeep
Hi team,
With regards to Call (Live) Translations on VOIP:
Is it possible to invoke live translations within the app? (without going into the Call System UI)
Is it possible to navigate users from app to Call System UI via an API? (and also invoking the new live translations directly)
Will Apple support more languages apart from the current ones? (Currently I see 4 supported languages)
Hi
I'm novice developer.
I’m currently developing a phone number blocking app using a Call Directory Handler Extension.
The blocking feature works perfectly on iOS 18.5, but it doesn’t seem to function properly on iOS 26 beta 4.
The extension is invoked, and the numbers are passed correctly, but incoming calls are not being blocked as expected.
Is there a known issue with CallKit or Call Directory Extensions on iOS 26 beta 4
can i block number on my app with callkit if the number already exists as a contact? Or i can only block number that are not on the contact list ?
https://developer.apple.com/documentation/callkit/preparing-your-app-to-be-the-default-calling-app
I have 2 accounts, one for App store and one for tesing (Inhouse type).
I added the capability in the Xcode project, and can run it.
But when I run a Inhouse build for it on my CI server, it failed.
So is the Inhouse build support this "com.apple.developer.calling-app"?
My app support ringout feature, when set Ringout, all the calls in my app will go to native, by using tel://***.
But when my app set as the default calling app by the user. Then when user make a call from Contact, it will jump to my app, but app will will route this call to native.
So there is a issue for this, then the quesion is:
How to check if my app is set as default calling app?
When User restarted iOS device, after powering on iOS App is not able to get VoIP push notification. If user opens App, immediate VoIP push receiving.
In Normal (App Kill or Background state) everything works as expected. Issue is when device is powered on and immediately( In 1-2 mins) try to call on device.
We are using delegate to show Call to User
public func pushRegistry(_ registry: PKPushRegistry, didReceiveIncomingPushWith payload: PKPushPayload, for type: PKPushType, completion: @escaping () -> Void)
Hi Team,
We are encountering issues while implementing the live translation feature in our VoIP application using CallKit on iOS 26.0. Specifically, we are attempting to use the CXSetTranslatingCallAction transaction to enable translation programmatically during an active call.
However, executing this transaction results in the following error:
"Couldn't communicate with a helper application."
This occurs consistently when we attempt to trigger the translation setup without user interaction. We are seeking clarification on the following points:
Is it possible to enable CallKit's live translation feature using CXSetTranslatingCallAction purely programmatically, without requiring the user to interact with the system-provided Call UI?
What does the above error indicate in the context of CXSetTranslatingCallAction? Are there specific conditions, entitlements, or background service requirements that must be fulfilled to communicate with CallKit?
Code snippet:
let translationAction = CXSetTranslatingCallAction(call: callUUID, isTranslating: true, localLocale: Locale.init(identifier: "es-ES"), remoteLocale: Locale(identifier: "en-US"))
let transaction = CXTransaction(action: translationAction)
callController.request(transaction)
We would deeply appreciate any guidance you can provide regarding the feasibility of our approach and how to address this error.
Thank you for your support.
I've run Speakerbox(https://docs-assets.developer.apple.com/published/8e99045a90e2/MakingAndReceivingVoIPCallsWithCallKit.zip) to check the behavior of CallKit.
When there was one active call and one on hold and another call was received, the behavior was defferent depending on whether I operated it from a headset or not.
No headset or operated from CallKit screen
When "End & Accept" tapped: the active call is hung up, and the received call is answered.
When "End Held & Accept" tapped: the held call is hung up, the active call is held, and the received call is answered.
Operated from headset
Answer opeation cannot be performed for unknown reasons
Disconnect operation caused that all calls other than the one on hold are hung up and the held call is unheld.
Hold operation caused that the active call is held and the received call is answered. (Strangely, there are two held calls.)
And when I toggle calls at this time, one of the two on hold is hung up for unknown reasons.
I tried changing the settings of CXProviderConfiguration and CXCallUpdate, and changing the options in the Audio Session category, but it did not improve.
I checked CXActions occurring, and it was as follows.
(Call A = held call, Call B = active call, Call C = received call)
Disconnect (or Answer?) operation
(lacking CXEndCallAction for Call A)
CXEndCallAction for Call B
CXAnswerCallAction for Call C
CXEndCallAction for Call C <- weird
CXSetHeldCallAction for Call A onHold=false
Hold operation
(lacking lacking CXEndCallAction for Call A)
CXSetHeldCallAction for Call B
CXAnswerCallAction for Call C
Toggle calls
CXSetHeldCallAction for Call C onHold=true
CXSetHeldCallAction for Call A onHold=false
CXSetHeldCallAction for Call B onHold=false <- weird
CXEndCallAction for Call B
Hi Team,
We are currently working on phone number lookup functionality for iOS 18 and have a few queries:
When the extension sends a request to our backend server using the PIR encryption process, is the user's phone number visible to our server?
I found this api may fail after iOS18.0
open func request(_ transaction: CXTransaction, completion: @escaping ((any Error)?) -> Void)
But I can not reproduce it and it will recover after relaunch the app.
Is there any issue for this or guide line after iOS18?