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

85 Posts
Sort by:
Post not yet marked as solved
3 Replies
1.4k Views
From iOS 14.3, WKWebView has full support for WebRTC. I was able to get the voice call to work. Unfortunately, I ran into a blocking issue when integrating CallKit. Basically CallKit breaks getUserMedia JavaScript call. I believe it's because CallKit gives the calling process exclusive access to the microphone, but WKWebView renderer runs in a separate process. Is there a solution to this problem? The reason I'm implementing the feature on top of webview instead of native WebRTC SDK is due to the size of the SDK. It adds 10M to the app size and our app is already too big.
Posted
by
Post not yet marked as solved
3 Replies
1.9k Views
I took delivery of my first M1 Mac (iMac running Big Sur 11.4) and with great anticipation installed my iOS VoIP App from the AppStore. I was greatly disappointed to see that There were no VoIP Pushes to start an incoming call Callkit does not seem to work so I get no Audio. Am I missing something? Is there some permissions or configuration I might need to set? Or is it just that Callkit and Pushkit don't work even though it states on developer.apple.com that they are supported on macOS 10.15+ Any advice or guidance greatly appreciated. Very disappointed :-(
Posted
by
Post not yet marked as solved
1 Replies
594 Views
iOS Deployment Target 12.0. I want to used 'CTCallCenter' from CoreTelephony , xcode told me 'CTCallCenter' was deprecated in iOS 10.0: Replaced by CXCallObserver from CallKit.framework. but china prohibited to use the CallKit.framework. i just want to obtaining the Call Status, no phone UI, no VoIP. so i want to know how can i do
Posted
by
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
by
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
Post not yet marked as solved
4 Replies
2.3k 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
Post not yet marked as solved
1 Replies
1.2k Views
I'm using Flutter with the flutter_callkit_voximplant plugin. On iOS 16 devices, CallKit closes after 60 seconds. In previous versions of iOS (14, 15), it could be displayed for 90 seconds, and then we closed it by ourselves. We have tried other packages for CallKit, but they still have the same issue. Have anyone faced the same issue and knows how to bypass it? Logs that we get when CallKit is finished flutter: [[FlutterCallKit.INFO](http://fluttercallkit.info/)] FCXProvider > executeTransaction flutter: [[FlutterCallKit.INFO](http://fluttercallkit.info/)] FCXTransaction > getActions flutter: [[FlutterCallKit.INFO](http://fluttercallkit.info/)] FCXProvider > FCXEndCallAction flutter: [[FlutterCallKit.INFO](http://fluttercallkit.info/)] FCXProvider > reportCallEnded flutter: [[FlutterCallKit.INFO](http://fluttercallkit.info/)] FCXEndCallAction > fulfill flutter: [[FlutterCallKit.INFO](http://fluttercallkit.info/)] FCXCallObserver > callChanged I assume, that we are getting declined events from the system. I've removed handling of declined events, but CallKit is still closed after 60 seconds. So, I think, we are getting declined events from the system, and the system closes callKit on the decline even if we haven’t told so. Our logs: FlutterCallKit.performEndCallAction has been called New Call Kit VoIP messages action = VoipAction.declined has been received
Posted
by
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
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
by
Post not yet marked as solved
2 Replies
1.5k Views
According to SpeakerBox sample code, the Watch App should register for receiving the PushKit notifications like so: let pushRegistry = PKPushRegistry(queue: DispatchQueue.main) pushRegistry.delegate = self pushRegistry.desiredPushTypes = [.voIP] This would then cause a delegate method to be called with a token: func pushRegistry(_ registry: PKPushRegistry, didUpdate pushCredentials: PKPushCredentials, for type: PKPushType) { } That, however, never happens. I've already have the required entitlement and this exact same logic works fine on the main iOS app, however, in the companion watchOS app, it does nothing. What am I missing here? Also, since this is not a standalone watchOS app, it doesn't really make sense that it would have its own pushKit token. Isn't there a way to notify the watch about an incoming call using the same pushKit token received on the phone? Thanks in advance,
Posted
by
Post marked as solved
3 Replies
771 Views
Hi! On iOS 16 CallKit for some reason will not ring over 60s. func reportNewIncomingCall(with UUID: UUID, update: CXCallUpdate, completion: @escaping (Error?) -> Void) After receiving a VoIP call push, I have reported it as soon as possibile. Expected result: Will ring always. Actual result: Stop after 60s
Posted
by
Post not yet marked as solved
1 Replies
938 Views
We're currently trying to develop an Apple Watch companion app for our iOS app using the new WatchOS 9 which has the VoIP call capabilities. Is there a way to mirror VoIP notifications similarly to push notifications between the WatchOS app and iOS app? Essentially we'd like to be able to send a VoIP notification to the iOS app and have the answer/decline call screen show up in both the iPhone and Apple Watch. Currently when we send a VoIP notification to the iOS app, the Apple Watch does not receive anything. Push notifications and local notifications work just fine.
Posted
by
Post not yet marked as solved
0 Replies
444 Views
Hello. I create mobile app and i need detect phone number, when my app was open from Calls app. As in the same calls-app, we click on item in call history, then needed app was open and call initiated automatic. I think, that i need to use Linking in react-native or DeepLink example from firebase. But i can't get phone number.
Posted
by
Post not yet marked as solved
0 Replies
637 Views
It is a kind of skype application. When the app goes background, after 15/20 mins when trying to call anyone of the user's extension using call functionality, I can hear the message "user is not available". I have used SIP.js and free switch for this call functionality and also i am using background timer for android and VOIP push notification for IOS. I want my app to work eventhough it was killed and also till logout. registerGlobals(); const userAgent = new UserAgent( this.getUserAgentOptions(extension, password) ); console.log("!!! SIP initiaing useragent.start"); userAgent.start().then(() => { console.log("!!! SIP inside useragent.start"); const registerer = new Registerer(userAgent, { expires: 120, refreshFrequency: 95, logConfiguration: true, }); registerer.register(); // backgroundsync BackgroundTimer.runBackgroundTimer(() => { console.log("$$$ background timer before$$$"); this.isBackgroundSyncStarted = true; // this.loadData(true); registerer.register(); // code that will be called every 3 seconds console.log("$$$ background timer after$$$"); }, 20 * 1000); if(Platform.OS == "ios"){ BackgroundTimer.start(); } console.log("!!! SIP registerer registered"); });
Posted
by
Post not yet marked as solved
0 Replies
495 Views
Hi I'm trying to wake up the app (when closed or in background mode) when user answers a CallKit incoming call. I've overloaded the func provider(_ provider: CXProvider, perform action: CXAnswerCallAction) and it is always called but it doesn't start or enter the app. Any idea? Thanks
Posted
by
Post not yet marked as solved
0 Replies
404 Views
Make an outgoing call from VoIP Application and wait until call is connected. Put application in background and try to make a GSM outgoing call After step 2, "Call Failed" dialog appears and both the VoIP app call and the outgoing GSM calls are disconnected
  
This issue got fixed with passing dateConnected parameter as null [provider.ReportConnectedOutgoingCall(new NSUuid(call.UUID), null)]. In case of issue reproducible, provider.ReportConnectedOutgoingCall's dateConnected parameter is supplied like  provider.ReportConnectedOutgoingCall(new NSUuid(call.UUID), Tools.ConvertDateTimeToNSDate(call.ConnectedOn)); 
 
We are not able to identify how passing dateConnected parameter as null is fixing this issue. We could not able to find any reference. Please help on this detail..
Posted
by
Post not yet marked as solved
0 Replies
457 Views
Hi Team, We are facing an issue with AVRoutePickerView, Bluetooth to Earpiece switching during in-call. This issue is not occurring in iOS 14 and below. When the VOIP call is connected, the user switches the audio mode from Bluetooth to Earpiece and it's not switching in iOS 15 and above. We have added the Category options like AllowBluetoothA2DP for fixing some other issues. Since then Bluetooth to Earpiece switching is not happening. But same code is working fine in iOS 14 and below. Could you please provide solution for this issue or share us the cause of this issue. May help us to investigate this further. Code: Xamarin iOS /*Initialiser*/ AVAudioSessionCategory category = AVAudioSessionCategory.SoloAmbient; AVAudioSessionCategoryOptions options = 0; AVAudioSessionPortOverride port = AVAudioSessionPortOverride.None; NSString mode = AVAudioSession.ModeDefault; /*When VOIP call gets connected it will be true*/ if (m_active) { mode = AVAudioSession.ModeVoiceChat; category = AVAudioSessionCategory.PlayAndRecord; options = AVAudioSessionCategoryOptions.AllowBluetooth; } /*Setting mode and category*/ AVAudioSession.SharedInstance().SetMode(mode, out err); AVAudioSession.SharedInstance().SetCategory(category, options | AVAudioSessionCategoryOptions.DuckOthers | AVAudioSessionCategoryOptions.AllowBluetoothA2DP); AVAudioSession.SharedInstance().OverrideOutputAudioPort(port, out err); During the call, we are changing mode, category, and options, We are using CallKit to manage the calls, Our application call will be similar to VOIP calls.
Posted
by
Post not yet marked as solved
3 Replies
1k Views
In code: thread Queue: shared_tcpConnWorkQueue   libsp.dylib`spd_checkin_socket.cold.1:      0x242276464 &lt;+0&gt;:  adrp   x8, 137736      0x242276468 &lt;+4&gt;:  adrp   x9, 0      0x24227646c &lt;+8&gt;:  add    x9, x9, #0xa3f            ; "Linked against modern SDK, VOIP socket will not wake. Use Local Push Connectivity instead"      0x242276470 &lt;+12&gt;: str    x9, [x8, #0x390] 0x242276474 &lt;+16&gt;: brk    #0x1 -&gt; EXC_BREAKPOINT (code=1, subcode=0x242276474) DeviceLogs: Application Specific Information: Linked against modern SDK, VOIP socket will not wake. Use Local Push Connectivity instead   Thread 3 name:   Dispatch queue: shared_tcpConnWorkQueue Thread 3 Crashed: 0   libsp.dylib                          0x216566474 spd_checkin_socket.cold.1 + 16 1   libsp.dylib                          0x2165654c0 spd_checkin_socket + 896 2   CFNetwork                            0x1b4230ef0 0x1b40f2000 + 1306352 3   CFNetwork                            0x1b4232bcc 0x1b40f2000 + 1313740 4   CFNetwork                            0x1b42351e0 0x1b40f2000 + 1323488 5   CFNetwork                            0x1b42343a0 0x1b40f2000 + 1319840 6   libdispatch.dylib                    0x1b9e61850 _dispatch_call_block_and_release + 24 7   libdispatch.dylib                    0x1b9e627c8 _dispatch_client_callout + 16 8   libdispatch.dylib                    0x1b9e3d854 _dispatch_lane_serial_drain$VARIANT$armv81 + 604 9   libdispatch.dylib                    0x1b9e3e2e4 _dispatch_lane_invoke$VARIANT$armv81 + 380 10  libdispatch.dylib                    0x1b9e48000 _dispatch_workloop_worker_thread + 612 11  libsystem_pthread.dylib              0x1fa8e2b50 _pthread_wqthread + 284 12  libsystem_pthread.dylib              0x1fa8e267c start_wqthread + 8 I think it is due to voip socket issue. But not getting the point exactly. As am new to ios Development so do not have much idea. Looking forward for guidance. Thanks in advance!
Posted
by
Post not yet marked as solved
1 Replies
433 Views
I have an App that is part of a VoIP PBX system but which is NOT a VoIP App. It acts like a remote control that allow you to forward calls to our VoIP PBX to your cellular phone, or even setup calls to internal extensions all by using the Cellular network. One of the features we want to implement is to indicate to other users on our VoIP PBX system that someone using our App is in an active call using the cellular network. We managed to make that work, but only whilst the App is in the foreground. We are now struggling to find proper ways to activate a little bit of code in our App that will relay the Phone App state (RINGING, OFFHOOK, INCALL, etc...) to our VoIP PBX system. We are not a VoIP application and as such cannot utilise CallKit, and from what I understand, we cannot use PushKit anymore without using CallKit because people were abusing it to keep running their App in the background and thus reducing battery life. (Which I fully comprehend). But our app does not need to be active in the background and isn't a VoIP App, we only need it to wake up when the Phone App state changes and then do it's small networking task. So, can this actually be done properly? PS: To ensure the privacy of the user, the user needs to enable this feature him/herself. It is not enabled by default and can be switched off by the user as well.
Posted
by
Post not yet marked as solved
0 Replies
570 Views
Hello, I am trying to add a Call Directory extension to my application, but the extension runs out of memory immediately when launched. I have an empty CallDirectoryHandler class generated by Xcode, which looks like this: import Foundation import CallKit class CallDirectoryHandler: CXCallDirectoryProvider { override func beginRequest(with context: CXCallDirectoryExtensionContext) { context.delegate = self context.completeRequest() } } extension CallDirectoryHandler: CXCallDirectoryExtensionContextDelegate { func requestFailed(for extensionContext: CXCallDirectoryExtensionContext, withError error: Error) { } } My breakpoint inside of beginRequest never hits, and the stacktrace doesn't give me any clues. I have a small example project that loads 1 million fake phone numbers into CallKit which only uses 2MB of memory in the app extension. I'm not sure what else I can do to limit the memory usage in my extension, does anyone have any idea what is going on?
Posted
by