Display the system-calling UI for your app’s VoIP services and coordinate your calling services with other apps and the system using CallKit.

CallKit Documentation

Posts under CallKit tag

83 Posts
Sort by:
Post not yet marked as solved
0 Replies
373 Views
iOS 17 enables video call "Reactions" by default and this is not appropriate for our app that uses CallKit for video calls. Is there an option we can utilise to disable this functionality for our app?
Posted Last updated
.
Post not yet marked as solved
0 Replies
497 Views
In the app, I have VOIP functionality along with AVPlayer for playing videos from remote URLs. Once a VOIP call is established, AVPlayer gets AVPlayerRateDidChangeReasonSetRateFailed right after AVPlayerRateDidChangeReasonSetRateCalled in AVPlayer.rateDidChangeNotification observer when trying to start a video using the play() method. As a result, the video does not start. Checked AVAudioSession.interruptionNotification, it is not getting fired. AVPlayer functionality works as expected before and after the call. Issue observable on iOS 17 only. Any help would be appreciated.
Posted Last updated
.
Post not yet marked as solved
4 Replies
2.4k Views
i have a problem when answering call on via callkit ui if my app is in lockscreen and killed state. I am currently using skyway for the audio and video call issue description when the call receiveranswersr the via callkit ui , the receiver will not receive an answer till he will visit the app . this issue doesn't happen on ios 15 version
Posted
by fdcMartin.
Last updated
.
Post not yet marked as solved
3 Replies
822 Views
I did an SwiftUI app where I use AudioSession, AVAudioPlayer and CallKit. I want to play small sounds when pressing a button during the active call, but apparently it is not possible on iOS 17. This was working on previous iOS versions. I tried already all the different audio session categories and modes and nothing seems to work. I tried to find for change logs or relevant docs / issues talking about this but I was unable to find any reference. Expected: Init call, play sound, hear sound. Actual: Init call, play sound, don't hear nothing. Without the active call, I can hear the song. Am I doing or understanding something wrong? What could possibly be happening? Thank you and appreciate if someone can provide an insight on this!
Posted Last updated
.
Post not yet marked as solved
4 Replies
1.2k Views
Occasional issues for iOS 17, when call mute in callkit, system will auto mute/unmute many times, see the log for iOS 17, and iOS 16 is normal. iOS 17: {code} 2023-07-31 17:22:54.302 CST : [app] CallKitManager.swift:293:muteMeeting(_:muted:ignoreCallback:):muteMeeting muted:true 2023-07-31 17:22:54.468 CST : [app] CallKitDelegate.swift:119:provider(:perform:):provider CXSetMutedCallAction isMuted: true 2023-07-31 17:22:54.996 CST : [app] CallKitDelegate.swift:119:provider(:perform:):provider CXSetMutedCallAction isMuted: true 2023-07-31 17:22:55.037 CST : [app] CallKitDelegate.swift:119:provider(:perform:):provider CXSetMutedCallAction isMuted: false 2023-07-31 17:22:55.088 CST : [app] CallKitDelegate.swift:119:provider(:perform:):provider CXSetMutedCallAction isMuted: true 2023-07-31 17:22:55.180 CST : [app] CallKitDelegate.swift:119:provider(:perform:):provider CXSetMutedCallAction isMuted: false 2023-07-31 17:22:55.222 CST : [app] CallKitDelegate.swift:119:provider(:perform:):provider CXSetMutedCallAction isMuted: true 2023-07-31 17:22:55.300 CST : [app] CallKitDelegate.swift:119:provider(:perform:):provider CXSetMutedCallAction isMuted: false 2023-07-31 17:22:55.335 CST : [app] CallKitDelegate.swift:119:provider(:perform:):provider CXSetMutedCallAction isMuted: true 2023-07-31 17:22:55.429 CST : [app] CallKitDelegate.swift:119:provider(:perform:):provider CXSetMutedCallAction isMuted: false 2023-07-31 17:22:55.476 CST : [app] CallKitDelegate.swift:119:provider(:perform:):provider CXSetMutedCallAction isMuted: true 2023-07-31 17:22:55.566 CST : [app] CallKitDelegate.swift:119:provider(_:perform:):provider CXSetMutedCallAction isMuted: false {code}
Posted
by SandyPan.
Last updated
.
Post not yet marked as solved
3 Replies
2.1k Views
I have an app which uses the Call Directory Extension to identify callers. It has been downloaded a few hundred times and a small percentage of users are reporting this error. They are logged in to the app but when they go to phone -> settings -> call blocking & identification they get one of two error messages. "An error occurred while attempting to enable app." "Failed to request data for app. You may try enabling the extension again and if the problem persists contact the application developer." I'm not sure how this could be an issue with the app because it works for the majority of users. Furthermore users still experience the error when I ask them to log in with a test account. One user even reported that they could enable it in settings but a little while later it will disable itself. I have seen similar posts where it's been suggested that the error may be due to bad data (out of order, duplicate contacts, etc) but this error shows before the app even begins to load the data. Does anyone know under what conditions this error popup shows? Many thanks
Posted
by lukevdp.
Last updated
.
Post not yet marked as solved
0 Replies
442 Views
Hi, I have an application that blocks entry calls from commercial companies (using CallKit) and since the iPhone 15 release I have a lot of people that they have problems activating the extension in Settings - Phone - Block ID Calls (all people have an iPhone 15 with any version), I download Xcode15 and the last versions of iOS 17 (including betas) and in my iPhone14 Pro I can't reproduce this error, in the settings simulator, the option doesn't exist, I don't know what happened, and I can't find any information about this problem. Has anyone had problems like this? Thanks in advance.
Posted
by Knetdemar.
Last updated
.
Post not yet marked as solved
2 Replies
412 Views
I have a financial app which should work only when a the registered phone number is there in device, so after login to app and if the user removes the SIM, the app should indicate that the app will conitnue to work only if that particular registered phone number(SIM) is there.
Posted Last updated
.
Post not yet marked as solved
1 Replies
472 Views
I have created VOIP IOS app in Xamarin, I have registered pushkit in the AppDelegate's didFinishLaunchingWithOptions and have implmented PKPushRegistryDelegate's didReceiveIncomingPushWithPayload:forType:withCompletionHandler and immediately report to call kit and invoke the completion handler. However whenever I receive a VOIP push after device boot I get these console logs: default 15:24:32.153522-0400 callservicesd Invalidating process assertion for bundle ID <private> from timeout error 15:24:32.154786-0400 callservicesd Killing VoIP app <private> because it failed to post an incoming call in time. It kills my app BEFORE I have a chance to report it to call kit since it DOESN'T enter the didReceiveIncomingPushWithPayload:forType:withCompletionHandler. However if I wait 2+ minutes after device boot to send a VOIP APN Push I will receive the VOIP push, it will enter didReceiveIncomingPushWithPayload:forType:withCompletionHandler and report it to call kit just fine. I don't understand why this is the case and how to fix it. I have been told to make the app just like What's App so my app must be able to receive incoming voip push at any point the device is on. Is this an issue with the device? I have been testing on a iPhone 7 Plus on version 15.7.1. Is this a internet connection issue? Could it be something else? Is there an explanation for this behavior and is there any solutions? Thank you very much
Posted Last updated
.
Post not yet marked as solved
3 Replies
1.5k Views
We are implementing PushKit/CallKit for audio video calls. When the app starts, it immediately in AppDelegate-didFinishLaunchingWithOptions create the PKPushRegistry, set the delegate and ask for the token with desiredPushTypes and upload the token to our backend when PKPushCredentials are received. Then when didReceiveIncomingPushWith is called, it directly reports the call to CallKit. That works fine on all devices, with the app in foreground, background, killed etc.. But on one slow device (iPhone 7, iOS 15.6.1) when the app has been killed for some time, the app do not receive anymore the token. Then at some point PushKit doesn't wake the app anymore, as CallKit was not notified. According to the console logs by filtering callservicesd, the time between receiving the PushKit notification being received and delivering the token changes a lot, and then can timeout: Successful call: default 15:00:58.181051+0200 callservicesd Received incoming APS message from application with bundle identifier <private> and topic <private> // ... default 15:01:00.627903+0200 callservicesd Delivering token <private> to application <private> So 2 seconds. Failing call: default 14:13:20.325371+0200 callservicesd Received incoming APS message from application with bundle identifier <private> and topic <private> // ... default 14:13:28.827702+0200 callservicesd Delivering token <private> to application <private> // ... default 14:13:32.325062+0200 callservicesd Invalidating process assertion for bundle ID <private> from timeout 8 seconds. Even if "callservicesd Delivering token" is written in the logs, the app do not receive it. Then for the failing call, as didUpdate pushCredentials and didReceiveIncomingPushWith are not called, the app get killed: default 14:13:32.326334+0200 runningboardd Invalidating assertion 33-134-19180 (target:[application<myAppId>:1363]) from originator [daemon<com.apple.telephonyutilities.callservicesd>:134] default 14:13:32.393456+0200 runningboardd Received termination request from [daemon<com.apple.telephonyutilities.callservicesd>:134] on <RBSProcessPredicate <RBSProcessIdentityPredicate| application<myAppId>>> with context <RBSTerminateContext| domain:10 code:0xBAADCA11 explanation:<no explanation given> reportType:CrashLog maxTerminationResistance:Interactive> error 14:13:32.404027+0200 callservicesd Killing VoIP app <private> because it failed to post an incoming call in time. Is there any way to make sure that the token and the VoIP push will be delivered in time and not be killed by iOS, even on slow device?
Posted
by md_td.
Last updated
.
Post not yet marked as solved
5 Replies
1.6k Views
I have two call directory extensions, each with InfoPlist.strings in en.lproj and nb.lproj directories. In these files I've defined CFBundleDisplayName for both locales. These names are displayed under Settings -> Phone -> Call Blocking & Identification. On iOS 12.2 the names are displayed correctly in both Norwegian and English. Testing on iOS 15.3 the English names are displayed even when device language is set to Norwegian. Worth noting: When updating the English versions of CFBundleDisplayName this is immediately reflected in Call Blocking & Identification page with Norwegian device language. As this feature requires a real device, I'm unable to test on iOS 13 and 14.
Posted Last updated
.
Post not yet marked as solved
0 Replies
452 Views
I need a custom UI/visuals for voice calls, but I'm having a hard time getting it working. I'm basing the project off of the example SpeakerBox-Watch project, which has custom UIs for calls in the iOS project, but seems to just use the system UI in the WatchOS project. I would simply like to show an image while the call is happening, and hide the image when the call has been terminated. Is there any way to do this Using CallKit on WatchOS, or simulate something similar using the streaming audio? I've attempted to get around this with pure HTTP requests in an app which is recording audio, instead of web sockets and callkit, but the latency/behavior is not acceptable for voice calls.
Posted
by mhopke2.
Last updated
.
Post not yet marked as solved
1 Replies
470 Views
Hi, Is CallKit going to be brought as a framework for macOS 14 as well? Which library is recommended for being able to integrate native VoIP calling on macOS? Best regards, Elöd
Posted Last updated
.
Post not yet marked as solved
0 Replies
393 Views
Our iOS app is using CallKit to receive VoIP notification and using Per App VPN to access custom HTTP REST API located in private network. VPN is required to access the custom HTTP REST API and to resolve the API server name. Currently we have issues with receiving notifications when the Per App VPN is not connected. After the notification is received and AppDelegate wakes up, the custom HTTP REST API calls are executed while waiting for the user's interaction. At the timing of this HTTP REST API Call , the server name resolution fails and the app crashes. From the user's point of view,Incoming Calling Report screen disappears in about 2 seconds. Expected results: HTTP REST API call to succeed and the app not to crash. I want to know following. Is the communication triggered by AppDelegate not subject to activation Per App VPN? The behavior of this phenomenon does not appear to activate Per App VPN. Is it possible to explicitly start VPN from App code and wait for it to ready?
Posted
by noka.
Last updated
.
Post not yet marked as solved
0 Replies
469 Views
I've been successfully using CXProvider.reportNewIncomingVoIPPushPayload() as follows: a (non VoIP) push is sent to the handset this is intercepted by a notification service extension the extension calls CXProvider.reportNewIncomingVoIPPushPayload() (the extension has the required com.apple.developer.usernotifications.filtering entitlement) this results in the app delegate's implementation of PKPushRegistryDelegate:didReceiveIncomingPushWithPayload getting called (the app is launched if terminated) This all works as expected, in particular when the app is terminated it still works. However its suddenly stopped working since my phone got updated to iOS 16.6 (I can't remember exactly what was on it previously, 16.5 or 16.4). Now with iOS 16.6 the behavior is that PKPushRegistryDelegate:didReceiveIncomingPushWithPayload() only gets called if the app is not terminated. If the app is terminated then calling CXProvider.reportNewIncomingVoIPPushPayload() results in the app getting launched and didFinishLaunchingWithOptions() getting called BUT didReceiveIncomingPushWithPayload() is not called when launching from a terminated state. As a consequence of didReceiveIncomingPushWithPayload() not getting called, the app isn't calling reportNewIncomingCallWithUUID() and so after a few runs the OS stops launching the app entirely saying: "Application will not be launched because it failed to report an incoming call too many times". When didFinishLaunchingWithOptions() is called the launchOptions are nil, i.e. there is no way to distinguish the app from being launched as a consequence of reportNewIncomingVoIPPushPayload()(*) being called and therefore it is not possible to call reportNewIncomingCallWithUUID(). So this feature is totally broken apparently from previous behavior. Any comment? TIA (*)Well actually, the extension could write a flag to a shared group and the app read that on launch, but what a hack, and should be unnecessary.
Posted
by mungbeans.
Last updated
.
Post not yet marked as solved
0 Replies
356 Views
In WWDC 2016 Session 230 (https://wwdctogether.com/wwdc2016/230) they show the incoming Voip call screen (at time 02.59) with an image covering the entire call screen. How is that achieved?
Posted
by mungbeans.
Last updated
.
Post not yet marked as solved
3 Replies
1.7k Views
Hi Folks, I'm currently working on video conferencing app and use AVRoutePickerView for output device selection. Since iOS 16 release it started to display incorrect names for ear-piece and speaker options. For both of them the name is iPhone (before it was iPhone/Speaker) Output changes works correctly but display names confuse. Here is my audio session configuration:     private func configureSession() {         let configuration = RTCAudioSessionConfiguration.webRTC()         configuration.category = AVAudioSession.Category.playAndRecord.rawValue         configuration.categoryOptions = [.allowBluetooth, .allowBluetoothA2DP, .duckOthers, .mixWithOthers]         let session = RTCAudioSession.sharedInstance()         session.lockForConfiguration()         do {             try session.setConfiguration(configuration)         } catch let error as NSError {             logError("[AudioSessionManager] Unable to configure RTCAudioSession with error: \(error.localizedDescription)")         }         session.unlockForConfiguration()     }          private func overrideOutputPortIfNeeded() {         DispatchQueue.main.async {             guard let currentOutputType = self.session.currentRoute.outputs.first?.portType else { return }                      self.session.lockForConfiguration()             let shouldOverride = [.builtInReceiver, .builtInSpeaker].contains(currentOutputType)             logDebug("[AudioSessionManager] Should override output to speaker? \(shouldOverride)")             if shouldOverride {                 do {                     try self.session.overrideOutputAudioPort(.speaker)                 } catch let error as NSError {                     logError("[AudioSessionManager] Unable to override output to Speaker: \(error.localizedDescription)")                 }             }             self.session.unlockForConfiguration()         }     } Any help appreciated, Thansk!
Posted Last updated
.
Post not yet marked as solved
1 Replies
523 Views
If you create a CallKit extension with Xcode 15 beta, then add some logging to the template code that gets created and run it on an iOS 17.3 beta phone the logging clearly shows that the OS is running the extension twice when the user turns on the extension in Settings. Run it on any device with < iOS 17 and its only invoked once, as it should be. However, not only does the OS run it twice, but based on the logging the two invocations are in parallel, not serial, suggesting two CallDirectoryHandler instances are being created and run simultaneously.
Posted
by mungbeans.
Last updated
.